私はCUDAプログラムのカーネルを実行しています。GPU カウンターによって報告された時間と、カーネル実行の NVVP との間にはかなりの差があることがわかりました。なぜそのような違いが通常観察されるのですか?
1 に答える
Nsight Visual Studio Edition と Visual Profiler は、カーネルの期間をキャプチャするための 2 つのメカニズムをサポートしています。これらの方法は両方とも、CUevent/cudaEvent によって報告される値よりも小さく、より正確な値になります。方法は次のとおりです。
- 同時カーネルタイミング
これは、Nsight 2.x および Visual Profiler 5.0 がタイムラインを生成するために使用するデフォルト モードです。カーネルの期間は、カーネル コードがデバイス上で実行を開始してから完了するまでの時間として定義されます。これは、CUDA イベントを使用して測定することはできません。
- シリアル化されたカーネルのタイミング
これは、各カーネルの PM カウンターを収集するときにツールによって使用されるデフォルトのモードです。カーネルの期間は、カーネルの完了後に GPU がアイドル状態になるまで、GPU が起動要求を処理する時間として定義されます。このモードは、カーネルの同時実行を具体的に無効にします。GPU が最初のブロックを起動する時間と GPU がすべてのメモリ ストアを完了する時間が含まれているため、ほとんどの場合、報告される時間は同時カーネル トレース時間よりもわずかに長くなります。
- CUDA イベント範囲のタイミング
CUDA イベントのタイミングは、同じストリームでのカーネル起動の前後に cu/cudaEventRecord を呼び出すことによって行われます。各イベント レコードは、コマンドを GPU プッシュ バッファーに挿入します。コマンドが GPU に到達すると、タイムスタンプがメモリに書き込まれます。起動せずに 2 つのイベント レコードをプッシュすることができます。これにより、開発者は 2 つのタイムスタンプ コマンド間の GPU 時間を測定できます。この方法には次の欠点があります。開発者にツール (Nsight、Visual Profiler、および CUPTI) を使用することをお勧めするのはそのためです。
-
を。開始イベント レコードの送信から起動までの経過時間は、CPU オーバーヘッドの影響を受ける可能性があります。起動のオーバーヘッドは、Linux/TCC では 5 ~ 8µs で、WDDM ではさらに高くなる可能性があります。
b. GPU は、開始イベント レコードとカーネル実行の間でコンテキストを切り替えることができます。
c. 開始イベント レコードには、サイズ変更が必要なドライバ バッファの更新、パラメータのコピー、テクスチャ バインディングのコピーなどにかかる時間など、起動のオーバーヘッドが含まれます。
d. カーネルを送信してから終了イベント レコードまでの経過時間は、タイミングに影響を与える可能性があります。
e. GPU は、カーネル実行の終了と終了イベント レコードの間でコンテキストを切り替えることができます。
f. イベントを誤って使用すると、カーネルの同時実行が中断されます。
これらの各モードで提供される期間は、異なる値を提供します。さらに、ツールによって提供される期間の定義と、イベントを使用して利用できる期間の定義は異なります。
NVIDIA ツールは、GPU がカーネルで作業を開始してから GPU がカーネルで作業を完了するまでの時間として、可能な限り最適な期間を定義します。開発者がこの情報の収集に関心がある場合は、ツールキットに含まれている CUPTI SDK を確認する必要があります。