将 std::string 传递给 OpenCL 内核
Pass std::string to OpenCL Kernel
我正在尝试将字符串传递到 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)。不太确定为什么尺寸无效
您将 serverKeyBuffer
传递给 setArg
对吗?传递缓冲区参数(clSetKernelArg
的 arg_size
参数)的正确长度是 sizeof(cl_mem)
(通常 == sizeof(void*))——而不是缓冲区底层存储的大小。不幸的是,我不太了解 C++ API 以及它如何处理参数...
成功了。我意识到我没有将其作为缓冲区传递。这是固定代码:
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);
我正在尝试将字符串传递到 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)。不太确定为什么尺寸无效
您将 serverKeyBuffer
传递给 setArg
对吗?传递缓冲区参数(clSetKernelArg
的 arg_size
参数)的正确长度是 sizeof(cl_mem)
(通常 == sizeof(void*))——而不是缓冲区底层存储的大小。不幸的是,我不太了解 C++ API 以及它如何处理参数...
成功了。我意识到我没有将其作为缓冲区传递。这是固定代码:
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);