2016-11-08 52 views
1

我有一個情況,在enqueuer內核之後,獲得一個事件並設置回調進行性能分析。例如: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); 

其中Callback是檢查內核執行時間的函數。

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

我知道,在設置回調之前,調用clRetainEvent(),並在EventCallback結束時調用clReleaseEvent(),因此事件將有效直到回調結束。如果沒有釋放它,調試器會將其報告爲內存泄漏。

相關問題