如何将字符串转换为cl_uchar *?

时间:2013-07-06 08:38:54

标签: c++ opencl

如何转换(强制转换)字符串

char* password = "C & OpenCL is cool";

cl_uchar *

将其传递给cl-kernel函数

__kernel void foobar(__global const uchar * input_data) {...}

2 个答案:

答案 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);