CUDA:在warp reduction和volatile关键字中

时间:2014-01-18 14:33:10

标签: c++ cuda reduction

从以下内容阅读问题及答案后 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关键字会导致性能下降吗?

1 个答案:

答案 0 :(得分:7)

从该代码中删除volatile关键字可以在Fermi和Kepler GPUS上破坏该代码。那些GPU缺乏直接操作共享内存的指令。相反,编译器必须向寄存器发出加载/存储对。

volatile关键字在此上下文中的作用是使编译器遵循加载 - 操作 - 存储周期,而不执行将s_data[tid]的值保持在寄存器中的优化。保持寄存器中累加的总和将破坏使得该warp级共享存储器求和正确工作所需的隐式存储器同步。