使用按位移位而不是mod时,CUDA的时间差异很大

时间:2017-01-08 19:43:20

标签: c++ cuda gpgpu gpu-programming

我对CUDA编程比较陌生,我正在测试不同的简单内核,以查看执行时间的差异。

我有两个内核,对我也这样做:

__global__ void mathKernel2(float *c)
{
int tid = blockIdx.x * blockDim.x + threadIdx.x;
float ia, ib;
ia = ib = 0.0f;

    if ((tid / warpSize) % 2 == 0)
    {   
        ia = 100.0f;
    }
    else
    {   
        ib = 200.0f;
    }

    c[tid] = ia + ib;
}

另一个:

__global__ void mathKernel4(float *c)
{
    int tid = blockIdx.x * blockDim.x + threadIdx.x;
    float ia, ib;
    ia = ib = 0.0f;

    int itid = tid >> 5;

    if (itid & 0x01 == 0)
    {   
        ia = 100.0f;
    }
    else
    {   
        ib = 200.0f;
    }

    c[tid] = ia + ib;
}

我用-g -G编译它以摆脱优化并得到:

mathKernel2 <<< 8192   32 >>> elapsed 0.000259 sec 
mathKernel4 <<< 8192   32 >>> elapsed 0.000103 sec 

为什么差异如此之大?

1 个答案:

答案 0 :(得分:3)

这一行:

if (itid & 0x01 == 0)

读作:

if (itid & (0x01 == 0))

在编译时评估到false,其中一个分支被删除。

按位二元运算符在C / C ++和CUDA中具有相当低的优先级。