c++ - OpenCL 和 C++:事件无法正常工作
问题描述
我很迷茫,但幸运的是我将问题缩小到几行代码。
我正在定义一个将事件存储为 member 中的指针的类std::vector<cl::Event*> m_lastaccesses
。在operator=
类实例A
和之间的调用中B
,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()
operator=
CL_FALSE
A.m_lastaccesses[0]->wait()
operator=
A.m_lastaccesses[0]
我的猜想是某些引用计数出乎意料地工作并且cl::Event
被 OpenCL 的 C++ 包装器释放或修改
解决方案
所以......你有一个指针向量:
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 源代码。没那么复杂。
推荐阅读
- python-3.x - 使用 MQTT 传感器读数刷新 GUIZERO 文本。还没有正确更新
- ruby-on-rails - Ruby/Rails 词典应用程序 - 由两个连接的较小单词组成的 6 个字母单词查找器
- python - 在python中解析多个日期
- java - 关于按位补码运算符(Java)的问题
- ios - 我是否需要处理来自 Firebase 远程配置的限制异常?
- c - 结构数组不保留值
- windows - 即使在 powershell 脚本中分配权限后,对删除项目的访问也被拒绝
- javascript - 自定义表情符号反应角色
- azure-web-app-service - 将自定义域添加到 webapp 并稍后更改
- tcsh - tcsh:意外标记“换行符”附近的语法错误