Что такое закон Амдала?
Закон Амдала, сформулированный архитектором вычислительных систем Джином Амдалом в 1967 году, предсказывает максимально возможное теоретическое ускорение задачи, если распараллелить удаётся лишь её часть. Это один из фундаментальных принципов параллельных вычислений, который помогает инженерам понять, стоит ли добавлять процессоры, ядра или потоки. Главная идея проста: последовательная (нераспараллеливаемая) часть программы в конечном счёте ограничивает скорость её работы — сколько бы ресурсов вы ни бросили на параллельную часть.
Как пользоваться калькулятором
Введите два значения: долю параллельного кода в процентах (часть работы, которую можно распределить между процессорами) и ускорение параллельной части — обычно это число процессоров или ядер, на которых она выполняется. Калькулятор покажет общее ускорение, максимально возможное теоретическое ускорение при бесконечном числе процессоров, а также эффективность распараллеливания.
Разбор формулы
Формула выглядит так:
$$\text{Ускорение} = \dfrac{1}{(1 - p) + \dfrac{p}{s}}$$где \(p\) — доля параллельного кода (от 0 до 1), а \(s\) — ускорение, применяемое к этой части. Слагаемое \((1 - p)\) — это последовательная часть, которую ускорить нельзя. Когда \(s\) стремится к бесконечности, ускорение приближается к значению \(\dfrac{1}{1 - p}\) — это и есть жёсткий предел, заданный последовательной частью программы.
Пример расчёта
Допустим, 90% программы поддаётся распараллеливанию (\(p = 0{,}9\)), и вы запускаете её на 8 процессорах (\(s = 8\)). Тогда знаменатель равен
$$(1 - 0{,}9) + \dfrac{0{,}9}{8} = 0{,}1 + 0{,}1125 = 0{,}2125$$а ускорение составит
$$\dfrac{1}{0{,}2125} \approx 4{,}71\times$$Даже при бесконечном числе процессоров максимальное ускорение будет лишь \(\dfrac{1}{0{,}1} = 10\times\). Это наглядно показывает, как всего 10% последовательного кода ограничивают производительность.
Частые вопросы
Почему удвоение числа процессоров не удваивает скорость? Потому что последовательная часть выполняется с той же скоростью независимо от количества процессоров, и в итоге именно её время становится главным узким местом.
Что такое эффективность распараллеливания? Это ускорение, делённое на число процессоров и выраженное в процентах — показатель того, насколько рационально используются добавленные ресурсы.
Чем закон Амдала отличается от закона Густафсона? Закон Густафсона исходит из того, что размер задачи растёт вместе с числом процессоров, и потому часто даёт более оптимистичную картину, чем модель фиксированной нагрузки Амдала.
Интерпретация результатов
Значение ускорения показывает, во сколько раз быстрее программа работает с \(s\) процессорами по сравнению с запуском на одном процессоре. Ускорение в 4× означает, что параллелизованная рабочая нагрузка завершается в четверть исходного времени. Поскольку закон Амдала предполагает фиксированный размер задачи, ускорение ограничено серийной долей \(1-p\), которую ускорить нельзя.
Потолок бесконечного процессора, \(1/(1-p)\), — это максимальное ускорение, достижимое с неограниченным оборудованием. Например, если 95% работы выполняется параллельно, потолок составляет \(1/(1-0.95) = 20\times\); даже миллион ядер не может превысить 20×. Это самое важное число для планирования: оно устанавливает верхний предел любых инвестиций в дополнительные процессоры.
Эффективность параллелизма измеряет, насколько хорошо используются процессоры, и определяется как ускорение, делённое на число процессоров, \(\text{эффективность} = \text{ускорение}/s\). Эффективность 1.0 (100%) — это идеальное линейное масштабирование; на практике она снижается при добавлении ядер. Например, 90% параллельного кода на 8 ядрах даёт ускорение 4.71×, поэтому эффективность составляет \(4.71/8 \approx 59\%\) — каждое добавленное ядро выполняет всё меньше полезной работы.
Добавление процессоров перестаёт быть целесообразным, когда предельное ускорение на дополнительное ядро становится малым относительно его стоимости и когда эффективность падает ниже приемлемого порога (часто 50–70% на практике). Как только ускорение приближается к своему потолку, дальнейшее увеличение оборудования даёт почти ничего. Чтобы поднять сам потолок, необходимо уменьшить серийную долю — путём параллелизации большей части алгоритма или снижения синхронизации и операций ввода-вывода — а не покупкой дополнительных ядер. Также следует отметить, что закон Амдала не учитывает затраты на обмен данными и координацию, поэтому реальные ускорения обычно ниже этих теоретических максимумов.