如何将字符串转换为cl_uchar*

How to convert a string into cl_uchar *?

本文关键字:cl uchar 转换 字符串      更新时间:2023-10-16

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

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

cl_uchar *

将其传递给cl内核函数

__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*转换为const cl_uchar*,因为您只是将其复制到缓冲区中,并且在支持OpenCL的平台上,可以假设charcl_uchar具有相同的位表示,尽管对于字符串文字,您应该首先使用const char*而不是char*

顺便说一句,由于内核中的数据无论如何都是const,并且字符串可能没有那么大,因此您可能需要考虑使用__contant而不是__global内存,这可能具有性能优势(至少在较旧的硬件上,__constant内存是缓存的,而__global不是缓存的)。

这应该在没有警告的情况下工作错误:

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