C++ clSetEventCallback,是否应显式保留该事件?
我有一个例子,在对内核排队后,获取一个事件并设置回调以进行评测。例如:C++ clSetEventCallback,是否应显式保留该事件?,c++,opencl,C++,Opencl,我有一个例子,在对内核排队后,获取一个事件并设置回调以进行评测。例如: 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, &E
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\u无效的\u事件。若运行调试并将断点放在回调内,则不会发生这种情况
我认为这可能是因为cl::Event对象离开作用域太快,在调用回调之前被释放,但无法确认
所以我的问题是,在离开范围之前,是否应该明确保留事件?或者还有其他原因 我想,在设置回调之前,调用clRetainEvent(),在EventCallback结束时,调用clreleasevent(),因此该事件将一直有效到回调结束。如果最终不释放它,调试器会将其报告为内存泄漏。作为旁注:您应该在使用NDRangeKernel调用中的事件之前设置回调。因为内核可以在设置回调之前完成。在enqueue NDRangeKernel调用之前,事件还无效,如何在那里设置回调?