0

我有以下代码,它逐步遍历一串位并将它们重新排列成 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

    }

}
4

1 回答 1

1

目前尚不清楚您的代码试图完成什么,但有几个明显的机会是:

1) 如果可能,使用 32 位字而不是无符号字符。

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

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

于 2012-07-17T05:57:03.803 回答