1

注: コマンドの event_wait_list引数で ユーザー イベントを指定するキューに入れられたコマンドは、イベント オブジェクトを除く OpenCL オブジェクトを解放する OpenCL API が呼び出される前に、clEnqueue***待機中のこれらのユーザー イベントのステータスが設定されていることを確認する必要があります 。clSetUserEventStatusそれ以外の場合、動作は未定義です。

キューで待機中のユーザー イベントがある場合、どの OpenCL オブジェクトでも release を呼び出すことはできませんか?

これは奇妙な要件のように思えますか? その目的は何ですか?というか、どうしてですか?

彼らが与える例は次のとおりです。

ev1 = clCreateUserEvent(ctx, NULL);
clEnqueueWriteBuffer(cq, buf1, CL_FALSE, ..., 1, &ev1, NULL);
clEnqueueWriteBuffer(cq, buf2, CL_FALSE,...);
clReleaseMemObject(buf2); // <--- UNDEFINED
clSetUserEventStatus(ev1, CL_COMPLETE);

未定義の動作の原因はどれですか?

4

1 に答える 1

0

彼らが与える例を考えてみましょう。

順序どおりのキューがあり、ユーザーイベントを作成します。

ev1 = clCreateUserEvent(ctx, NULL); // (1)

次に、バッファへの書き込みをキューに入れたいが、イベントを待機させたい。

clEnqueueWriteBuffer(cq, buf1, CL_FALSE, ..., 1, &ev1, NULL); // (2)

前のバッファ(イベントを待機している)のバッファの後に別のバッファを書き込みたい:

clEnqueueWriteBuffer(cq, buf2, CL_FALSE,...); // (3)

clEnqueueWriteBufferまだユーザーイベントを待っているため、まだ通過していない秒からバッファを解放します。この場合、(4)は(3)の前に発生するため、メモリオブジェクトが解放されたときに何が発生するかはわかりません。

clReleaseMemObject(buf2); // <--- UNDEFINED // (4)

最後に、(4)がすでに完了した後に(2)と(3)が発生するユーザーイベントを完了します。

clSetUserEventStatus(ev1, CL_COMPLETE); // (5)

基本的に、この方法で計算を実行するとclReleaseMemObject、に挿入されず、clCommandQueue予想される依存関係が壊れる可能性があるため、問題が発生する可能性があります。

于 2013-01-31T19:48:05.110 に答える