OpenCL用户事件/铁路超高释放对象?

OpenCL用户事件/铁路超高释放对象?,opencl,Opencl,注意:在队列中指定用户事件的排队命令 clEnqueue***命令的event_wait_list参数必须确保 正在等待的这些用户事件的状态是使用 发布OpenCL的任何OpenCL API之前的clSetUserEventStatus 调用事件对象以外的对象;否则,行为 没有定义 所以,若我在队列中等待一个用户事件,我就不能对任何OpenCL对象调用release 这似乎是一个奇怪的要求?它的目的是什么?或者,为什么会这样 他们举的例子是: ev1 = clCreateUserEvent(ct

注意:在队列中指定用户事件的排队命令 clEnqueue***命令的event_wait_list参数必须确保 正在等待的这些用户事件的状态是使用 发布OpenCL的任何OpenCL API之前的clSetUserEventStatus 调用事件对象以外的对象;否则,行为 没有定义

所以,若我在队列中等待一个用户事件,我就不能对任何OpenCL对象调用release

这似乎是一个奇怪的要求?它的目的是什么?或者,为什么会这样

他们举的例子是:

ev1 = clCreateUserEvent(ctx, NULL);
clEnqueueWriteBuffer(cq, buf1, CL_FALSE, ..., 1, &ev1, NULL);
clEnqueueWriteBuffer(cq, buf2, CL_FALSE,...);
clReleaseMemObject(buf2); // <--- UNDEFINED
clSetUserEventStatus(ev1, CL_COMPLETE);

哪些因素会导致未定义的行为?

请考虑他们给出的示例

我们有一个顺序队列,并创建一个用户事件:

ev1 = clCreateUserEvent(ctx, NULL); // (1)
然后,我们希望将写入缓冲区的操作排队,但我们希望它等待我们的事件:

clEnqueueWriteBuffer(cq, buf1, CL_FALSE, ..., 1, &ev1, NULL); // (2)
clEnqueueWriteBuffer(cq, buf2, CL_FALSE,...); // (3)
我们希望在等待事件的前一个缓冲区之后再写入另一个缓冲区:

clEnqueueWriteBuffer(cq, buf1, CL_FALSE, ..., 1, &ev1, NULL); // (2)
clEnqueueWriteBuffer(cq, buf2, CL_FALSE,...); // (3)
我们从第二个clEnqueueWriteBuffer释放缓冲区,该缓冲区尚未通过,因为我们仍在等待用户事件。在本例中,4发生在3之前,因此我们不知道内存对象被释放时会发生什么

clReleaseMemObject(buf2); // <--- UNDEFINED // (4)

基本上,以这种方式执行计算可能会导致问题,因为clreleasemobject不会插入到clCommandQueue中,并且会破坏我们期望的依赖关系。

对于非用户事件,您描述的情况有什么不同?即如果ev1是一个系统事件,如果您的答案是它没有什么不同,那么为什么需求特定于用户事件?如果我错了,我相信你会纠正我的错误,但是当你对一个操作(比如写缓冲区)进行排队时,它会在队列中保留对缓冲区的引用,所以即使你释放它,它也会减少引用计数,直到它不再在队列中被引用为止。