2016-11-08 23 views
1

カーネルをエンキューした後、イベントが取得され、プロファイリングのためにコールバックが設定されるケースがあります。たとえば、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オブジェクトのスコープが非常に速く、コールバックが呼び出される前に解放されたためですが、確認できない可能性があります。

私の質問は、範囲を離れる前に明示的にイベントを保持する必要がありますか?それとも別の理由があるのでしょうか?

+0

サイドコメントとして:NDRangeKernel呼び出しでイベントを使用する前に、コールバックを設定する必要があります。コールバックが設定される前にカーネルが終了できるためです。 – DarkZeros

+0

NDRangeKernelをエンキューする前にイベントが有効ではないのに、コールバックを設定する方法はありますか? –

答えて

0

set callbackの前にclRetainEvent()を呼び出し、EventCallbackの最後にclReleaseEvent()を呼び出して、イベントがコールバックの終了まで有効になるようにします。最終的にリリースしないと、デバッガはそれをメモリリークとして報告します。

関連する問題