CUDA: Сколько всего параллельных потоков? - PullRequest
42 голосов
/ 27 июня 2011

У меня есть 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 может параллельно выполнять деформацию и что деформация состоит из 32 потоков.Правильно ли будет сказать, что карта может работать параллельно 512 * 32 = 16384 потоков, или я не в порядке, и ядра CUDA как-то не работают в параллель?

Ответы [ 3 ]

57 голосов
/ 27 июня 2011

GTX 580 может иметь одновременно 16 * 48 одновременных деформаций (по 32 потока).Это 16 мультипроцессоров (SM) * 48 резидентных деформаций на SM * 32 потока на деформацию = 24 576 потоков.

Не путайте параллелизм и пропускную способность.Число выше - это максимальное количество потоков, ресурсы которых могут храниться на кристалле одновременно, - число, которое может быть резидентным .В терминах CUDA мы также называем эту максимальную занятость .Аппаратное обеспечение постоянно переключается между перекосами, чтобы помочь скрыть или «скрыть» (большую) задержку обращений к памяти, а также (небольшую) задержку арифметических конвейеров.

Хотя каждый SM может иметь 48 резидентных деформаций, он может выдавать инструкции только из небольшого числа (в среднем от 1 до 2 для GTX 580, но это зависит от комбинации команд программы) деформаций в каждом такте,

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

Однако принять во внимание все вышесказанное слишком сложно, поэтому большинство людей сравнивают по двум показателям:

  1. Пик GFLOP / с (который для GTX 580 составляет 512 единиц FMA *2 флопа в FMA * 1544e6 циклов / с = 1581,1 GFLOP / с (одинарная точность)
  2. Измеренная пропускная способность в интересующем вас приложении.

Наиболее важныйСравнение всегда измеряется временем настенных часов в реальном приложении.

9 голосов
/ 27 июня 2011

Существуют определенные ловушки, в которые вы можете попасть, сравнивая их с 2-х или 4-х ядерными процессорами:

  • Количество параллельных потоков не соответствует количеству потоков, которые фактически работают параллельно. Конечно, вы можете запустить 24576 потоков одновременно на GTX 580, но оптимальное значение в большинстве случаев ниже.

  • 2 или 4-ядерный ЦП может иметь произвольное количество одновременных потоков! Как и в случае с графическим процессором, добавление дополнительных потоков в какой-то момент не поможет или даже может замедлиться.

  • «Ядро CUDA» - это один скалярный процессор, в то время как ядро ​​ЦП, как правило, больше, содержит, например, SIMD-модуль шириной 4. Чтобы сравнить яблоки с яблоками, вы должны умножить количество объявленных ядер ЦП на 4, чтобы соответствовать тому, что NVIDIA называет ядром.

  • CPU поддерживает гиперпоточность, которая позволяет одному ядру обрабатывать 2 потока одновременно легким способом. Из-за этого операционная система может фактически видеть в 2 раза больше «логических ядер», чем аппаратные ядра.

Подводя итог: для честного сравнения ваш 4-ядерный ЦП может фактически одновременно запускать 32 "скалярных потока" из-за SIMD и гиперпоточности.

0 голосов
/ 07 апреля 2017

Я понимаю, что уже немного поздно, но я решила, что все равно помогу. Со страницы 10 документа архитектуры CUDA Fermi :

Каждый SM имеет два планировщики деформаций и два блока отправки команд, позволяющие одновременно создавать и выполнять два деформации.

Для меня это означает, что каждый SM может иметь 2 * 32 = 64 потоков, работающих одновременно. Я не знаю, означает ли это, что GPU может иметь в общей сложности 16 * 64 = 1024 потоков, работающих одновременно.

...