在什么情况下应该使用关键字volatile
与CUDA内核的共享内存?据我所知,volatile
告诉编译器从未缓存任何值,但我的问题是关于与共享数组的行为:何时使用volatile共享CUDA内存
__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
,或者它只会缓存元素?
谢谢!
很好的回答,我不知道记忆击剑。谢谢! – 2013-03-11 04:30:31