2017-12-19 29 views
0

OpenCLカーネルに文字列を渡そうとしています。ここに私のC++コード省略です:OpenCLカーネルにstd :: stringを渡します。

std::string a = "abcd"; 
char *aChar = new char[a.size()+1]; 
aChar[a.size()] = 0; 
memcpy(aChar, a.c_str(), a.size()); 

cl::Buffer serverKeyBuffer(context, CL_MEM_READ_ONLY | CL_MEM_HOST_READ_ONLY, sizeof(char) * a.size(), aChar); 

署名カーネルのは、次のとおりです。

__kernel void MyKernel(__global float* rollNumber, __global char* a) 

私は-51(CL_INVALID_ARG_SIZE)を得続けます。なぜサイズが無効になるのかわからない

+0

どのAPI呼び出しがエラーコードを返していますか? – Dithermaster

+0

は 'CL_MEM_COPY_HOST_PTR'を使うかもしれません。文字列を 'std :: string'からコピーする必要もありません。 – tmlen

+0

@Dithermasterそれは 'kernel.setArg'コール – atr07

答えて

1

あなたはからsetArgに渡していますか?バッファ引数(arg_sizeのパラメータがclSetKernelArg)を渡す正しい長さは、sizeof(cl_mem)(通常は== sizeof(void *))で、バッファの基礎となるストレージのサイズではありません。残念ながら、私はC++ APIとそれが引数をどのように扱うかについてよく分かりません...

+0

でした。' setArg'に 'serverKeyBuffer'を渡しました。 C++ラッパー 'setArg'は' clSetKernelArg'をラップします。それで 'clSetKernelArg(kernel、0、sizeof(cl_mem)、aChar)'のようなものになります。 – atr07

0

これは動作しています。私はこれをバッファーとして渡していないことに気付きました。ここに固定コードがあります:

std::string a = "abcd"; 
char *aChar = new char[a.size()+1]; 
aChar[a.size()] = 0; 
memcpy(aChar, a.c_str(), a.size()); 

cl::Buffer serverKeyBuffer(context, CL_MEM_READ_ONLY, strlen(aChar), NULL); 
kernel.setArg(1, serverKeyBuffer); 

... 

queue.enqueueWriteBuffer(serverKeyBuffer, CL_TRUE, 0, strlen(aChar), aChar); 
関連する問題