首页 > 解决方案 > OpenCL 和 C++:事件无法正常工作

问题描述

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

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

如果我在退出主机之前更改CL_FALSECL_TRUE 调用有效地等待数据传输并且一切正常。如果我在退出主机立即离开并打电话,即使我验证它指向与以前相同的内存地址,主机也不会等待。A.m_lastaccesses[0]->wait()operator=CL_FALSEA.m_lastaccesses[0]->wait() operator=A.m_lastaccesses[0]

我的猜想是某些引用计数出乎意料地工作并且cl::Event被 OpenCL 的 C++ 包装器释放或修改

标签: c++opencl

解决方案


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

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 源代码。没那么复杂。


推荐阅读