从以下内容阅读问题及答案后 LINK
我仍然有一个问题在脑海里。从我在C / C ++中的背景;我知道使用volatile
有它的缺点。此外,在CUDA的情况下,如果不使用volatile
关键字,优化可以用寄存器代替共享数组以保留数据。
我想知道在计算(总和)减少时可能遇到的性能问题。 e.g。
__device__ void sum(volatile int *s_data, int tid)
{
if (tid < 16)
{
s_data[tid] += s_data[tid + 16];
s_data[tid] += s_data[tid + 8];
s_data[tid] += s_data[tid + 4];
s_data[tid] += s_data[tid + 2];
s_data[tid] += s_data[tid + 1];
}
}
我正在使用经线缩减。由于warp中的所有线程都是同步的,因此我认为不需要使用syncthreads()
构造。
我想知道会删除关键字volatile
弄乱我的总和(由于cuda优化)?我可以在没有volatile
关键字的情况下使用此类缩减。
由于我多次使用此缩减功能,volatile
关键字会导致性能下降吗?
答案 0 :(得分:7)
从该代码中删除volatile关键字可以在Fermi和Kepler GPUS上破坏该代码。那些GPU缺乏直接操作共享内存的指令。相反,编译器必须向寄存器发出加载/存储对。
volatile关键字在此上下文中的作用是使编译器遵循加载 - 操作 - 存储周期,而不执行将s_data[tid]
的值保持在寄存器中的优化。保持寄存器中累加的总和将破坏使得该warp级共享存储器求和正确工作所需的隐式存储器同步。