カーネルの実行を memcpyasync とオーバーラップさせようとしましたが、うまくいきません。固定メモリ、異なるストリームなどを使用して、プログラミングガイドのすべての推奨事項に従います。カーネルの実行が重複していることがわかりますが、メモリ転送では重複しません。私のカードにはコピー エンジンと実行エンジンが 1 つしかないことはわかっていますが、実行と転送はオーバーラップするはずですよね?
「コピー エンジン」と「実行エンジン」は、関数を呼び出す順序を常に強制しているようです。[HtoD x2、Kernel、DtoH] を実行する 4 つのストリームで作業が行われます。各ストリームで HtoDx2,Kernel,DtoH serie を発行すると、stream2 のようなプロファイラーで、最初の DtoH 操作が終了するまで HtoD の最初の操作が開始されないことがわかります。最初に各ストリームで HtoD を発行し、次に 2 番目の HtoD、次にカーネル、次に DtoH (幅) を発行すると、重複は見られず、発行順序も GPU によって強制されます。
CUDA SDK にある simpleStreams の例を試してみましたが、同じ動作が見られます。
Visual Profiler と Nsight for VS2008 の両方で問題を示すスクリーン キャプチャをいくつか添付します。
ps。CUDA_LAUNCH_BLOCKING 環境を設定していません
シンプルなストリーム ビジュアル プロファイラー
MyApp Nsight タイムライン幅優先
MyApp Nsight タイムラインの深さ優先
編集:
追加の x4 カーネル (合計 2HtoD、5 カーネル、ストリームごとに 1DtoH) を配置 --> --concurrent-kernels-off を使用して、または使用せずに nvprof を実行すると、経過時間は同じです。env CUDA_LAUNCH_BLOCKING=1 を設定すると、(コマンドラインから) 7.5% のパフォーマンスの向上が見られます!
システム仕様:
- ウィンドウズ7
- 最初の PCI-E スロットに NVIDIA 6800 VGA
- 2 番目の PCI-E スロットの GTX480
- NVIDIA ドライバー: 306.94
- ビジュアルスタジオ 2008
- CUDA v5.0
- ビジュアル プロファイラー 5.0
- Nsight 3.0