Закон Амдала, или почему не всё параллелится.
Представьте, что вы пытаетесь ускорить приготовление борща, привлекая больше поваров. Звучит логично – чем больше рук, тем быстрее, верно? Не совсем! И именно об этом нам рассказывает закон Амдала.
В 1967 году Джин Амдал сформулировал то, что сейчас считается одним из фундаментальных законов компьютерной архитектуры. Суть проста: если у вас есть задача, которую вы пытаетесь распараллелить, максимальное ускорение всегда будет ограничено той частью, которую нельзя выполнить параллельно.
Если чуть более занудно, то он описывает теоретический предел ускорения выполнения задачи при параллелизации её частей. Суть закона заключается в том, что ускорение ограничено долей последовательного выполнения кода. Даже если некоторые части программы можно выполнить параллельно, всё равно существуют участки, которые необходимо выполнить последовательно, независимо от количества доступных процессоров.
Вернёмся к борщу. Некоторые операции можно распараллелить (например, нарезка овощей), но есть те, которые должны выполняться строго последовательно (варка: мясной бульон и т.д.). Сколько бы поваров вы ни добавили, борщ не сварится быстрее определённого времени из-за этих последовательных операций. Тут вы меня поправите, мол, можно заранее заварить бульон, так, например, поступают при промышленной готовке плова, когда заранее готовят зирвак. Но это тоже время.
То же самое в программировании — даже если у вас есть 128 ядер, программа не станет работать в 128 раз быстрее. Всё упирается в ту самую последовательную часть, которую никак не распараллелить.
Вспомнил я это не случайно. Необходимо было консультировать одного молодого человека с легаси-проектом на Java 6. По памяти вспомнил формулу закона Амдала и книжку, в которой впервые к месту прочитал объяснение и сразу знакомился с применением этого закона:
Сейчас, благодаря издательству «Питер», книжка доступна на русском языке:
Взял ее в руки, и прям накатила ностальгия. Начал читать, и прям поперли флешбэки, чуть позже вернусь к этой книге еще.