我对cuda编程(几个星期前刚刚开始)非常陌生,我有一项任务是乘以大尺寸矩阵(如960x960),并测量总体执行时间和每个gpu内核。我查看了安装Toolkit附带的CUDA示例(更精确地说,项目matrixMul int 0_Simple文件夹)。我改变了样本来乘以大矩阵。该示例本身具有测量执行时间的实现,但是我的问题是如何测量每个gpu核心的执行时间。我很困惑。CUDA测量每个gpu内核的执行时间
此外,为什么在此示例中的内核函数在函数中被调用时最多需要300次迭代。
我对cuda编程(几个星期前刚刚开始)非常陌生,我有一项任务是乘以大尺寸矩阵(如960x960),并测量总体执行时间和每个gpu内核。我查看了安装Toolkit附带的CUDA示例(更精确地说,项目matrixMul int 0_Simple文件夹)。我改变了样本来乘以大矩阵。该示例本身具有测量执行时间的实现,但是我的问题是如何测量每个gpu核心的执行时间。我很困惑。CUDA测量每个gpu内核的执行时间
此外,为什么在此示例中的内核函数在函数中被调用时最多需要300次迭代。
每个CUDA设备都有多个流式多处理器(SM)。每个SM可以有多个warp调度程序和多个执行单元。 CUDA核心是不是“核心”的执行单元,因此我将在其余讨论中避免使用它们。
的NVIDIA分析工具
支持为CUDA网格发布收集持续时间和PM计数器的能力。每个SM可以收集PM计数器的子集。
我已经提供了nvprof的命令行来收集这两条信息。这两个示例都在具有15个SM的GTX480上运行matrixMul样本的调试版本。
收集栅执行时间
每个上面列出简化模式收集每个内核网格推出的执行持续时间的工具。图形工具可以在时间轴上或表格中显示。
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)
为了在其他工具来收集
SM的搜集活动
您的问题指出你需要每个GPU核心的执行时间。这可能意味着每个GPU(见上文)或每个SM。可以使用SM PM计数器active_cycles收集SM执行时间。 active_cycles计算SM至少有一个活动warp的周期数。
对于输出中的每一行,将会有15个值(每个SM一个)。
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
我会试试这个。谢谢你的好解释。 +1并接受答案。 – Sandra
该示例执行多次迭代以提高FLOP计算的准确性。我不认为有一个很好的理由,为什么价值300. –