clSetEventCallback,如果事件被显式保留
clSetEventCallback, should the event be retained explicitly?
我有一个案例,在进入内核队列之后,获得一个事件并设置回调以进行分析。例如:
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对象离开作用域太快,在回调调用之前被释放,但无法确认。
所以我的问题是事件应该在离开作用域之前显式保留吗?还是有其他原因?
我弄清楚了,在设置回调之前,调用clRetainEvent(),并在EventCallback结束时调用clReleaseEvent(),因此事件将在回调结束之前有效。如果最后不释放它,调试器将报告它为内存泄漏。
相关文章:
- 有根的二进制搜索树.保留与其父级的链接
- Android NDK传感器向事件队列报告奇怪的间隔
- 为多个会话保留XPtr
- 从文本文件中读取时钟时间和事件时间并进行处理
- WMI检测进程创建事件-c++
- EvtExportLogneneneba API正在将远程计算机的事件日志保存到远程PC本身.如何将其保存到主机
- 处理闪烁窗口事件
- C++Builder中的OnClick事件签名存在问题
- 保留对其他类的成员函数的引用
- 跟踪滚动条上的鼠标事件
- 什么是事件表 (wxWidgets)?
- 如何在 MFCaptureEngine 中获取"Camera removed"事件
- 给定顺序中的事件处理
- 当服务中的事件被触发时,如何将响应从服务发送回客户端?
- 指针保留字符串
- 在 C++/CLI 中将 .NET 事件从一个 DLL 引发到另一个 DLL
- 是否有内置方法可以强制转换为不同的基础类型,但保留常量限定符?
- 如何让 GCC/Clang 在保留标识符上出错
- 如何创建事件驱动的 SDL2 应用程序
- clSetEventCallback,如果事件被显式保留