Зачем использовать SIMD, если у нас есть GPGPU?

13

Я думал, что этот вопрос лучше обслуживать в CS-части Stack Exchange. Теперь, когда у нас есть GPGPU с такими языками, как CUDA и OpenCL, мультимедийные расширения SIMD (SSE / AVX / NEON) все еще служат цели?

Недавно я прочитал статью о том, как можно использовать инструкции SSE для ускорения сортировки сетей. Я думал, что это было довольно аккуратно, но когда я сказал моему профессору по компьютерным технологиям, он засмеялся и сказал, что запуск подобного кода на GPU разрушит SIMD-версию. Я не сомневаюсь в этом, потому что SSE очень прост, а графические процессоры - это большие высокосложные ускорители с гораздо большим параллелизмом, но это заставило меня задуматься: много ли сценариев, когда мультимедийные расширения SIMD более полезны, чем использование графического процессора?

Если GPGPU делают SIMD избыточным, почему Intel должна увеличить их поддержку SIMD? SSE был 128 бит, теперь это 256 бит с AVX и в следующем году он будет 512 бит. Если GPGPU лучше обрабатывают код с параллелизмом данных, почему Intel продвигает эти расширения SIMD? Они могут быть в состоянии поместить эквивалентные ресурсы (исследования и области) в больший кэш и предсказатель ветвления, таким образом улучшая производительность последовательного порта.

Зачем использовать SIMD вместо GPGPU?

jonfrazen
источник
2
Само по себе задача состоит в том, чтобы снабдить графический процессор достаточным количеством данных, чтобы он был занят. Передача данных между хостом и устройством практически всегда является узким местом. Некоторые операции лучше поддерживаются на процессорах (например, умножение без переноса; см. PCLMULQDQ).
Юхо
2
@Juho Разве новые устройства, такие как APU AMD, не имеют GPU и CPU на одном кристалле? Устраняет ли это узкое место?
Джонфразен
1
Когда все сказано и сделано, векторная инструкция по-прежнему является единственной инструкцией, и стоимость ее планирования и выполнения такая же, как и у любой другой отдельной инструкции. Выполнение заданий на графическом процессоре имеет смысл только тогда, когда выгода превышает стоимость. Также учтите, что вы получаете один SIMD-блок на ядро, но, как правило, только один графический процессор на шасси, и графический процессор на данный момент является общим ресурсом. Это ограничивает количество заданий, которые вы можете запускать на GPU. (Количество ядер постоянно увеличивается, а количество графических процессоров - нет.)
Псевдоним
Intel мало что делает с графическими процессорами (кроме Larrabee / Knights Landing :)), поэтому я думаю, что для них вполне естественно попытаться использовать AVX. Несмотря на то, что интенсивное использование AVX может быть очень производительным, теперь это приводит к пониженной тактовой частоте на их более новых процессорах, поэтому они могут чем-то ограничивать свои возможности.
Нсандерсен

Ответы:

16

Ничто не бесплатно. GPGPUs являются SIMD. Инструкции SIMD на GPGPU имеют тенденцию быть шире, чем инструкции SIMD на CPU. GPGPU, как правило, являются многопоточными (и имеют гораздо больше аппаратных контекстов, чем процессоры). GPGPU оптимизированы для потоковой передачи . Как правило, они выделяют больший процент площади для блоков с плавающей запятой, меньший процент площади для кэширования и меньший процент площади для целочисленной производительности.

Давайте сделаем сравнение. Ядро Intel i7-5960x имеет 8 ядер, каждое с 4-разрядной SIMD (двойной точности), работающей на частоте 3 ГГц (3,5 ГГц с турбонаддувом), кэш-памятью L3 20 МБ, потребляет 356 мм ^ 2 и 140 Вт и стоит 1000 долларов . Итак, 8 * 4 * 3 * 4 = 384 GFlops двойной точности. (Дополнительное 4x связано с тем, что вы можете сделать два слияния-умножения-добавления на векторную дорожку за цикл.) Он может сделать 768 GFlops с одинарной точностью. Это примерно 1,08 DP GFlops / мм ^ 2 и 2,75 DP GFlops / Вт. Также имеется около 57,5 ​​КБ / мм ^ 2 встроенного кеша.

GeForce GTX Titan Black от NVidia имеет 15 SMX, каждая с SIMD-картой двойной точности 32 ширины, с тактовой частотой 890 МГц (турбо 980 МГц), 3,5 М кэш-памяти L1 + L2, потребляет 561 мм ^ 2, 250 Вт и стоит 1000 долларов . Итак, 15 * 32 * .89 * 4 = 1709 GFlops двойной точности. (То же самое 4x из двух слитых-умножений-добавок на векторную дорожку за цикл.) Он может сделать 5126 GFlops одинарной точности. Это примерно 3,05 DP GFlops / мм ^ 2 и 6,8 DP GFlops / Вт. Таким образом, 3x плотность с плавающей запятой DP на единицу площади и 3x КПД мощности с плавающей запятой DP. И обмен? 6,4 КБ / мм ^ 2 встроенного кэша. Примерно в 9 раз меньше, чем у процессора.

Таким образом, основное отличие состоит в том, что графический процессор выбрал баланс площадей, который сильно предпочитает с плавающей запятой (и особенно с плавающей запятой одинарной точности) над кэшем. Даже если игнорировать тот факт, что вам нужно копировать данные между процессором и графическим процессором для выполнения операций ввода-вывода, то насколько хорошо будет работать графический процессор по сравнению с процессором, зависит от программы, которую вы запускаете.

Если у вас есть программа с плавающей запятой для параллельных данных с очень небольшим расхождением в управлении (все векторные линии делают одно и то же в одно и то же время), и ваша программа выполняет потоковую передачу (не может извлечь выгоду из кеширования), тогда GPU будет примерно В 3 раза эффективнее на единицу площади или на ватт. Но если у вас есть какой-либо значительный объем расходящегося контроля, непараллельной работы, или вы могли бы извлечь выгоду из больших структур данных, многократно читаемых, ЦП, вероятно, будет работать лучше.

Блуждающая логика
источник