Подключиться через MCP →

Введите расчет

Математическая формула

Реклама

Результатов

Итоговое ускорение
3,077×
раз быстрее исходного варианта
Theoretical maximum speedup (s → ∞) 10×
Эффективность распараллеливания 76,92%

Что такое закон Амдала?

Закон Амдала, сформулированный компьютерным архитектором Джином Амдалом в 1967 году, позволяет оценить максимально возможное теоретическое ускорение задачи в том случае, когда распараллелить удаётся лишь её часть. Это один из фундаментальных принципов параллельных вычислений: он помогает инженерам трезво оценивать ожидания ещё до того, как вкладываться в дополнительные процессоры, ядра или потоки.

Схема, показывающая задачу, разделённую на последовательную и параллельную части, обрабатываемые на нескольких процессорах
Закон Амдала делит программу на последовательную часть и параллельную, которую можно распределить по процессорам.

Как пользоваться калькулятором

Введите два значения: долю параллельного кода (p) — часть программы (от 0 до 1), которую можно выполнять параллельно, — и коэффициент ускорения (s), то есть, как правило, количество процессоров или ядер, задействованных для этой параллельной части. Калькулятор покажет итоговое ускорение, его теоретический предел и эффективность распараллеливания.

Разбор формулы

Формула выглядит так: $$\text{Ускорение} = \dfrac{1}{(1 - p) + \dfrac{p}{s}}$$ Слагаемое \((1 - p)\) — это последовательная часть программы, которую ускорить невозможно в принципе. Когда \(s\) становится очень большим, отношение \(p/s\) стремится к нулю, поэтому ускорение упирается в потолок \(1/(1 - p)\). Именно поэтому программа, распараллеленная на 90%, никогда не ускорится больше чем в 10 раз — сколько бы процессоров вы ни добавили.

Кривая ускорения в зависимости от числа процессоров, выходящая на максимум
Ускорение растёт с числом процессоров, но выходит на максимум, заданный последовательной долей.

Пример расчёта

Допустим, 90% программы поддаётся распараллеливанию (\(p = 0{,}9\)), и вы используете 4 процессора (\(s = 4\)). Тогда знаменатель $$(1 - 0{,}9) + \frac{0{,}9}{4} = 0{,}1 + 0{,}225 = 0{,}325$$ Ускорение $$\frac{1}{0{,}325} \approx 3{,}08\times$$ Максимально возможное ускорение составляет \(1 / 0{,}1 = 10\times\), а эффективность равна \(3{,}08 / 4 \approx 76{,}9\%\).

Частые вопросы

Почему каждый новый процессор приносит всё меньше пользы? Потому что узким местом становится последовательная часть. Как только она начинает доминировать, дополнительные процессоры почти не дают прироста.

Что такое эффективность распараллеливания? Это ускорение, делённое на число процессоров и выраженное в процентах, — показатель того, насколько полно используется каждый процессор.

Чем закон Амдала отличается от закона Густафсона? Закон Амдала исходит из фиксированного размера задачи, тогда как закон Густафсона предполагает, что объём задачи растёт вместе с числом процессоров, и потому даёт более оптимистичные оценки.

Интерпретация результата

Общее ускорение — это то, что вы фактически получаете при количестве процессоров \(s\), которое вы указали — например, результат 4,71× означает, что параллельная программа работает примерно в 4,71 раза быстрее, чем однопроцессорная версия. Максимальное ускорение, \(1/(1-p)\), — это абсолютный потолок, к которому вы приближались бы при бесконечном числе процессоров. Разница между ними показывает, сколько места осталось: если ваше общее ускорение уже близко к максимуму, добавление оборудования едва поможет.

Эффективность отвечает на вопрос: «Насколько хорошо я использую процессоры, за которые я плачу?» Эффективность, близкая к 100%, означает, что каждый процессор вносит почти полную единицу ускорения — отличное использование ресурсов. Низкая эффективность (скажем, менее 30%) означает, что большинство процессоров простаивают или ожидают последовательной части, поэтому вы платите за оборудование, которое выполняет мало полезной работы.

Доля последовательного кода \(1-p\) — это решающий предел. Даже небольшая доля последовательного кода сильно ограничивает производительность: при \(p=0,95\) потолок составляет всего 20×, поэтому примерно после 16–32 процессоров каждый новый процессор практически ничего не добавляет. Практическое правило: прекратите добавлять процессоры, когда эффективность упадёт ниже вашего приемлемого порога (часто 50–70% для работы, чувствительной к стоимости), потому что после этого момента вы тратите деньги на незначительные улучшения. Чтобы поднять потолок выше, вы должны снизить саму долю последовательного кода — алгоритмические изменения, увеличивающие \(p\), обычно дают гораздо лучший результат, чем просто добавление ядер.

Основные термины и переменные

  • Доля параллельного кода (\(p\)) — доля работы программы, которая может быть выполнена параллельно, выраженная как десятичная дробь между 0 и 1. Значение 0,9 означает, что 90% рабочей нагрузки может быть распределено между процессорами.
  • Доля последовательного кода (\(1-p\)) — часть, которая должна выполняться последовательно на одном процессоре и не может быть ускорена параллелизацией. Эта доля устанавливает жёсткий верхний предел общего ускорения.
  • Ускорение параллельной части (\(s\)) — коэффициент, на который ускоряется параллелизуемая часть, обычно равный количеству применённых к ней процессоров или ядер.
  • Общее ускорение — отношение времени выполнения на одном процессоре к времени параллельного выполнения, \(1/\big((1-p)+p/s\big)\). Это реальное улучшение производительности.
  • Максимальное ускорение — теоретический предел \(1/(1-p)\), достигаемый при неограниченном росте \(s\), определяемый исключительно долей последовательного кода.
  • Параллельная эффективность — общее ускорение, делённое на количество процессоров, \(\text{Ускорение}/s\), выраженное в процентах; это мера того, насколько эффективно используется каждый процессор.
Последнее обновление: