OpenCL-并非每次都读取访问冲突

时间:2019-02-08 14:59:53

标签: c++ opencl

我有一个以前从未见过的错误。

我有一个要在设备(AMD)上写入的缓冲区,执行queue.finish()时出现访问冲突读取位置错误。

并且我搜索没有发现任何东西,除了如果我以阻塞模式(CL_TRUE)运行enqueueReadBuffer(),一切都会正常。但是,如果我仅将标志更改为blocking == CL_FALSE,则会因访问冲突而中断。

我缺少什么吗?我已经运行了一段时间了,我的Nvidia卡没有问题,只有AMD对此感到疯狂。

我不想仅仅为了在设备上写而强行阻塞队列。

这是我的writeBuffer函数:

void Wrapper::writeBuffer(const cl::Buffer& buffer, const cl_bool blocking,
                                   const size_t sizeData, void * const dataPtr,
                                   cl::Event* ev, const std::vector<cl::Event>& waitList)
{
    cl_int err = ManagerInstance().GetQueue().enqueueWriteBuffer(buffer, blocking, 0, sizeData, dataPtr,
                                                                 ( waitList.size() > 0 ) ? &waitList : NULL,
                                                                 ( ev != NULL ) ? ev : NULL);
    Utils::Function::checkOpenCLError(err, "OCL::Wrapper::writeBuffer - Failed to write buffer on device.");
}

编辑:

这是我做错事情的一个小例子,实际代码更加复杂(主机处理和设备之间的混合体),因此不明显,因为myPtr可以在主机上进行处理,然后在{{ 1}}。

foo

问题在于,智能指针在writeBuffer完成之前已释放。 ev.wait()应该在返回之前在cl::Event foo(...) { // allocation of the dataPtr. std::unique_ptr<Data> myPtr = ...; cl::Event evWrite; Wrapper::writeBuffer(buffer, CL_FALSE, size, myPtr, &evWrite); return evWrite; } auto ev = foo(); ev.wait(); 内部执行。

0 个答案:

没有答案