正常事件在使用时被正确销毁,
clReleaseEvent(ev)
使用
创建的用户事件clCreateUserEvent(context,err)
并不总是被发布事件破坏。
命令的顺序如下:
create queue
loop for 10 times
create user event
add it to 3 queues using marker
add other things to queues
signal user event so all queues start at the same time
clFinish
releaseUserEvent
end of loop
delete queue
机器:amd gpu,opencl 1.2 64位实现,win10与r7-240。
CodeXL说
0 545 9204 Warning Memory leak detected [Ref = -10, Handle = 0x000002792BC47070]: Object created by clCreateUserEvent
1 421 9204 Warning Memory leak detected [Ref = -18, Handle = 0x000002792BC477E0]: Object created by clCreateUserEvent
2 424 9204 Warning Memory leak detected [Ref = -11, Handle = 0x000002792BC478F0]: Object created by clCreateUserEvent
3 663 9204 Warning Memory leak detected [Ref = -9, Handle = 0x000002792BC47A00]: Object created by clCreateUserEvent
4 185 9204 Warning Memory leak detected [Ref = -22, Handle = 0x000002792BC47C20]: Object created by clCreateUserEvent
5 303 9204 Warning Memory leak detected [Ref = -10, Handle = 0x000002792BC47F50]: Object created by clCreateUserEvent
6 188 9204 Warning Memory leak detected [Ref = -20, Handle = 0x000002792BC48170]: Object created by clCreateUserEvent
7 427 9204 Warning Memory leak detected [Ref = -14, Handle = 0x000002792BC48280]: Object created by clCreateUserEvent
8 1020 9204 Warning Memory leak detected [Ref = -3, Handle = 0x000002792BC484A0]: Object created by clCreateUserEvent
9 548 9204 Warning Memory leak detected [Ref = -11, Handle = 0x000002792BC486C0]: Object created by clCreateUserEvent
也许驱动程序正在故意泄漏作为内存管理?
CodeXL(版本1.9)或Amd的crimson whql(16.7.3)驱动程序是否出错?或者我做错了吗?
从创建和发布返回CL_SUCCESS。
当我评论发布时,ref = 1表示所有泄漏,它们的数量等于循环计数器。当版本正常工作时,泄漏数量会随循环计数器而增加但不相等。例如45 for循环计数器= 100但具有更大的负参考计数器值(例如:Ref = -430)。
在使用临时事件和所有“clEnqueue”调用之后已经尝试添加“release”,这没有用。还连续尝试了多次“clRelease”并失败了。
注意:创建用户事件,将其添加到队列中的标记,在多线程代码块中发出信号并发布。创建和发布在另一个线程中的相同线程,信令和排队中。但是包装器在内存锁定块(C#)中执行所有操作,因此他们应该看到其他线程中的所有操作都已完成。 当我省略“标记”和“设置状态”部分时,不会发生泄漏。
程序运行正常,计算内容,与用户事件相应地进行同步。如果这个内存泄漏是驱动程序或我的错误,我只是好奇。
有一系列用户事件,以
发布clReleaseEvent(evt[0])
当我在C ++环境中作为参数传递时,没有创建此事件的副本。 clReleaseEvent接受它作为值,而不是referance。同样,也有
clSetUserEventStatus(hEvt->evt[0], CL_COMPLETE);
and
clEnqueueMarkerWithWaitList(hCommandQueue->commandQueue.operator()(), 1, hEvt->evt, &ev);
hEvt->evt is not creating a copy?
even tried this:
hCommandQueue->commandQueue.enqueueMarkerWithWaitList(&(hEvt->evt2),&ev);
same result but hEvt->evt2 is a std::vector of cl::Event instead of an array of cl_event.