在CUDA中调用barrier(CLK_GLOBAL_MEM_FENCE)
(OpenCL)相当于什么?
它应该等待,直到块中的所有线程都到达屏障为止。并且在屏障之前完成的全局内存访问应该对屏障之后的块中的所有线程可见。
做__syncthreads()
够了吗?或者__threadfence()
对于全局内存保护栅是必需的,还是两者都需要?如果是这样,应该以什么顺序调用两者?
答案 0 :(得分:4)
您可能希望阅读有关内存限制和执行障碍的CUDA文档here。
__syncthreads()
既是执行障碍(对于块中的线程而言),也是共享和全局内存操作的内存屏障。对于全局内存操作,围栏强制仅针对块中的线程。
此处的防护具有特定含义: 在栅栏之前发生的内存操作将对块中其他线程具有可见性,就像在栅栏之后发生的操作之前实际发生(即可见)一样。请查看已链接的文档以获取详细说明。
如果您还需要在块外(即,对于网格中的所有线程)都设置(全局内存)防护,则还必须使用__threadfence()
。与__syncthreads()
不同,__threadfence()
不是任何形式的执行障碍。它只是一个内存栅栏。
调用顺序无关紧要(只要没有中间操作)。篱笆是一个分界点,__threadfence()
的功能是__syncthreads()