Закон Амдала и ГПУ
У меня есть пара сомнений относительно применения закона Амдала в отношении графических процессоров. Например, у меня есть код ядра, который я запустил с несколькими потоками, скажем, N. Итак, в законе amdahl количество процессоров будет равно N, верно? Кроме того, для любого программирования CUDA, использующего большое количество потоков, безопасно ли для меня предположить, что закон Амдала уменьшен до 1/(1-p), где p обозначает параллельный код? Спасибо
2 ответа
Например, у меня есть код ядра, который я запустил с несколькими потоками, скажем, N. Итак, в законе amdahl количество процессоров будет равно N, верно?
Не совсем. GPU не имеет столько физических ядер (K), сколько число потоков, которые вы можете запустить (N) (обычно K составляет около 103, N находится в диапазоне 104 - 106). Однако значительная часть времени ядра (обычно) тратится только на ожидание чтения / записи данных из / в глобальную память, поэтому одно ядро может беспрепятственно обрабатывать несколько потоков. Таким образом, устройство может обрабатывать до N0 потоков, не мешая друг другу, где N0 обычно в несколько раз больше K, но на самом деле зависит от вашей функции ядра.
На мой взгляд, лучший способ определить это значение N0 - это экспериментально измерить производительность вашего приложения, а затем использовать эти данные для соответствия параметрам закона Амдала:)
Кроме того, для любого программирования CUDA, использующего большое количество потоков, безопасно ли для меня предположить, что закон Амдала уменьшен до 1/(1-p), где p обозначает параллельный код?
Это предположение в основном означает, что вы пренебрегаете временем для параллельной части вашего кода (оно выполняется бесконечно быстро) и учитываете только время для последовательной части.
Например, если вы вычислите сумму двух 100-элементных векторов на графическом процессоре, то инициализация устройства, копирование данных, издержки запуска ядра и т. Д. (Последовательная часть) занимает намного больше времени, чем выполнение ядра (параллельная часть). Однако обычно это не так.
Кроме того, отдельное ядро графического процессора не имеет такой же производительности, как ядро процессора, поэтому вам следует выполнить некоторое масштабирование, что соответствует закону Amdah'l. 1 / [(1-p) + k*p/N]
(на самом простом, k = Frequency(CPU) / Frequency(GPU)
иногда k увеличивается еще больше, чтобы учесть архитектурные различия, например, в ядре ЦП, имеющем SIMD-блок).
Я также мог бы возразить против буквального применения закона Амдала к реальным системам. Конечно, он показывает общую тенденцию, но он не охватывает некоторые нетривиальные процессы.
Во-первых, закон Амдала предполагает, что при бесконечном количестве ядер параллельная часть выполняется мгновенно. Это предположение неверно (хотя иногда оно может быть довольно точным). Даже если вы вычислите сумму двух векторов, вы не сможете вычислить ее быстрее, чем требуется для добавления двух байтов. Можно пренебречь этими "квантами" или включить их в последовательную часть алгоритма, но это несколько "ломает" идею.
Как правильно оценить в законе Амдала эффект барьерной синхронизации, критического сечения, атомных операций и т. Д., Насколько мне известно, неразгаданная тайна. Такие операции относятся к параллельной части, но время их выполнения в лучшем случае не зависит от количества потоков и, в худшем случае, является положительно зависимым.
Простой пример: время вещания между вычислительными узлами в кластере ЦП масштабируется как O(log N)
, Некоторая начальная инициализация может занять до O(N)
время.
В простых случаях можно несколько оценить преимущество распараллеливания алгоритма, но (как это часто бывает в CUDA) статические издержки при использовании параллельной обработки могут занять больше времени, чем экономит сама параллельная обработка.
Так что, на мой взгляд, обычно проще написать приложение, измерить его производительность и использовать его для построения кривой Амдала, чем пытаться априори правильно оценить все нюансы алгоритма и аппаратного обеспечения. В случае, когда такие оценки могут быть легко сделаны, они обычно очевидны без каких-либо "законов".
Закон Амдала фактически утверждает, что ускорение меньше или равно этой дроби. Итак, это теоретический максимум, а реальное ускорение будет меньше, чем всегда.