如何转换(强制转换)字符串
char* password = "C & OpenCL is cool";
到
cl_uchar *
将其传递给cl-kernel函数
__kernel void foobar(__global const uchar * input_data) {...}
答案 0 :(得分:2)
你不能直接将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*
实际转换为const cl_uchar*
,因为您只是将其复制到缓冲区和支持OpenCL char
和{{的平台上可以假设1}}具有相同的位表示,但对于字符串文字,您应该首先使用cl_uchar
而不是const char*
。
顺便说一句,既然内核中的数据都是char*
且字符串可能不是那么大,你可能要考虑使用const
代替__contant
内存,可能具有性能优势(至少在较旧的硬件上,__global
内存被缓存而__constant
没有)。
答案 1 :(得分:-1)
这应该没有警告'n错误:
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);