各CUDAデバイスには、複数のストリーミングマルチプロセッサ(SM)があります。各SMは、複数のワープスケジューラと複数の実行ユニットを持つことができます。CUDAコアは「コア」ではなく実行ユニットであるため、残りの説明では避けます。
NVIDIAプロファイリングツール
- CUDAコマンドラインプロファイラー
- nvprofコマンドラインプロファイラー(CUDA 5.0の新機能)
- ビジュアルプロファイラー
- NsightVSECUDAプロファイラー
CUDAグリッド起動の期間とPMカウンターを収集する機能をサポートします。PMカウンターのサブセットは、SMごとに収集できます。
2つの情報を収集するための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)
他のツールで収集するために
- CUDAコマンドラインプロファイラー-タイムスタンプを指定します
- VisualProfiler-タイムラインの生成を実行します
- NsightVSE-新しい分析アクティビティ| トレース| CUDAを有効にする
SMアクティビティの収集
あなたの質問は、GPUコアごとの実行時間が必要であると述べています。これは、GPUごと(上記を参照)またはSMごとを意味します。SM実行時間は、SMPMカウンターactive_cyclesを使用して収集できます。active_cyclesは、SMに少なくとも1つのアクティブなワープがあるサイクルの数をカウントします。
出力の各行には、15個の値があります(SMごとに1つ)。
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