【发布时间】:2013-11-13 11:48:24
【问题描述】:
我无法弄清楚以下内容。
如果我启动一个内核并考虑,例如,在0 块中的线程0,在调用__syncthreads() 之后,所有其他块中的所有其他线程是否会看到线程对全局内存所做的更改0 在块中 0?
我的猜测是没有。事实上,在 CUDA C 编程指南的 synchronization functions 部分中,声明:
void __syncthreads();等待,直到 线程块中的所有线程 都达到这一点,并且这些线程在__syncthreads()之前进行的所有全局和共享内存访问对 块中的所有线程 都是可见的.
但是,当谈到动态并行中的 global memory consistency 时,CUDA C 编程指南指出:
只有在第二次
__syncthreads()调用之后,父网格的其他线程才可以使用这些修改。
那么__syncthreads() 是否也会在涉及动态并行时跨块提供更改?
谢谢
【问题讨论】:
-
关于您的第一个问题,您的结论是正确的,因为 CUDA 不允许以稳健的方式启用跨块同步。 NVIDIA 论坛上有一个名为 Synchronize all blocks in CUDA 的讨论,您可能感兴趣。
-
关于内存一致性,参考你说的具体例子,我认为指南只是说你需要第一个
__synchthreads()来保证父子内核的全局内存一致,因为所有设备端内核启动都是异步的(这在 CUDA Dynamic Parallelism Programming Guide 中提到)。需要第二个__synchthreads()调用来确保同一线程块内的内核之间的全局内存一致性,因为启动的子内核可能需要不同的处理时间才能完成。 -
查看Memory Fence Functions 中的
__threadfence_system(),了解一种使一个线程编写的内容在整个设备上可见的方法。
标签: cuda