每个共享/全局内存写入/读取的易失性力直接进入共享/全局内存。这会自动完成threadfenced的功能吗?例如:
volatile __shared__ int s;
s = 2;
s = 10
那么“s = 2”和“s = 10”之间不需要使用threadfence吗?
我们可以说对于volatile变量,不需要threadfence吗?如果没有,任何一个例子?
答案 0 :(得分:1)
对于如下定义的共享内存中的volatile变量:
volatile __shared__ int s;
执行以下行后,threadblock中其他线程的任何访问:
s = 2;
将s
视为包含2,假设没有s
的进一步更新。但是volatile
不会导致任何障碍。 __threadfence()
and its derivatives是执行障碍。在确保共享内存和全局内存(对于__threadfence()
)的更新对其他线程可见之前,有问题的线程不会超出该障碍。
但是,按以下顺序:
s = 2;
s = 10;
无法保证其他线程会看到什么(除了在warp同步情况下,并且还有你未提供的进一步场景描述),除了它们将看到2或10(并且再次假设没有进一步更新s
)。