CUDA测量每个GPU核心的执行时间

时间:2012-12-13 20:26:41

标签: time cuda execution measure

我对cuda编程非常陌生(几周前刚刚开始),我有一个用于乘以大尺寸矩阵(如960x960)并测量总体执行时间和每个GPU核心的时间。我查看了安装Toolkit附带的CUDA Samples(更确切地说是项目matrixMul int 0_Simple文件夹)。我改变了样本以乘以大矩阵。示例本身具有测量执行时间的实现,但我的问题是如何测量每个GPU核心的执行时间。我很迷惑。

此外,重要性较低,为什么在这个示例中的内核函数在具有最多300次迭代的for函数内被调用。

1 个答案:

答案 0 :(得分:6)

每个CUDA设备都有多个流式多处理器(SM)。每个SM可以具有多个warp调度程序和多个执行单元。 CUDA核心是执行单元而不是#34;核心"所以我会在剩下的讨论中避开它们。

NVIDIA分析工具

  • CUDA命令行分析器
  • nvprof命令行分析器(CUDA 5.0中的新增功能)
  • Visual Profiler
  • Nsight VSE CUDA探查器

支持收集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)

为了收集其他工具

  1. CUDA命令行分析器 - 指定时间戳
  2. Visual Profiler - 运行生成时间线
  3. Nsight VSE - 新分析活动|跟踪|启用CUDA
  4. 收集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