2

質問

合計 GPU 時間 + 合計 CPU オーバーヘッドは、合計実行時間よりも小さくなります。なんで?

詳細

グローバル メモリ アクセスとカーネルの起動の頻度がパフォーマンスにどの程度影響するかを調査しており、複数の小さなカーネルと合計で約 10 万のカーネル呼び出しを含むコードを設計しました。各カーネルは、グローバル メモリからデータを読み取り、それらを処理してから、グローバル メモリに書き戻します。予想どおり、コードは、大きなカーネルが 1 つしかなく、カーネルの起動が非常に少ない元の設計よりもはるかに遅く実行されます。

コマンドライン プロファイラーを使用して「gputime」 (GPU カーネルまたはメモリ コピー メソッドの実行時間) と「cputime」 (ノンブロッキング メソッドの CPU オーバーヘッド、ブロッキング メソッドの gputime と CPU オーバーヘッドの合計) を取得したときに問題が発生しました。 . 私の理解では、すべての gputimes とすべての cputimes の合計は、全体の実行時間 (最後の「gpuendtimestamp」から最初の「gpustarttimestamp 」を引いたもの) を超える必要があります。)、しかし、その逆が真であることがわかります (gputimes の合計 = 13.835064 秒、cputimes の合計 = 4.547344 秒、合計時間 = 29.582793)。1 つのカーネルが終了してから次のカーネルが開始するまでの間に、多くの場合、次のカーネルの CPU オーバーヘッドよりも大きな待機時間が発生します。この問題に悩まされているカーネルのほとんどは、memcpyDtoH、memcpyDtoD、および launch_closure_by_value、fast_scan などの推力内部関数です。考えられる理由は何ですか?

システム Windows 7、TCC ドライバー、VS 2010、CUDA 4.2

ご協力いただきありがとうございます!

4

1 に答える 1

1

これは、レイテンシーを増加させるプロファイリングと、Windows WDDM サブシステムの組み合わせである可能性があります。後者の高いレイテンシを克服するために、CUDA ドライバーは GPU 操作をバッチ処理し、単一の Windows カーネル呼び出しでそれらをグループで送信します。これにより、CUDA API コマンドが未送信のバッチ内にある場合、GPU が長時間非アクティブになる可能性があります。

(投票と承認を有効にするために、@talonmies のコメントを回答にコピーしました。)

于 2012-09-01T15:27:56.963 に答える