1

私はcudaプログラミングに本当に慣れていません(数週間前に始めたばかりです)。大きなサイズのマトリックス(960x960など)を乗算し、全体およびGPUコアごとの実行時間を測定する割り当てがあります。Toolkitのインストールに付属しているCUDAサンプル(より正確には、プロジェクトmatrixMul int 0_Simpleフォルダー)を調べました。サンプルを変更して、大きな行列を乗算しました。サンプル自体には実行時間の測定が実装されていますが、私の質問は、GPUコアごとの実行時間をどのように測定できるかということです。私は混乱しています。

また、それほど重要ではありませんが、この例のカーネル関数が最大300回の反復でfor関数内で呼び出されるのはなぜですか。

4

1 に答える 1

6

各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)

他のツールで収集するために

  1. CUDAコマンドラインプロファイラー-タイムスタンプを指定します
  2. VisualProfiler-タイムラインの生成を実行します
  3. 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
于 2012-12-13T21:22:05.390 に答える