私はOpenCLプログラムを書いていますが、バッファをすべてゼロとして読み込んでいます。インテルSDKのトレースに目を通すと、バッファ引数を設定するときにCL_INVALID_ARG_VALUEが得られることがわかりました。 (スカラー引数を設定してもエラーは発生しません)バッファの引数を設定するときのCL_INVALID_ARG_VALUE
私はOpenCL C++バインディング(cl.hpp)を使用しています。
私のコードは長いので、テストプログラムで問題を再現しました。
cl::CommandQueue queue(context, devices.front());
cl::Buffer resultsBuf(context, CL_MEM_WRITE_ONLY | CL_MEM_HOST_READ_ONLY, sizeof(cl_short) * 2048);
cl::Buffer inputBuf(context, CL_MEM_READ_ONLY | CL_MEM_HOST_WRITE_ONLY | CL_MEM_COPY_HOST_PTR, sizeof(cl_uchar) * 2048, input.data());
queue.enqueueWriteBuffer(inputBuf, CL_TRUE, 0, sizeof(cl_uchar) * 2048, input.data());
// Execution of the following two lines produces CL_INVALID_ARG_VALUE for both.
err = kernel.setArg(0, resultsBuf);
err = kernel.setArg(1, inputBuf);
// Execution of the following line produces CL_INVALID_KERNEL_ARGS
err = queue.enqueueTask(kernel);
vector<cl_short> result(2048);
err = queue.enqueueReadBuffer(resultsBuf, CL_TRUE, 0, sizeof(cl_short) * 2048, result.data());
とカーネルコード:
__kernel void myKernel(
__local short* resultsBuf,
__local uchar* inputBuf
) {
for (int i = 0; i < 2048; ++i) {
resultsBuf[i] = -3;
}
}
input
は、それがまだ何のために使用されていない、いくつかのテストデータで埋めvector<cl_uchar>(2048)
です。私がこのテストケースから期待しているのは、値-3で満たされたバッファを読み戻すことだけです。
私は私がオンラインで見つけた他のサンプルと私のコードを比較しましたが、何も私には奇妙に飛び出しませんでした。私は様々な小さな調整(memフラグの変更など)を試みました。状況。
バッファーについて見落としたことはありますか?
(妙に私のテストプログラムは、いくつかのジャンクバイトでresult
を埋めるのか?)
ありがとう。私は正直に、私はこれについての選択肢があると思った。 – braks
私はカーネルの引数を__privateに設定したのを知っています。エラーが出ます: "カーネル関数へのポインタ引数は '__global'、 '__constant'または '__local'のアドレス空間になければなりません。それは__localを使うことが可能かもしれないことを暗示しているようです。 – braks
inputBufでは問題なく__constantにすることができます。私は別のケースがあると思います。 __localの詳細はこちら:https://stackoverflow.com/questions/30249801/passing-arguments-through-local-memory-in-opencl – braks