Когда я искал ответ на свой предыдущий вопрос, я наткнулся на статью "Применение закона Амдаля к энергоэффективным вычислениям в эпоху многоядерных компьютеров" (en) (журнал Computer, декабрь 2008 г., стр. 24-31), авторами которой являются Dong Hyuk Woo и Hsien-Hsin S. Lee (Georgia Institute of Technology). Прочитав название, я решил, что статья может быть посвящена поиску метрики или верхней границы теоретической энергоэффективности приложения. Все оказалось не так просто, но я нашел несколько очень интересных идей.
Авторы попытались выяснить, какая из трех возможных процессорных архитектур будет максимально эффективна для параллельных вычислений с точки зрения минимизации потребления энергии. Многоядерные процессоры делятся на три основных типа: 1) Multicore (несколько больших процессорных ядер на одном кристалле), 2) Manycore (значительно большее количество более простых и энергоэффективных ядер) и 3) сочетание одного большого ядра и множества более простых ядер. К первому типу относятся современные 2-, 4- и 6-ядерные процессоры, ко второму - графические процессоры (GPU), а третий тип представляет собой гибрид, когда одно большое ядро, встроено в графический процессор.
В формулах, используемых для описания модели, максимальная потребляемая мощность одного большого ядра приведена к единице, а энергопотребление бездействующего процессора выражено дополнительной переменной k. Для первой архитектуры в традиционную формулу закона Амдаля добавляется новая переменная, используемая в качестве множителя для процента времени последовательной работы, умноженного на число бездействующих ядер (n-1). В результате ряда простых алгебраических преобразований авторы получают формулу для оценки средней потребляемой мощности в ваттах для приложения с параллельной обработкой, использующего n ядер, с указанным процентным соотношением параллельной и последовательной работы. Аналогичная формула выведена для модели Manycore, в которой потребляемая мощность простого ядра приведена к четверти от потребляемой мощности большого ядра. Для гибридной модели при выводе соответствующей формулы делается предположение о том, что одно большое ядро используется для последовательной обработки, а более простые ядра выполняют параллельную работу.
Поскольку для каждой модели теперь известна мера потребляемой мощности в ваттах, авторы могут вычислить производительность на ватт (Производительность/Вт), разделив исходную формулу Амдаля на формулу расчета среднего энергопотребления. Чтобы сравнить три модели между собой, задается лимит мощности, определяющий количество используемых ядер для каждой модели.
Выводы, полученные в результате сравнения моделей с различным количеством ядер и при разном отношении времени параллельной обработки к общему времени выполнения, представляют для нас наибольший интерес. В частности, первый результат показал, что для достижения максимального значения Производительность/Вт в многоядерной модели распараллеливание должно масштабироваться линейно. Если приложение не масштабируется линейно, процессор (модель) будет тратить больше энергии, чем версия для последовательной обработки, поскольку энергопотребление бездействующих дополнительных ядер масштабируется линейно.
А в качестве итогового вывода, наиболее масштабируемой с точки зрения энергопотребления была названа гибридная модель с одним большим ядром и множеством мелких ядер. Архитектура Manycore демонстрирует хорошие показатели при высокой степени параллелизма и низких ограничениях мощности (при меньшем общем количестве ядер), но с увеличением ограничений количество простых ядер увеличивается, а производительность эффективной последовательной обработки - нет. Гибридная модель с одним большим ядром, встроенным на месте нескольких более простых ядер, способно эффективнее обрабатывать последовательные фрагменты нагрузки (по сравнению с несколькими десятками простых ядер, из которых одно работает, а все остальные простаивают).
Читая статью, я сопоставлял описанные модели современных многоядерных процессоров с устройствами, широко представленными на сегодняшнем рынке. Модель Manycore, скорее всего, представлена графическими процессорами (GPU) или акселераторами MIC. Гибридная модель должна выглядеть как комбинация акселератора Manycore и двухъядерного процессора (пока на рынке не появились кристаллы с разными типами ядер). Мне было интересно, к какому типу можно отнести векторные процессоры. Если рассматривать только векторные регистры, можно сказать, что это разновидность модели Manycore. Однако такие регистры являются частью большого ядра, что наводит на мысль о гибридной модели. Возможно, они реализуют второй уровень параллельной обработки, который не учитывается в этих трех моделях.
Статья мне понравилась. Но у меня появилась пара замечаний. Во-первых, параллельная обработка в многоядерной модели может уступать по эффективности эквивалентной последовательной обработке только в одном случае - если последовательный код выполняется на одноядерной системе. Мне показалось, что в статье делается такое допущение, но здесь не все так очевидно. В реальном мире это допущение не работает. Для того чтобы сравнение было максимально точным, мы должны запускать последовательный код также на многоядерном процессоре. В этом случае я готов признать, что при параллельной обработке потребляется меньше энергии.
Предположим, что у нас есть время выполнения, равное 10 единицам времени (назовем эти единицы moops). При выполнении последовательного кода на четырехъядерном процессоре одно ядро работало бы на полной скорости в течение 10 moops, а остальные три ядра в совокупности добавили бы еще 30 moops потребления в режиме бездействия. Если алгоритм распараллеливает 50% нагрузки, мы получим 5 moops потребления энергии на полной мощности для последовательной обработки, 5 moops потребления на полной мощности для параллельной обработки на каждом из четырех ядер, и 15 moops потребления в режиме бездействия. Даже если код распараллелен всего на 10%, мы получим уже 27 moops потребления в режиме бездействия. При любой степени (идеального) параллелизма будет гарантированно потребляться меньше энергии, чем при эквивалентной последовательной обработке на той же системе. Вам не кажется, что здесь пропущено что-то важное?
Я не зря добавил слово "идеального" в конце предыдущего абзаца. При параллельных вычислениях всегда существуют непроизводительные издержки, которые увеличивают время выполнения параллельных участков кода и, следовательно, время потребления энергии на полной мощности (например, для выполнения 50-процентной параллельной части нагрузки может потребоваться 5,4 moops потребления на полной мощности).
Во-вторых, закон Амдаля используется для оценки ускорения. Ускорение - это безразмерное число. То есть я делю время выполнения последовательного кода на время параллельной обработки и получаю просто число, поскольку единицы измерения moops из двух величин при расчете сокращаются. Если при последовательной обработке требуется 10 moops времени, а при параллельной обработке - 6,35 moops, ускорение составляет 1,57X. 1,57 чего? Ускорение представляет собой метрику относительной производительности, но это не то, что я вкладываю в понятие производительности.
Для меня "производительность" является, скорее, абсолютной величиной. Как правило, это некоторое счетное количество, например число транзакций, число операций с плавающей запятой или длина пройденного пути. Она также может рассчитываться за единицу времени, как, например, число транзакций в единицу времени moops, число операций с плавающей запятой в секунду или число километров, пройденных за неделю. Для меня более полезными будут такие метрики, как число транзакций на ватт, число операций с плавающей запятой на ватт или число километров на ватт. Оптимизации, позволяющие повысить производительность или снизить число ватт потребляемой мощности, задают правильное направление на пути к повышению энергоэффективности.
Мне до сих пор непонятно, как значение эффективности ускорения на ватт (или даже ускорения на джоуль - в статье Woo и Lee используется и такая величина) может выступать в качестве абсолютной меры энергоэффективности. Возможно, я копаю слишком глубоко, и эти метрики используются всего лишь для сравнения трех описанных архитектурных моделей (в пределах заданных допущений). В конце концов, возможно, это всего лишь модели.
