OpenCL 和 C++:事件无法正常工作

OpenCL and C++: events not working properly

本文关键字:常工作 工作 C++ 事件 OpenCL      更新时间:2023-10-16

我很迷茫,但幸运的是我将问题缩小到几行代码。

我正在定义一个类,该类将事件存储为成员std::vector<cl::Event*> m_lastaccesses中的指针。在类实例AB之间调用operator=时,调用enqueueWriteBufferblockingWrite设置为CL_FALSEA.m_lastaccesses[0]作为其返回事件。在退出之前operator=将使用*B.m_lastaccesses[1]=*A.m_lastaccesses[0]复制此事件,并退出operator=

如果我在退出operator=之前将CL_FALSE更改为CL_TRUE呼叫A.m_lastaccesses[0]->wait(),主机会有效地等待数据传输并且一切正常。如果我离开CL_FALSE并在退出后立即呼叫A.m_lastaccesses[0]->wait()operator=主机不会等待,即使我验证A.m_lastaccesses[0]指向与以前相同的内存地址。

我的猜想是某些引用计数意外工作,并且 OpenCL 的C++包装器释放或修改了cl::Event

所以... 你有一个指针向量:

std::vector<cl::Event*> m_lastaccesses

。并且您正在复制指针内容:

*B.m_lastaccesses[1]=*A.m_lastaccesses[0]

。你怎么知道B.m_lastaccesses[1]是有效的指针?如果它是一个有效的指针,当那行代码覆盖它时,存储在那里的实例会发生什么?这是实际的代码吗,因为我很惊讶它完全有效......

我的猜想是某些引用计数出乎意料地起作用

也许。我的猜想是你弄乱了指针和指针内容,它在某个地方爆炸了。而且我真的没有看到在这里使用指针的充分理由;我只是直接存储 cl::Event 对象。cl2.hpp 中的类通常只存储指向底层 CL 对象的单个指针,复制/删除它们很便宜(只会导致 clRetain/clRelease),甚至可以避免那些带有移动赋值的 clRetain/clRelease 调用。在某种程度上,cl::Event 充当了一个"智能"指针。

哦,你总是可以看看cl2.hpp源代码。没那么复杂。