2017-06-08 5 views
0

私は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]; 
     } 

上記のスニペットは控えめですがは、障壁は仕事をしているではないでしょうか?

+1

はい、障壁はすでにフェンシングしています。しかし、場合によっては、単一のフェンシングで行くことができます。現地の従業員が同期を外していても気にしない場合でも、以前のメモリの書き込み/読み取りを完了したいだけの場合。 あなたの場合、フェンスで十分でしょう。 (そのコードがループ内で実行されておらず、例に入れていない余分なコードがある場合を除きます)。 – DarkZeros

+0

ありがとうございます。受け入れられるように通常の回答として提出してください。 – Raj

答えて

0

はい、バリアは既にフェンシングしています。

バリアはそのポイントで実行を同期させます。したがって、以前のすべての命令を実行する必要があるため、その時点でメモリは一貫しています。 フェンスは、それ以上の読み取り/書き込みが実行される前にすべての読み取り/書き込みが終了することを保証しますが、ワーカーは異なる命令を実行している可能性があります。

場合によっては、単一のフェンシングで行くことができます。現地の労働者が同期を外しているのを気にしない場合、以前のメモリの書き込み/読み取りを完了したいだけです。あなたの場合、フェンスで十分でしょう。 (そのコードがループ内で実行されておらず、例に入れていない余分なコードがある場合を除きます)。

関連する問題