0
    __kernel void cl_test(__global int* Number)
    {
       int id = get_global_id(0);
       if (id%5==0)
       {
           Number[0]++;
       }
       if (id%10==0)
       {
           Number[1]++;
       }
    }

ご覧のとおり、これは非常に単純な OpenCL カーネル テスト コードです。目的は、範囲内で 5 と 10 で割り切れる数を収集することです。

ここに問題があります。すべての作業項目の計算は純粋な並列計算ではないため、異なる項目の Number[0] または [1] が関連しています。Number[0] または Number[1] を読み取っても正しい結果が得られません。

C++ の「グローバル変数」のような解決策はありますか?

ありがとう!

4

2 に答える 2

4

アトミック操作を使用する必要があります。

__kernel void cl_test(__global int* Number)
{
   int id = get_global_id(0);
   if (id%5==0)
   {
       atomic_inc(Number);
   }
   if (id%10==0)
   {
       atomic_inc(&Number[1]);
   }
}

アトミック操作は、スレッド間で正しく動作することを確認するため、正確にかなり遅くなる傾向があるため、これらの使用はできるだけ避ける必要があります。

于 2014-01-07T13:05:09.563 に答える
2

アトミック加算は加算問題を解決します

 __kernel void cl_test(__global int* Number)
    {
       int id = get_global_id(0);
       if (id%5==0)
       {
           atomic_add( Number, 1 );
       }
       if (id%10==0)
       {
           atomic_add( Number +1, 1 );
       }
    }
于 2014-01-07T13:05:43.087 に答える