优化Bit-Wise操作内核

时间:2012-07-15 15:13:24

标签: optimization cuda bit-manipulation

我有以下代码,它逐步遍历一串位并将它们重新排列成20字节的块。我使用32 * 8块,每块40个线程。然而,我的GT630M上的过程需要36毫秒。我可以做进一步的优化吗?特别是关于在最内层循环中删除if-else。

__global__ void test(unsigned char *data)
{
    __shared__ unsigned char dataBlock[20];
    __shared__ int count;
    count = 0;

    unsigned char temp = 0x00;

    for(count=0; count<(streamSize/8); count++)
    {
        for(int i=0; i<8; i++)
        {
            if(blockIdx.y >= i)
                temp |= (*(data + threadIdx.x*(blockIdx.x + gridDim.x*(i+count)))&(0x01<<blockIdx.y))>>(blockIdx.y - i);
            else
                temp |= (*(data + threadIdx.x*(blockIdx.x + gridDim.x*(i+count)))&(0x01<<blockIdx.y))<<(i - blockIdx.y); 
        }
        dataBlock[threadIdx.x] = temp;  
            //do something

    }

}

1 个答案:

答案 0 :(得分:1)

目前还不清楚你的代码想要完成什么,但有几个明显的机会是:

1)如果可能,使用32位字而不是unsigned char。

2)使用32的倍数的块大小。

3)条件代码可能不会像你期望的那样花费你。您可以通过编译--cubin --gpu-architecture sm_xx(其中xx是目标硬件的SM版本)进行检查,并在生成的cubin文件上使用cuobjdump --dump-sass来查看生成的程序集。您可能必须修改源代码以将公共子表达式放入单独的变量中,和/或使用三元运算符? :提示编译器使用预测。