主机和设备缓冲区之间的复制



我开始精简OpenCL,我想从主机缓冲区复制到设备缓冲区,然后再复制到另一个主机缓冲区。我正在使用OpenCL的c++包装器。

我有这个:

std::string origBuf("Hello OpenCL");
cl::Buffer::Buffer deviceBuf(context, CL_MEM_READ_WRITE, origBuf.size());
queue.enqueueWriteBuffer(deviceBuf, CL_TRUE, 0, origBuf.size(), &origBuf);
std::string hostBuf("???????????????");
queue.enqueueReadBuffer(deviceBuf, CL_TRUE, 0, origBuf.size(), &hostBuf);

然而,这给了我一个"双重免费或损坏"错误。我到底做错了什么?

要获得string中数据的地址,您需要使用&origBuf[0],而不是&origBuf——后者提供了std::string对象本身的地址,如果您想访问实际字符串,这不是您想要的。

对于缓冲区地址的只读版本,您也可以使用origBuf.data(),但这并不意味着要写入。

当然,你绝对不能写超过当前的size()

最新更新