VS 2010 用の Parallel Nsight 2.1 エディションを使用して、CUDA プログラムを最適化しようとしています。
私のプログラムは、GTX 480 ボードを搭載した Windows 7 (32 ビット) マシンで実行されます。CUDA 4.1 32 ビット ツールキットと 301.32 ドライバーをインストールしました。
プログラムの 1 サイクルは、デバイスへのホスト データのコピー、カーネルの実行、およびデバイスからホストへの結果のコピーで構成されます。
以下のプロファイラー結果の図でわかるように、カーネルは 4 つの異なるストリームで実行されます。各ストリームのカーネルは、「ストリーム 2」でデバイスにコピーされたデータに依存しています。そのため、異なるストリームでカーネルを起動する前に、asyncMemcpy が CPU と同期されます。
この図で私がいらいらするのは、最初のカーネル起動の終わり (10.5778679285) とカーネル実行の始まり (10.5781500) の間に大きなギャップがあることです。カーネルの起動には約 300 us かかります。これは、1 ミリ秒未満の処理サイクルで膨大なオーバーヘッドです。
さらに、カーネルの実行とホストへの結果のデータ コピーのオーバーラップがないため、オーバーヘッドがさらに増加します。
この動作に明らかな理由はありますか?