首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >OpenCL和C++:事件不能正常工作

OpenCL和C++:事件不能正常工作
EN

Stack Overflow用户
提问于 2019-05-27 15:08:10
回答 1查看 123关注 0票数 0

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

我正在定义一个类,它将事件存储为成员std::vector<cl::Event*> m_lastaccesses中的指针。在类实例AB之间调用enqueueWriteBuffer时,调用enqueueWriteBuffer时,将blockingWrite设置为CL_FALSEA.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++包装器释放或修改

EN

回答 1

Stack Overflow用户

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56328579

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档