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

C++ 如何将字符串转换为cl_uchar*?,c++,opencl,C++,Opencl,如何转换(强制转换)字符串 到 将其传递给cl核函数 __kernel void foobar(__global const uchar * input_data) {...} ?您不能直接将该char指针传递到OpenCL内核,因为内核不知道如何使用该指针。内核中有一个指向\uu全局内存的指针。因此,您需要做的是创建一个OpenCL缓冲区对象,将字符串写入其中,并将该缓冲区的句柄作为参数传递给内核。如果您不知道这是如何做到的,请咨询适当的OpenCL学习资源。在C++中,它会有类似的情况:

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

将其传递给cl核函数

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

您不能直接将该
char
指针传递到OpenCL内核,因为内核不知道如何使用该指针。内核中有一个指向
\uu全局
内存的指针。因此,您需要做的是创建一个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\u uchar*
,因为您只是将其复制到缓冲区中,并且在支持OpenCL
char
的平台上,
cl\u uchar
可以假定具有相同的位表示,虽然对于字符串文字,您应该首先使用
const char*
而不是
char*


顺便说一句,由于数据在内核中是<代码> const ,而且字符串可能不那么大,所以您可能需要考虑使用Sy-Ctruts而不是GyGuangs内存,这可能具有性能优势。(至少在较旧的硬件上,

\uuuu常量
内存被缓存,而
\uu全局
没有缓存)。

这应该可以正常工作,不会出现警告和错误:

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

cl\u uchar
似乎是
unsigned char
的一个typedef。那么
const cl\u uchar*s=(const cl\u uchar*)“string literal”
?但是opencl使用u常量指定一个常量地址空间。这个常量也可以和const相同吗?它会在cl::Buffer中导致一个错误。我试过char*pwd=“C&opencl很酷”;密码=(密码*)&pwd;-没有错误,但它不是常量。下一个问题是,它是否必须是常量。谢谢你的回答。使用cl::buffer是清楚的。使用uu常量而不是u全局会导致错误:clBuildProgram:-11。@marcus和什么是
-11
?构建日志会说什么?可能
\uu常量常量
不是最好的方法dea.I在没有额外常量的情况下将_全局更改为_常量。没有要签出的日志。它只是无法运行重试错误-11。@marcus您的意思是由
cl::Program::getBuildInfo()
返回的生成日志为空?使用cl::Program::getBuildInfo()导致编译器错误这与我的答案中的版本有什么不同,它也应该在没有警告和错误的情况下工作?从
const char*
cl\u uchar*
的额外强制转换是完全没有用的。与您可能认为的相反,这个额外强制转换根本没有添加任何额外的类型安全性,since这只是一个重新解释的转换,就像直接将
常量char*
放入缓冲区一样。好吧,是的,这是否证明了其他答案的合理性和额外的答案,但是,考虑到其他现有答案已经有完全相同的源代码?请记住这个站点。Kill me;)我认为完整的答案也包含代码,所以ppl,谁能在谷歌上找到同样的问题找到这篇文章也会有一个直接的解决方案,他们可以试试。很抱歉一直打扰你,但我虽然这可能是真的,但我仍然看不出这段代码与另一个答案中的代码有什么不同。你可能想详细说明一下。正如《毫无用处》中第二行所说,第一行已经是你的问题代码的一部分,第三行和第四行是已经存在的答案的精确副本,只是没有任何解释。
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);
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);