1

event_wait_list注意:在命令的参数中 指定用户事件的入队 clEnqueue***命令必须确保 在调用clSetUserEventStatus任何释放除事件对象之外的 OpenCL 对象的 OpenCL API 之前使用设置这些正在等待的用户事件的状态;否则行为未定义。

因此,如果我在队列中等待用户事件,我不能在任何 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);

哪个导致未定义的行为?

4

1 回答 1

0

考虑他们给出的例子。

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

ev1 = clCreateUserEvent(ctx, NULL); // (1)

然后我们想要将写入队列到缓冲区,但我们希望它等待我们的事件:

clEnqueueWriteBuffer(cq, buf1, CL_FALSE, ..., 1, &ev1, NULL); // (2)

我们想在前一个缓冲区(等待我们的事件)之后写入另一个缓冲区:

clEnqueueWriteBuffer(cq, buf2, CL_FALSE,...); // (3)

clEnqueueWriteBuffer我们从尚未通过的第二个缓冲区释放缓冲区,因为我们仍在等待用户事件。在这种情况下,(4) 发生在 (3) 之前,所以我们不知道释放内存对象时会发生什么。

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

我们最终完成了导致(2)和(3)在(4)已经完成之后发生的用户事件。

clSetUserEventStatus(ev1, CL_COMPLETE); // (5)

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

于 2013-01-31T19:48:05.110 回答