Cuda: деформация и время выполнения

У меня вопрос по поводу перекосов в GPU.

Я использовал следующую конфигурацию:

  • GeForce 210
  • Способность куда майор / минор: 1,2
  • 2 мультипроцессора, 8 ядер CUDA /MP: 16 ядер CUDA
  • Размер основы: 32

Ниже приведено время работы (я использовал nsight):

block,threads/block : time
--------------------------
1,32 : 5.1
8,32 : 5.4
16,32 : 5.7
32,32 : 8.9
64,32 : 14.8

Деформации (=32 потока) выполняются одновременно, и есть 2 MP. Таким образом, я думал, что максимальная производительность этого процессора составляет 64 потока, но потоки 16*32 работают почти одновременно. Учитывая планировщик деформации, я не могу понять этот результат.

Мои вопросы:

  1. почему потоки 16*32 работают почти так же, как 32 потока?
  2. почему время выполнения 64*32 не в два раза больше 32*32
  3. Я слышал, что глобальный доступ к памяти быстрый, как регистрация. это правильно? (включает 3.5 GPU или дорогой GPU)

2 ответа

Графический процессор представляет собой скрытую архитектуру. Блоки исполнения конвейерны. Глубина трубопровода не разглашается. Для этого ответа давайте предположим, что устройство может выполнить 1 инструкцию за цикл, а задержка зависимой команды составляет 8 циклов.

Предположим, что действительно простая программа имеет зависимости между инструкциями:

1. ADD     R0, R1, R2
2. ADD     R3, R1, R2
3. ADD     R0, R3, R4   read r3 after write r3
4. LD      R1, R0       read r0 after write r0
5. ADD     R1, R1, R2   read r1 after write r1

time in cycles -->
                0                                4
                0        1         2         3   0
                123456789012345678901234567890...01234567890
                --------------------------------------------
warp 0 issues   12.......3.......4............>>>5..........
warp 0 retires  ........12.......3............>>>4.......5..

На графике показано, в каких циклах деформация 0 выдает инструкции и в каком цикле команда удаляется На временной шкале 370 циклов имеется разрыв, чтобы покрыть задержку глобального доступа к памяти, которая может составлять 200-1000 циклов.

Если вы добавите больше деформаций, то эти деформации могут появиться в любое время на временной шкале, где проблема деформации 0 является.

Ваше ядро ​​будет масштабироваться практически без увеличения времени, пока у планировщика деформаций не будет достаточно перекосов для выпуска каждого цикла. Как только этот порог достигнут, тогда планировщик деформации переподписывается, и время выполнения увеличивается. Время выполнения также может увеличиться за счет увеличения использования математических каналов или подсистемы памяти.

Если вы работаете на Fermi или более новом GPU, вы можете использовать эксперимент Nsight VSE CUDA Profiler Issue Efficiency Efficiency, чтобы увидеть, как увеличение количества блоков / деформаций / потоков влияет на эффективность планировщиков, и вы также можете проверить причины, из-за которых деформации останавливаются.

Для первых двух вопросов, пожалуйста, проверьте спецификации GPU. Это также зависит от вашей реализации кода. Вы получаете различное ускорение в зависимости от реализуемого алгоритма. Это зависит от степени параллелизации алгоритма по сравнению с его последовательным аналогом.

По третьему вопросу нет. Доступ к глобальной памяти намного медленнее, чем доступ к регистрам и разделяемой памяти. Вот почему мы используем оптимизацию общей памяти. Правило большого пальца гласит: если к чему-то в глобальной памяти обращаются несколько раз, лучше обращаться к нему только к одному и получать его в разделяемой памяти или частных переменных.

Другие вопросы по тегам