CのホストコードからOpenCLカーネル関数にベクトル型(uint8)パラメーターを渡すのに問題があります。
ホストでは、データを配列に入れています。
cl_uint dataArr[8] = { 1, 2, 3, 4, 5, 6, 7, 8 };
(私の実際のデータは[1、8]だけではありません。これは、説明を簡単にするためです。)
次に、データをバッファに転送してカーネルに渡します。
cl_mem kernelInputData = clCreateBuffer(context,
CL_MEM_READ_ONLY | CL_MEM_COPY_HOST_PTR, sizeof(cl_uint)*8, dataArr, NULL);
次に、このバッファをカーネルに渡します。
clSetKernelArg(kernel, 0, sizeof(cl_mem), &kernelInputData);
そして、カーネル関数のシグネチャは次のようになります。
kernel void kernelFunction(constant uint8 *vectorPtr)
ただし、カーネルはへのポインタから正しい入力データを取得していないようですkernelInputData
。カーネル内から値を返すvectorPtr
と、この構造を持つものを指していることがわかります。( 1, 2, 3, 4, 5, ?, ?, ? )
疑問符は通常 4293848814
ですが、場合によっては0
です。いずれにせよ、彼らがどうあるべきかではありません。
私は何が間違っているのですか?
編集:
ホスト側で配列の使用からcl_uint8に切り替えました。私は今持っています:
cl_uint8 dataVector = { 1, 2, 3, 4, 5, 6, 7, 8 };
そして、私はこのベクトルを次のようにカーネルに渡します。
clSetKernelArg(kernel, 0, sizeof(cl_uint8), &dataVector);
そして、カーネル関数のシグネチャは次のようになります。
kernel void kernelFunction(constant uint8 *vectorPtr)
ただし、このコードを実行すると、でCL_INVALID_ARG_SIZE
エラーが発生しclSetKernelArg()
ます。ARG_SIZE
パラメータをに切り替えると、このエラーはsizeof(cl_uint8 *)
なくなりますが、内でEXC_BAD_ACCESS
エラーが発生します。__dynamic_cast
clSetKernelArg()
私のデバイスは:
Apple Macbook Pro(2009年半ば)
OSX 10.8 Mountain Lion
NVIDIA GeForce 9400M
OpenCL 1.0
CLH 1.0