3

親愛なる CUDA ユーザーの皆様 nvidia ボードからの質問を再投稿します。現在、GPU で画像処理を行っており、大きな画像を実行するときに 500 ~ 700 ミリ秒かかるカーネルが 1 つあります。以前は小さい画像でも問題なく動作していましたが、現在はディスプレイ全体とマウス カーソルでさえ遅延が発生しています(OS=win7) 。

私のアイデアは、カーネルを 4 回または 8 回のカーネル起動に分割して、ドライバーがより頻繁に (各カーネル起動間で) 更新されることを期待することでした。残念ながら、それはまったく役に立たないので、このフリーズ表示効果を回避するために他に何ができるでしょうか? cudaStreamQuery(0)ドライバーによるパッキングを避けるために、各カーネル間に呼び出しを追加するよう提案されました。

注: スムーズさのためにパフォーマンスを犠牲にする準備ができています!

4

1 に答える 1

4

GPU は (まだ) カーネルの起動間でコンテキストを切り替えるように設計されていません。これが、実行時間の長いカーネルが遅延表示を引き起こしている理由です。カーネルを複数の起動に分割すると、Windows Vista/Windows 7 以外のプラットフォームで役立つ可能性があります。これらのプラットフォームでは、Windows ディスプレイ ドライバー モデルは、CUDA ドライバーがサブミットするたびに、高価なユーザーからカーネルへの移行 (「カーネル サンク」) を必要とします。 GPU に働きかけます。

カーネル サンクのコストを償却するために、CUDA ドライバーは GPU コマンドをキューに入れ、それらをバッチで送信します。ドライバーはヒューリスティックを使用して、カーネル サンクによるパフォーマンス ヒットと、作業をすぐに送信しないことによる遅延の増加とをトレードオフします。マルチカーネル ソリューションで起きていることは、ドライバーがカーネルまたは一連のカーネルを一度に GPU に送信することです。

cudaStreamQuery(0) の提案を試しましたか? これが役立つ理由は、保留中の作業がほとんどない場合でも、CUDA ドライバーが強制的に作業を GPU に送信するためです。

于 2011-11-07T12:07:41.063 に答える