タイトルが示すように、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 メモリよりもはるかに大きなデータを処理できるようになりました。 .