文字列を変換 (キャスト) するにはどうすればよいですか
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*
同様に、実際に を に変換する必要はありません。これはconst cl_uchar*
、それをバッファーにコピーし、OpenCL をサポートするプラットフォーム上にあるだけであり、同じビット表現を持つとchar
見なすことができますが、文字列リテラルの場合は代わりに使用する必要があります。そもそもの。cl_uchar
const char*
char*
ところで、const
とにかくデータはカーネル内にあり、文字列はそれほど大きくない可能性が高いため、メモリ__contant
の代わりに使用することを検討することをお勧めし__global
ます。これにはパフォーマンス上の利点がある可能性があります (少なくとも古いハードウェアでは、メモリはキャッシュされていましたが、__constant
メモリはキャッシュされていませんでした__global
。 t)。