我开始精简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()
。