我非常迷茫,但幸运的是,我将问题缩小到了几行代码。
我正在定义一个类,它将事件存储为成员std::vector<cl::Event*> m_lastaccesses中的指针。在类实例A和B之间调用enqueueWriteBuffer时,调用enqueueWriteBuffer时,将blockingWrite设置为CL_FALSE和A.m_lastaccesses[0]作为返回事件。退出operator=之前,将使用*B.m_lastaccesses[1]=*A.m_lastaccesses[0]复制此事件,并退出operator=。
如果在退出CL_FALSE之前将CL_TRUE、或调用A.m_lastaccesses[0]->wait()改为A.m_lastaccesses[0]->wait(),主机将有效地等待数据传输,一切正常。如果我离开CL_FALSE,在A.m_lastaccesses[0]->wait() 退出operator=后立即调用operator=,主机就不会等待,即使我验证A.m_lastaccesses[0]指向与以前相同的内存地址。
我的猜想是,一些引用计数出乎意料地工作,cl::Event被OpenCL的C++包装器释放或修改
发布于 2019-05-28 08:54:08
所以..。您有一个指针向量:
std::vector<cl::Event*> m_lastaccesses
..。并且您正在复制指针内容:
*B.m_lastaccesses[1]=*A.m_lastaccesses[0]
..。你怎么知道B.m_lastaccesses[1]是一个有效的指针?如果它是一个有效的指针,那么当这一行代码覆盖它时,存储在那里的实例会发生什么呢?这是真正的代码吗,因为我很惊讶它能起作用.
我的猜想是,某些引用计数出乎意料地起作用。
也许吧。我的猜测是,你弄乱了指针和指针的内容,在某个地方它就爆炸了。在这里,我没有看到使用指针的好理由;我只是直接存储cl::Event对象。and中的类通常只存储一个指向底层CL对象的指针,复制/删除它们很便宜(只会导致clRetain/clRelease),甚至可以避免那些带有移动-赋值的clRetain/clRelease调用。在某种程度上,cl::Event充当“智能”指针。
哦,您可以随时查看cl2.hpp源代码。没那么复杂。
https://stackoverflow.com/questions/56328579
复制相似问题