5

タイトルが示すように、OpenCLカーネルを実行すると、画面全体の再描画が停止します (モニターに表示される画像は、プログラムの計算が完了するまで同じままです。これは、ノートブックからプラグを抜いて再度差し込んだ場合でも当てはまります - 常に)同じ画像が表示されます)、コンピュータはマウスの動きにも反応しないようです - カーソルは同じ位置にとどまります。

なぜこれが起こるのかわかりません。私のプログラムのバグでしょうか、それともこれは標準的な動作ですか?

Google で検索しているときに、AMD のフォーラムでこのスレッドを見つけました。計算でビジー状態の場合、GPU が画面を更新できないのは正常であると示唆する人もいました。

これが本当なら、これを回避する方法はまだありますか?

カーネルの計算には数分かかることがあり、その間ずっとコンピューターを実質的に使用できなくするのは非常に苦痛です。

EDIT1:これは私の現在の設定です:

  • グラフィックス カードは ATI Mobility Radeon HD 5650 で、メモリは 512 MB で、AMD の Web サイトから入手した最新の Catalyst ベータ ドライバを搭載しています。
  • グラフィックスは切り替え可能です-Intel統合/ ATI専用カードですが、Ubuntuでドライバーを動作させることができなかったため、BIOSで切り替えを無効にしました。
  • オペレーティング システムは Ubuntu 12.10 (64 ビット) ですが、これは Windows 7 (64 ビット) でも発生します。
  • HDMI経由でモニターを接続しています(ただし、ノートブックの画面もフリーズするため、これは問題になりません)

EDIT2:私のコードで一日遊んだ後、私はあなたの応答からアドバイスを受け取り、私のアルゴリズムを次のようなものに変更しました(疑似コードで):

for (cl_ulong chunk = 0; chunk < num_chunks; chunk += chunk_size)
{
  /* set kernel arguments that are different for each chunk */
  clSetKernelArg(/* ... */);

  /* schedule kernel for next execution */
  clEnqueueNDRangeKernel(cmd_queue, kernel, 1, NULL, &global_work_size, NULL, 0, NULL, NULL);

  /* read out the results from kernel and append them to output array on host */
  clEnqueueReadBuffer(cmd_queue, of_buf, CL_TRUE, 0, chunk_size, output + chunk, 0, NULL, NULL);
}

そのため、ホスト上のワークロード全体を分割し、チャンクで GPU に送信します。データのチャンクごとに新しいカーネルをキューに入れ、そこから取得した結果を正しいオフセットで出力配列に追加します。

これは、計算を分割する必要があるという意味ですか?

これは、フリーズの問題を解決する方法のように思えます。さらに、利用可能な GPU メモリよりもはるかに大きなデータを処理できるようになりました。 .

4

3 に答える 3

7

GPU が OpenCL カーネルを実行しているときはいつでも、それは完全に OpenCL 専用です。一部の最新の Nvidia GPU は例外です。GeForce GTX 500 シリーズ以降では、それらのカーネルが利用可能な計算ユニットをすべて使用していない場合、複数のカーネルを実行できます。

解決策は、計算を複数の短いカーネル呼び出しに分割することです。これは、単一の GPU マシンでも機能するため、最善のオールラウンド ソリューションです。または、ディスプレイを駆動するために安価な GPU に投資することもできます。

GPU で長いカーネルを実行する場合は、GPU のタイムアウトの検出と回復を無効にするか、タイムアウトの遅延をカーネルの最大実行時間よりも長くする必要があります (バグを発見できる可能性があるため) 。これを行う方法については、こちらを参照してください。

于 2013-04-24T12:41:03.700 に答える
2

ディスプレイがフリーズしたり、「ディスプレイ ドライバーが応答を停止して回復しました」と表示されるたびに、バグが原因でした。システム全体がフリーズする可能性があり、できることはリセットすることだけです。代わりに、今では最初に CPU で開発しています。これでシステム全体がクラッシュすることはありません。printf を使用できるため、この方法でもデバッグが容易になります。CPU でコードがバグなく動作するようになったら、GPU で試します。

于 2013-04-24T08:07:12.670 に答える
1

私はopenclを初めて使用し、同様の問題に遭遇しました。短い計算では問題なく動作することがわかりましたが、長い計算ではマウス カーソルがフリーズします。私の問題では、Windows はトレイ領域に黄色の三角形を残し、「ディスプレイ ドライバーが応答を停止し、回復しました」というメッセージをイベント ログに記録します。私が見つけた解決策は、計算をそれぞれ数秒しかかからない小さな部分に分割することです。これらは背中合わせに実行されますが、ビデオドライバーを満足させるのに十分なようです。スループットを最大化するのに十分高い値に global_work_size を設定すると、ビデオの応答が非常に遅くなりますが、ドライバーの再起動/マウスのフリーズの問題は発生しません。

于 2013-04-24T02:16:53.913 に答える