2012-12-13 122 views
1

我對cuda編程(幾個星期前剛剛開始)非常陌生,我有一項任務是乘以大尺寸矩陣(如960x960),並測量總體執行時間和每個gpu內核。我查看了安裝Toolkit附帶的CUDA示例(更精確地說,項目matrixMul int 0_Simple文件夾)。我改變了樣本來乘以大矩陣。該示例本身具有測量執行時間的實現,但是我的問題是如何測量每個gpu核心的執行時間。我很困惑。CUDA測量每個gpu內核的執行時間

此外,爲什麼在此示例中的內核函數在函數中被調用時最多需要300次迭代。

+0

該示例執行多次迭代以提高FLOP計算的準確性。我不認爲有一個很好的理由,爲什麼價值300. –

回答

6

每個CUDA設備都有多個流式多處理器(SM)。每個SM可以有多個warp調度程序和多個執行單元。 CUDA核心是不是「核心」的執行單元,因此我將在其餘討論中避免使用它們。

的NVIDIA分析工具

  • CUDA命令行探查
  • nvprof命令行分析器(新中CUDA 5.0)
  • 視覺探查
  • 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. 視覺探查 - 運行產生時間表
  3. Nsight VSE - 新分析活動|跟蹤|啓用CUDA

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 
+0

我會試試這個。謝謝你的好解釋。 +1並接受答案。 – Sandra