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

时间:2014-04-15 13:14:28

标签: c++ opencl

我开始倾向于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);

然而,这给了我一个带有“双重免费或损坏”错误的段错误。我究竟做错了什么?

1 个答案:

答案 0 :(得分:5)

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

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

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