我开始倾向于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);
然而,这给了我一个带有“双重免费或损坏”错误的段错误。我究竟做错了什么?
答案 0 :(得分:5)
要获取string
中的数据地址,您需要使用&origBuf[0]
,而不是&origBuf
- 后者会提供std::string
对象本身的地址,如果你想访问实际的字符串,那就不是你想要的。
对于缓冲区地址的只读版本,您也可以使用origBuf.data()
,但这并不是要写入的。
当然,你绝对不能写过当前的size()
。