cuda - 等效于 CUDA 中的屏障(CLK_GLOBAL_MEM_FENCE)
问题描述
在 CUDA中调用barrier(CLK_GLOBAL_MEM_FENCE)
(OpenCL) 的等价物是什么?
它应该等到块中的所有线程都到达屏障。并且在屏障之前完成的全局内存访问应该对屏障之后块中的所有线程可见。
这样做是否足够,或者对于全局内存围栏__syncthreads()
是必要的,还是两者兼而有之?__threadfence()
如果是这样,应该以什么顺序调用两者?
解决方案
您可能希望在此处阅读有关内存栅栏和执行障碍的 CUDA 文档。
__syncthreads()
既是执行屏障(对于块中的线程),也是共享和全局内存操作的内存栅栏。对于全局内存操作,围栏强制仅针对块中的线程。
这里的栅栏有一个特定的含义:在栅栏之前发生的内存操作,对于在栅栏之后发生的操作之前实际发生的(即可见的)块中的其他线程具有可见性。请查看已链接的文档以获取详细说明。
如果您还需要块外的(全局内存)防护(即网格中的所有线程),那么您还必须使用__threadfence()
. 不像__syncthreads()
,__threadfence()
不是任何类型的执行障碍。它只是一个记忆栅栏。
调用的顺序无关紧要(只要没有干预操作)。栅栏是一个分界点,其功能__threadfence()
是包含在其中的栅栏功能的超集__syncthreads()
推荐阅读
- python - 如何在python中找到几种类型的最新共同祖先(基本类型)?
- ios - IOS 13 自动化要求运行
- javascript - 内存中的 ReactJS 虚拟 DOM 并应用增量更改
- javascript - 在 Nightwatch 中选择 tabindex
- c - 如何在装配循环后转移控制?
- java - 如何在 Groovy 中使用 Graalvm 的 Truffle 框架?
- ruby-on-rails - 如何从 Rails 日志中删除 [Thr-1]?
- .htaccess - 如何重写一批相似的url
- c# - 在 ASP.NET CORE 中并非所有实体都具有 Id 属性时实现基实体类
- android - ListView 总是从 CustomAdaptor 中删除最后一行