CodeXL中的OpenCl用户事件内存泄漏

时间:2016-09-09 13:58:28

标签: events memory-leaks opencl

正常事件在使用时被正确销毁,

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.

0 个答案:

没有答案