2017-08-07 13 views
0

私は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を埋めるのか?)

答えて

3

あなたがグローバルメモリを使用する必要があり、ホストとGPUの間に、バックデータを渡すために。これはホスト側でOKですが、カーネルでは__localという名前のメモリアドレス指定子を使用します。これは、名前が示すようにカーネル内でローカルに使用されることを意味します。 修正されたカーネルを使用する__global

__kernel void myKernel(
    __global short* resultsBuf, 
    __global uchar* inputBuf 
) { 
    for (int i = 0; i < 2048; ++i) { 
     resultsBuf[i] = -3; 
    } 
} 
+0

ありがとう。私は正直に、私はこれについての選択肢があると思った。 – braks

+0

私はカーネルの引数を__privateに設定したのを知っています。エラーが出ます: "カーネル関数へのポインタ引数は '__global'、 '__constant'または '__local'のアドレス空間になければなりません。それは__localを使うことが可能かもしれないことを暗示しているようです。 – braks

+0

inputBufでは問題なく__constantにすることができます。私は別のケースがあると思います。 __localの詳細はこちら:https://stackoverflow.com/questions/30249801/passing-arguments-through-local-memory-in-opencl – braks

関連する問題