カーネルをエンキューした後、イベントが取得され、プロファイリングのためにコールバックが設定されるケースがあります。たとえば、clSetEventCallback、明示的にイベントを保持する必要がありますか?
cl::Event event;
cl::CommandQueue queue(context, devices[0], 0, &err);
queue.enqueueNDRangeKernel(kernel, cl::NullRange, cl::NDRange(4,4), cl::NullRange, NULL, &event);
event.setcallback(CL_COMPLETE, &EventCallback);
ここで、コールバックはカーネルの実行時間をチェックする関数です。
void CL_CALLBACK EventCallback(cl_event event, cl_int, void* pUserData)
{
cl_int err = CL_SUCCESS;
cl_ulong submitted = 0, end = 0;
clGetEventProfilingInfo(event, CL_PROFILING_COMMAND_START, sizeof(cl_ulong), &start, NULL);
clGetEventProfilingInfo(event, CL_PROFILING_COMMAND_END, sizeof(cl_ulong), &end, NULL);
...
}
私はここでチェックリターンエラーコードを無視し、時にはclGetEventProfilingInfo()メソッドの戻りCL_INVALID_EVENT。デバッグを実行し、コールバック内にブレークポイントを入れると、これは起こりません。
これは、cl :: Eventオブジェクトのスコープが非常に速く、コールバックが呼び出される前に解放されたためですが、確認できない可能性があります。
私の質問は、範囲を離れる前に明示的にイベントを保持する必要がありますか?それとも別の理由があるのでしょうか?
サイドコメントとして:NDRangeKernel呼び出しでイベントを使用する前に、コールバックを設定する必要があります。コールバックが設定される前にカーネルが終了できるためです。 – DarkZeros
NDRangeKernelをエンキューする前にイベントが有効ではないのに、コールバックを設定する方法はありますか? –