在什么情况下你应该在volatile
CUDA 内核的共享内存中使用关键字?我知道这volatile
告诉编译器永远不要缓存任何值,但我的问题是关于共享数组的行为:
__shared__ float products[THREADS_PER_ACTION];
// some computation
products[threadIdx.x] = localSum;
// wait for everyone to finish their computation
__syncthreads();
// then a (basic, ugly) reduction:
if (threadIdx.x == 0) {
float globalSum = 0.0f;
for (i = 0; i < THREADS_PER_ACTION; i++)
globalSum += products[i];
}
在这种情况下我需要products
变得不稳定吗?每个数组条目只能由单个线程访问,除了最后,所有内容都由线程 0 读取。编译器是否有可能缓存整个数组,所以我需要它 volatile
,还是只缓存元素?
谢谢!