0

clCreateCommandQueue() で複数の OpenCL キューを作成しました。

cl_int ret_code = CL_SUCCESS;
cl_command_queue queue1 = clCreateCommandQueue(GPU_context, GPU_device_ID, CL_QUEUE_PROFILING_ENABLE, &ret_code);
...
cl_command_queue queueN = clCreateCommandQueue(GPU_context, GPU_device_ID, CL_QUEUE_PROFILING_ENABLE, &ret_code);

すべてのキューがエラーなしで作成されます。そのキューの 1 つには、しばらくコマンドがありません。すべてのカーネルの実行は正常に行われます。最後に、作成したキューを解放する必要があります。すべての clFinish() は、コマンドが含まれていないキューを待機する 1 つを除いて正常に動作します (たとえば、キュ​​ー N にはコマンドが含まれていません)。となることによって

clFinish(queue1);
...
clFinish(queueK);

正しく戻りますが、

clFinish(queueN);

永久にハングアップします。解決策は何ですか?

OSはUbuntu 12.04 x64です。GPUはGeForce GTS450です。OpenCL SDK 1.1

4

3 に答える 3

0

OS X 10.8、10.9、およびベータ 10.10 で同様の問題 (およびドライバーのハングを含むその他の問題) が発生しており、CL_QUEUE_PROFILING_ENABLE を削除すると解決することがわかりました。

于 2014-09-16T20:57:59.707 に答える
0

おそらくドライバのバグです。「nVIDIA + Linux + OpenCL」で作業しているときに、これらの多くを見つけました。私の場合、clReadBuffer() ブロッキング呼び出しの後にプログラムがハングアップし、戻りませんでした。

キューを 2 つだけ作成しても発生しますか?

この問題を解決するための私のアドバイスは、できるだけ少ないキューを使用することです。通常は 2 つのキューが最適です (カーネル処理 + I/O)。イベントと順不同キューのサポートを使用する場合、キューを追加する必要はありません。

于 2013-04-30T12:55:14.247 に答える