1

openCL C プログラミングを始めたばかりです。ワーク グループのすべてのワーク アイテムは、ローカル メモリの一意の場所を更新します。その後、他の 2 つのワークアイテムによって更新されたローカルデータに基づいて、ワークアイテムのプライベート変数が更新されます。このようなもの:

__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];
       }

上記のスニペットは保守的ですが、バリアは内部でフェンシングを行っているため、その役割を果たしているのではないでしょうか?

4

1 に答える 1