Каждое устройство 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)
Для того, чтобы собрать в других инструментах
- Профилировщик командной строки CUDA — укажите метки времени
- Визуальный профилировщик - запустить генерировать временную шкалу
- 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