CUDA: Сколько одновременных потоков в целом?
У меня есть GeForce GTX 580, и я хочу сделать выражение об общем количестве потоков, которые могут (в идеале) выполняться параллельно, для сравнения с 2 или 4 многоядерными процессорами.
deviceQuery дает мне следующую возможную информацию:
CUDA Capability Major/Minor version number: 2.0
(16) Multiprocessors x (32) CUDA Cores/MP: 512 CUDA
Maximum number of threads per block: 1024
Я думаю, я слышал, что каждое ядро CUDA может работать параллельно, и что warp - 32 потока. Правильно ли было бы сказать, что карта может запускать 512 * 32 = 16384 потоков параллельно, или я ухожу, а ядра CUDA как-то не работают параллельно?
Ответы
Ответ 1
GTX 580 может иметь одновременно 16 * 48 параллельных перекосов (по 32 потока). Это 16 мультипроцессоров (SM) * 48 резидентных перекосов на SM * 32 потока на warp = 24,576 потоков.
Не путайте concurrency и пропускную способность. Число, указанное выше, - это максимальное количество потоков, ресурсы которых могут храниться на кристалле одновременно - число, которое может быть резидентным. В терминах CUDA мы также называем это максимальное заполнение. Аппаратные средства переключаются между последовательностями, чтобы помочь покрыть или "скрыть" (большую) задержку доступа к памяти, а также (малую) задержку арифметических конвейеров.
В то время как каждый SM может иметь 48 резидентных перекосов, он может выдавать команды только с небольшого числа (в среднем от 1 до 2 для GTX 580, но это зависит от комбинации команд программы) перекосов в каждом такте.
Таким образом, вам, вероятно, лучше сравнивать пропускную способность, которая определяется доступными исполнительными модулями и как аппаратное обеспечение может выполнять многопроцессорную обработку. На GTX580 имеется 512 исполнительных блоков FMA, но также и целые единицы, специальные функциональные блоки, модули инструкций памяти и т.д., Которые могут быть дважды выпущены (например, выдавать независимые инструкции из 2-х битпов одновременно) в различных комбинациях.
Учитывая все вышеизложенное, слишком сложно, поэтому большинство людей сравнивают две метрики:
- Peak GFLOP/s (для GTX 580 - 512 единиц FMA * 2 флопа на FMA * 1544e6 циклов/сек = 1581.1 GFLOP/с (одиночная точность))
- Измеренная пропускная способность приложения, которое вас интересует.
Самое важное сравнение - это всегда измерять время настенных часов на реальном приложении.
Ответ 2
Есть определенные ловушки, с которыми вы можете столкнуться, сравнивая их с 2 или 4-ядерными процессорами:
-
Количество параллельных потоков не соответствует числу потоков, которые фактически выполняются параллельно. Конечно, вы можете запускать 24576 потоков одновременно на GTX 580, но оптимальное значение в большинстве случаев ниже.
-
2 или 4-ядерный процессор может иметь произвольное количество параллельных потоков! Как и в случае с графическим процессором, с какой-то точки добавление большего количества потоков не поможет или даже может замедлить работу.
-
"Ядро CUDA" - это единое скалярное процессорное устройство, а ядро центрального процессора - это, как правило, более крупная вещь, содержащая, например, 4-мерный SIMD-блок. Чтобы сравнить яблоки с яблоками, вы должны умножить количество объявленных ядер процессора на 4, чтобы соответствовать тому, что NVIDIA вызывает ядро.
-
Процессор поддерживает гиперпоточность, что позволяет одному ядру обрабатывать 2 потока одновременно легким способом. Из-за этого операционная система может фактически видеть в 2 раза больше "логических ядер", чем аппаратные ядра.
Подводя итог: для справедливого сравнения ваш 4-ядерный процессор может фактически запускать 32 "скалярные потоки" одновременно из-за SIMD и гиперпотока.
Ответ 3
Я понимаю, что уже немного поздно, но я все равно решил помочь. Со страницы 10 документа архитектуры CUDA Fermi :
Каждый SM имеет два планировщики деформаций и два блока отправки инструкций, позволяющие одновременно создавать и выполнять два деформирования.
Для меня это означает, что каждый SM может иметь 2 * 32 = 64 потоков, работающих одновременно. Я не знаю, означает ли это, что GPU может иметь в общей сложности 16 * 64 = 1024 потоков, работающих одновременно.