Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
OpenCL 1.2:mem_fence()或barrier()或两者_Opencl_Memory Barriers_Barrier_Memory Fences - Fatal编程技术网

OpenCL 1.2:mem_fence()或barrier()或两者

OpenCL 1.2:mem_fence()或barrier()或两者,opencl,memory-barriers,barrier,memory-fences,Opencl,Memory Barriers,Barrier,Memory Fences,我刚刚开始OpenCLC编程。工作组的所有工作项都会更新本地内存的唯一位置。之后,基于由另外两个工作项更新的本地数据更新工作项的私有变量。大概是这样的: __kernel MyKernel(__global int *in_ptr) { /* Define a variable in private address space */ int priv_data; /* Define two indices in

我刚刚开始OpenCLC编程。工作组的所有工作项都会更新本地内存的唯一位置。之后,基于由另外两个工作项更新的本地数据更新工作项的私有变量。大概是这样的:

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

虽然上面的代码片段比较保守,但barrier不会像内部击剑一样完成这项工作吗?

是的,barrier已经击剑了

屏障将在该点同步执行。因此,所有之前的指令都必须执行,因此内存在这一点上是一致的。 围栏只能确保在执行任何进一步的读/写操作之前完成所有读/写操作,但工作人员可能正在执行不同的指令


在某些情况下,你可以用一个击剑。如果您不关心本地工作进程失去同步,而只希望完成以前的内存写入/读取。对你来说,一道篱笆就足够了。(除非该代码在循环中运行,并且您没有在示例中添加额外的代码)。

是的,barrier已经完成了。然而,在某些情况下,你可以使用一个单独的围栏。如果您不关心本地工作进程失去同步,而只希望完成以前的内存写入/读取。对你来说,一道篱笆就足够了。(除非该代码在循环中运行,并且示例中没有添加额外的代码)。谢谢。请您定期提交答案,以便接受?