CUDA измеряет время выполнения на ядро ​​графического процессора

Я действительно новичок в программировании cuda (только начал несколько недель назад), и у меня есть задание умножить матрицы большого размера (например, 960x960) и измерить время выполнения в целом и на ядро ​​графического процессора. Я просмотрел образцы CUDA, которые поставляются с установкой Toolkit (точнее, проект matrixMul в папке 0_Simple). Я изменил образец, чтобы умножить большие матрицы. Сам образец имеет реализацию измерения времени выполнения, но мой вопрос заключается в том, как я могу измерить время выполнения на ядро ​​графического процессора. Я смущен.

Кроме того, что менее важно, почему функция ядра в этом примере вызывается внутри функции for с максимальным числом итераций 300.


person Sandra    schedule 13.12.2012    source источник
comment
Образец выполняет более 1 итерации для повышения точности расчета FLOP. Я не думаю, что есть веская причина, по которой значение равно 300.   -  person Greg Smith    schedule 14.12.2012


Ответы (1)


Каждое устройство CUDA имеет несколько потоковых мультипроцессоров (SM). Каждый SM может иметь несколько планировщиков деформации и несколько исполнительных блоков. Ядра CUDA — это исполнительные блоки, а не «ядра», поэтому я буду избегать их в дальнейших обсуждениях.

Инструменты профилирования NVIDIA

  • Профилировщик командной строки CUDA
  • Профилировщик командной строки nvprof (новое в CUDA 5.0)
  • Визуальный профайлер
  • Профайлер Nsight VSE CUDA

поддержка возможности сбора счетчиков длительности и PM для запусков сетки CUDA. Подмножество счетчиков PM может быть собрано для каждого SM.

Я предоставил командную строку для nvprof для сбора двух частей информации. Оба примера запускают отладочную сборку примера matrixMul на GTX480 с 15 SM.

СБОР ВРЕМЕНИ ВЫПОЛНЕНИЯ СЕТКИ

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

nvprof --print-gpu-trace matrixMul.exe
======== NVPROF is profiling matrixMul.exe...
======== Command: matrixMul.exe
[Matrix Multiply Using CUDA] - Starting...
GPU Device 0: "GeForce GTX 480" with compute capability 2.0

MatrixA(320,320), MatrixB(640,320)
Computing result using CUDA Kernel...
done
Performance= 39.40 GFlop/s, Time= 3.327 msec, Size= 131072000 Ops, WorkgroupSize= 1024 threads/block
Checking computed result for correctness: OK

Note: For peak performance, please refer to the matrixMulCUBLAS example.
======== Profiling result:
     Start  Duration           Grid Size     Block Size     Regs*    SSMem*    DSMem*      Size  Throughput    Device   Context    Stream  Name
  267.83ms   71.30us                   -              -         -         -         -  409.60KB    5.74GB/s         0         1         2  [CUDA memcpy HtoD]
  272.72ms  139.20us                   -              -         -         -         -  819.20KB    5.88GB/s         0         1         2  [CUDA memcpy HtoD]
  272.86ms    3.33ms           (20 10 1)      (32 32 1)        20    8.19KB        0B         -           -         0         1         2  void matrixMulCUDA<int=32>(float*, float*, float*, int, int)
  277.29ms    3.33ms           (20 10 1)      (32 32 1)        20    8.19KB        0B         -           -         0         1         2  void matrixMulCUDA<int=32>(float*, float*, float*, int, int)

Для того, чтобы собрать в других инструментах

  1. Профилировщик командной строки CUDA — укажите метки времени
  2. Визуальный профилировщик - запустить генерировать временную шкалу
  3. Nsight VSE — новая аналитическая деятельность | След | Включить CUDA

СБОР SM-АКТИВНОСТИ

В ваших вопросах указано, что вам нужно время выполнения для каждого ядра графического процессора. Это может означать для каждого графического процессора (см. выше) или для каждого SM. Время выполнения SM можно получить с помощью счетчика PM SM active_cycles. active_cycles подсчитывает количество циклов, в течение которых у SM есть хотя бы одна активная деформация.

Для каждой строки в выводе будет 15 значений (по одному на каждую СМ).

nvprof --events active_cycles --aggregate-mode-off matrixMul.exe
======== NVPROF is profiling matrixMul.exe...
======== Command: matrixMul.exe
[Matrix Multiply Using CUDA] - Starting...
GPU Device 0: "GeForce GTX 480" with compute capability 2.0

MatrixA(320,320), MatrixB(640,320)
Computing result using CUDA Kernel...
done
Performance= 12.07 GFlop/s, Time= 10.860 msec, Size= 131072000 Ops, WorkgroupSize= 1024 threads/block
Checking computed result for correctness: OK

Note: For peak performance, please refer to the matrixMulCUBLAS example.
======== Profiling result:
    Device   Context    Stream, Event Name, Kernel, Values
         0         1         2, active_cycles, void matrixMulCUDA<int=32>(float*, float*, float*, int, int), 2001108 2001177 2000099 2002857 2152562 2153254 2001086 2153043 2001015 2001192 2000065 2154293 2000071 2000238 2154905
         0         1         2, active_cycles, void matrixMulCUDA<int=32>(float*, float*, float*, int, int), 2155340 2002145 2155289 2002374 2003336 2002498 2001865 2155503 2156271 2156429 2002108 2002836 2002461 2002695 2002098
person Greg Smith    schedule 13.12.2012
comment
Я попробую это. Спасибо за хорошее объяснение. +1 и принятый ответ. - person Sandra; 14.12.2012