如何转换(转换)字符串
char* password = "C & OpenCL is cool";
到
cl_uchar *
将其传递给 cl-kernel 函数
__kernel void foobar(__global const uchar * input_data) {...}
?
您不能直接将该char指针传递给 OpenCL 内核,因为内核不知道如何处理该指针。您在内核中拥有的是指向__global内存的指针。因此,您需要做的是创建一个 OpenCL 缓冲区对象,将字符串写入其中并将句柄作为参数传递给该缓冲区作为内核的参数。如果您不知道这是如何完成的,请查阅适当的 OpenCL 学习资源。在 C++ 中,它会类似于以下内容:
cl::Buffer input_buffer(context, CL_MEM_READ_ONLY | CL_MEM_COPY_HOST_PTR,
sizeof(cl_uchar) * (strlen(password)+1), password);
...
kernel.setArg(0, input_buffer);
同样,您不必将其实际转换char*为 a const cl_uchar*,因为您只是将其复制到缓冲区和支持 OpenCL 的平台上char,并且cl_uchar可以假定具有相同的位表示,尽管对于字符串文字,您应该const char*使用char*首先。
顺便说一句,由于数据const无论如何都在内核中并且字符串可能不是那么大,您可能需要考虑使用__contant而不是__global内存,这可能具有性能优势(至少在旧硬件上,__constant内存被缓存而__global没有) t)。
这应该可以在没有警告和错误的情况下工作:
const char* pwd = "C & OpenCL is cool";
cl_uchar * password = (cl_uchar*) &pwd;
cl::Buffer bufferA(context, CL_MEM_READ_ONLY | CL_MEM_COPY_HOST_PTR, sizeof(cl_uchar) * keyBytes, password);
kernel.setArg(0, bufferA);