Подтвердить что ты не робот

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 как-то не работают параллельно?

4b9b3361

Ответ 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 потоков, работающих одновременно.