将std :: string传递给OpenCL内核

时间:2017-12-19 23:21:48

标签: c++ opencl

我正在尝试将字符串传递给OpenCL内核。这是我的c ++代码缩写:

std::string a = "abcd";
char *aChar = new char[a.size()+1];
aChar[a.size()] = 0;
memcpy(aChar, a.c_str(), a.size());

cl::Buffer serverKeyBuffer(context, CL_MEM_READ_ONLY | CL_MEM_HOST_READ_ONLY, sizeof(char) * a.size(), aChar);

内核的签名是:

__kernel void MyKernel(__global float* rollNumber, __global char* a)

我一直得到-51(CL_INVALID_ARG_SIZE)。不确定为什么尺寸无效

2 个答案:

答案 0 :(得分:3)

搞定了。我意识到我并没有将其作为缓冲区传递。这是固定代码:

std::string a = "abcd";
char *aChar = new char[a.size()+1];
aChar[a.size()] = 0;
memcpy(aChar, a.c_str(), a.size());

cl::Buffer serverKeyBuffer(context, CL_MEM_READ_ONLY, strlen(aChar), NULL);
kernel.setArg(1, serverKeyBuffer);

...

queue.enqueueWriteBuffer(serverKeyBuffer, CL_TRUE, 0, strlen(aChar), aChar);

答案 1 :(得分:2)

您正在将serverKeyBuffer传递给setArg吗?传递缓冲区参数(arg_size的{​​{1}}参数)的正确长度是clSetKernelArg(通常== sizeof(void *)) - 而不是缓冲区底层存储的大小。不幸的是,我不太了解C ++ API以及它如何处理参数......