首页 > 解决方案 > 等效于 CUDA 中的屏障(CLK_GLOBAL_MEM_FENCE)

问题描述

在 CUDA中调用barrier(CLK_GLOBAL_MEM_FENCE)(OpenCL) 的等价物是什么?

它应该等到块中的所有线程都到达屏障。并且在屏障之前完成的全局内存访问应该对屏障之后块中的所有线程可见。

这样做是否足够,或者对于全局内存围栏__syncthreads()是必要的,还是两者兼而有之?__threadfence()如果是这样,应该以什么顺序调用两者?

标签: cudaopenclgpumemory-barriersbarrier

解决方案


您可能希望在此处阅读有关内存栅栏和执行障碍的 CUDA 文档。

__syncthreads()既是执行屏障(对于块中的线程),也是共享和全局内存操作的内存栅栏。对于全局内存操作,围栏强制仅针对块中的线程。

这里的栅栏有一个特定的含义:在栅栏之前发生的内存操作,对于在栅栏之后发生的操作之前实际发生的(即可见的)块中的其他线程具有可见性。请查看已链接的文档以获取详细说明。

如果您还需要块外的(全局内存)防护(即网格中的所有线程),那么您还必须使用__threadfence(). 不像__syncthreads(),__threadfence()不是任何类型的执行障碍。它只是一个记忆栅栏。

调用的顺序无关紧要(只要没有干预操作)。栅栏是一个分界点,其功能__threadfence()是包含在其中的栅栏功能的超集__syncthreads()


推荐阅读