Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/145.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/xpath/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ clSetEventCallback,是否应显式保留该事件?_C++_Opencl - Fatal编程技术网

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调用之前,事件还无效,如何在那里设置回调?