我有一个以前从未见过的错误。
我有一个要在设备(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();
内部执行。