Time CUDA测量每个gpu内核的执行时间

Time CUDA测量每个gpu内核的执行时间,time,cuda,execution,measure,Time,Cuda,Execution,Measure,我对cuda编程非常陌生(几周前才开始),我有一项任务,就是将大尺寸矩阵(如960x960)相乘,并测量整个gpu内核和每个gpu内核的执行时间。我查看了安装工具包时附带的CUDA示例(更准确地说是0_Simple文件夹中的项目matrixMul)。我改变了样本,使之与大矩阵相乘。该示例本身具有测量执行时间的实现,但我的问题是如何测量每个gpu内核的执行时间。我很困惑 同样,重要性较低的是,为什么本例中的内核函数在最多300次迭代的for函数中被调用 每个CUDA设备都有多个流式多处理器(SMs

我对cuda编程非常陌生(几周前才开始),我有一项任务,就是将大尺寸矩阵(如960x960)相乘,并测量整个gpu内核和每个gpu内核的执行时间。我查看了安装工具包时附带的CUDA示例(更准确地说是0_Simple文件夹中的项目matrixMul)。我改变了样本,使之与大矩阵相乘。该示例本身具有测量执行时间的实现,但我的问题是如何测量每个gpu内核的执行时间。我很困惑


同样,重要性较低的是,为什么本例中的内核函数在最多300次迭代的for函数中被调用

每个CUDA设备都有多个流式多处理器(SMs)。每个SM可以有多个warp调度程序和多个执行单元。CUDA核心是执行单元,而不是“核心”,因此我将在接下来的讨论中避免使用它们

NVIDIA分析工具

  • CUDA命令行分析器
  • nvprof命令行分析器(CUDA 5.0中新增)
  • 可视轮廓仪
  • Nsight VSE CUDA分析器
支持收集CUDA网格启动的持续时间和PM计数器的能力。每个SM可以收集PM计数器的子集

我已经为nvprof提供了用于收集这两条信息的命令行。这两个示例都在带有15条SMs的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)
nvprof——打印gpu跟踪矩阵mul.exe
=======NVPROF正在分析matrixMul.exe。。。
=======命令:matrixMul.exe
[使用CUDA进行矩阵乘法]-正在启动。。。
GPU设备0:“GeForce GTX 480”,计算能力为2.0
MatrixA(320320),MatrixB(640320)
使用CUDA内核的计算结果。。。
完成
性能=39.40千兆次/秒,时间=3.327毫秒,大小=131072000次操作,工作组大小=1024个线程/块
检查计算结果的正确性:OK
注:有关峰值性能,请参考matrixMulCUBLAS示例。
=======分析结果:
开始持续时间网格大小块大小Regs*SSMem*DSMem*大小吞吐量设备上下文流名称
267.83ms 71.30us----409.60KB 5.74GB/s 01 2[CUDA memcpy HtoD]
272.72ms 139.20us----819.20KB 5.88GB/s 01 2[CUDA memcpy HtoD]
272.86ms 3.33ms(20 10 1)(32 32 1)20 8.19KB 0B--0 1 2无效矩阵mulcuda(float*,float*,float*,int,int)
277.29ms 3.33ms(20 10 1)(32 32 1)20 8.19KB 0B--0 1 2无效矩阵mulcuda(float*,float*,float*,int,int)
以便在其他工具中收集

  • CUDA命令行探查器-指定时间戳
  • 可视化探查器-运行生成时间线
  • Nsight VSE-新的分析活动|跟踪|启用CUDA
  • 收集SM活动

    您的问题表明您需要每个GPU内核的执行时间。这可能意味着每个GPU(见上文)或每个SM。SM执行时间可使用SM PM计数器活动周期收集。active_cycles统计SM至少有一个活动扭曲的循环数

    对于输出中的每一行,将有15个值(每个SM一个)

    nvprof——活动事件\u周期——聚合模式关闭matrixMul.exe
    =======NVPROF正在分析matrixMul.exe。。。
    =======命令:matrixMul.exe
    [使用CUDA进行矩阵乘法]-正在启动。。。
    GPU设备0:“GeForce GTX 480”,计算能力为2.0
    MatrixA(320320),MatrixB(640320)
    使用CUDA内核的计算结果。。。
    完成
    性能=12.07 GFlop/s,时间=10.860毫秒,大小=131072000次操作,工作组大小=1024个线程/块
    检查计算结果的正确性:OK
    注:有关峰值性能,请参考matrixMulCUBLAS示例。
    =======分析结果:
    设备上下文流、事件名称、内核、值
    0 1 2,有效循环,无效矩阵MULCUDA(浮点*,浮点*,浮点*,整数,整数),2001108 2001177 2000099 2002857 2152562 2153254 2001086 215043 2001015 2001192 2000065 2154293 2000071 2000238 2154905
    0 1 2,有效循环,无效矩阵mulcuda(float*,float*,float*,int,int),2155340 2002145 2155289 2002374 2003336 2002498 2001865 215503 2156271 2156429 2002108 2002836 2002461 2002695 2002098
    
    每个CUDA设备都有多个流式多处理器(SMs)。每个SM可以有多个warp调度程序和多个执行单元。CUDA核心是执行单元,而不是“核心”,因此我将在接下来的讨论中避免使用它们

    NVIDIA分析工具

    • CUDA命令行分析器
    • nvprof命令行分析器(CUDA 5.0中新增)
    • 可视轮廓仪
    • Nsight VSE CUDA分析器
    支持收集CUDA网格启动的持续时间和PM计数器的能力。每个SM可以收集PM计数器的子集

    我已经为nvprof提供了用于收集这两条信息的命令行。这两个示例都在带有15条SMs的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)
    
    nvprof——打印gpu跟踪矩阵mul.exe
    =======NVPROF正在分析matrixMul.exe。。。
    =======命令:matrixMul.exe
    [使用CUDA进行矩阵乘法]-正在启动。。。
    GPU设备0