ローカル配列にいくつかの部分結果を格納する前に、 を1つの値に減らす(下記の例を参照)。縮小プロセス が開始される前に、すべてのスレッドが部分的に 部分データを正常に書き込むことができるようにバリアが配置されます。ただし、バリアでは、一時配列の値が のデフォルト値(つまりfloatの場合は0.0f)にリセットされます。OpenCL:バリアブル呼び出しの後に__local配列の値が失われる
最小例:
__kernel void simulate_plate(__local float *partial)
{
__private int lpos;
lpos = get_local_id(0) + get_local_id(1) * get_local_size(1);
partial[lpos] = 1;
barrier(CLK_LOCAL_MEM_FENCE);
// At this point partial[i] == 0 for all i
// reduce data...
}
引数partial
は以下のイニシャライザを有する:
clSetKernelArg(kernel, 0, local_group_size * sizeof(float), NULL);
clSetKernelArg()コールステータスコードCL_SUCCESS
を返し、カーネル はエラーなしで終了します。
別の観察はスワップラインpartial[lpos] = 1
と barrier(CLK_LOCAL_MEM_FENCE)
が所望の結果を達成することである--- のすべてのコンポーネント1.
この動作ははるかに高く評価されるだろうが起こる理由任意の入力に今等しいアレイpartial
。