私はopenCL Cプログラミングを開始しました。ワークグループのすべての作業項目は、ローカルメモリの固有の場所を更新します。その後、作業項目のプライベート変数は、2つの他の作業項目によって更新されたローカルデータに基づいて更新されます。このような何か:それは内部的にフェンシングをするようOpenCL 1.2:mem_fence()またはbarrier()またはその両方
__kernel MyKernel(__global int *in_ptr)
{
/* Define a variable in private address space */
int priv_data;
/* Define two indices in private address space */
int index1, index2;
/* index1 and index2 are legitimate local work group indices */
index1 = SOME_CORRECT_VALUE;
index2 = ANOTHER_CORRECT_VALUE;
/* Define storage in local memory large enough to cater to all work items of this work group */
__local int tempPtr[WORK_GROUP_SIZE];
tempPtr[get_local_id(0)] = SOME_RANDOM_VALUE;
/* Do not proceed until the update of tempPtr by this WI has completed */
mem_fence(CLK_LOCAL_MEM_FENCE);
/* Do not proceed until all WI of this WG have updated tempPtr */
barrier(CLK_LOCAL_MEM_FENCE);
/* Update private data */
priv_data = tempPtr[index1] + tempPtr[index2];
}
上記のスニペットは控えめですがは、障壁は仕事をしているではないでしょうか?
はい、障壁はすでにフェンシングしています。しかし、場合によっては、単一のフェンシングで行くことができます。現地の従業員が同期を外していても気にしない場合でも、以前のメモリの書き込み/読み取りを完了したいだけの場合。 あなたの場合、フェンスで十分でしょう。 (そのコードがループ内で実行されておらず、例に入れていない余分なコードがある場合を除きます)。 – DarkZeros
ありがとうございます。受け入れられるように通常の回答として提出してください。 – Raj