0

ここに、間違っていると思われるホストプログラムの主要部分を含めました。

http://pastebin.com/qVkv9E11

私はまだポインタが苦手で、いくつかの変数を間違って割り当てたのではないかと思います。

これが私のプログラムが何をしようとしているのかを知るためのカーネルプログラムです:

    const char *KernelSource =           "\n"
"__kernel void sumElements(           \n"
"   __global float* input,            \n"
"   __global float output,            \n"
"   __global int N)                   \n"
"{                                    \n"
"   int i = get_global_id(0);         \n"
"   if(i < N)                         \n"
"       output += input[i];           \n"
"}                                    \n"
"\n";

上記のように1つの変数にSIMTを書き込んだことがないため、おそらくこれがエラーの原因です。そのようなことをすることは可能ですか?配列内のすべての要素の合計を取得する必要があります。

4

1 に答える 1

5

出力の値を実際に読み戻そうとする場合は、それもポインターとして宣言する必要があります。現在、output の値はカーネル引数としてコピーされますが、カーネルが終了すると、それに対する変更は無視されます。

に変更__global float output__global float* outputます。次に、カーネルの変更で:

if(i < N)
    output += input[i];

if(i < N)
    *output += input[i];

これを機能させるには、バッファーの割り当て方法を変更する必要があるかもしれませんが、OpenCL でこれを行ってから長い時間が経ちました。現在見つけているドキュメントでは、明らかなエラーは表示されません。バッファ。

ここで注意が必要です。加算はアトミック操作ではありません。このセットアップでは、必ず 2 つ以上のスレッドが *output の値を読み取ってから、異なる段階で *output + 1 をそれに書き戻そうとします。したがって、*output は本来よりも小さい値になります。

これを修正するには、OpenCL のアトミック操作を使用する必要があります。

于 2012-11-06T15:35:05.853 に答える