0

文字列を変換 (キャスト) するにはどうすればよいですか

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

cl_uchar *

それを cl-kernel 関数に渡す

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

?

4

2 に答える 2

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見なすことができますが、文字列リテラルの場合は代わりに使用する必要があります。そもそもの。cl_ucharconst char*char*

ところで、constとにかくデータはカーネル内にあり、文字列はそれほど大きくない可能性が高いため、メモリ__contantの代わりに使用することを検討することをお勧めし__globalます。これにはパフォーマンス上の利点がある可能性があります (少なくとも古いハードウェアでは、メモリはキャッシュされていましたが、__constantメモリはキャッシュされていませんでした__global。 t)。

于 2013-07-06T09:21:29.613 に答える