OpenCL 和 C++:事件无法正常工作
OpenCL and C++: events not working properly
我很迷茫,但幸运的是我将问题缩小到几行代码。
我正在定义一个类,该类将事件存储为成员std::vector<cl::Event*> m_lastaccesses
中的指针。在类实例A
和B
之间调用operator=
时,调用enqueueWriteBuffer
时blockingWrite
设置为CL_FALSE
并A.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源代码。没那么复杂。
- QSqlquery prepare()和bindvalue()不工作
- 导入库可以跨dll版本工作吗
- 以螺旋方式打印矩阵的程序.(工作不好)
- 对象指针在c++中是如何工作的
- 为什么在Windows上的VS 2019和Clang 9中"size_t"在没有标题的情况下工作
- VSOMEIP-2个设备之间的通信(TCP/UDP)不工作
- 为字符串中每 N 个字符插入空格的函数没有按照我认为的方式工作?
- C++为线程工作动态地分割例程
- 为什么我的 std::ref 无法按预期工作?
- 布尔比较运算符是如何在C++中工作的
- SampleConsensusPrerejective(ext.RANSAC)是如何真正工作的
- 不确定要在我的main中放入什么才能使我的代码正常工作
- 为什么std::condition_variable notify_all的工作速度比notify_one快(对于随机请
- <<操作员在下面的行中工作
- 有人能解释一下为什么下界是这样工作的吗C++的
- ExtractIconEx:可以工作,但偶尔会崩溃
- C++中的memset函数工作不正常
- 当我在第一个循环中使用"auto"时,它工作正常,但是使用"int"它会给出错误,为什么?
- 为什么STD ::计数将常数传递给Lambda,而不是在弦上工作时而不是字符
- C++程序已停止工作-求解常微分方程