Optimization 优化位操作内核

Optimization 优化位操作内核,optimization,cuda,bit-manipulation,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; u

我有下面的代码,它循序渐进地遍历一串位,并将它们重新排列成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

    }

}
\uuuuu全局\uuuuuu无效测试(无符号字符*数据)
{
__共享的无符号字符数据块[20];
__共享整数计数;
计数=0;
无符号字符温度=0x00;

对于(count=0;count来说,不清楚您的代码试图实现什么,但有几个明显的机会:

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

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


3) 条件代码的成本可能没有您预期的那么高。您可以使用--cubin--gpu体系结构sm_xx(其中xx是目标硬件的sm版本)进行编译来检查,并在生成的cubin文件上使用cuobjdump--dump sass查看生成的程序集。您可能需要修改源代码,将公共子表达式放样为单独的变量,和/或使用三元运算符?:提示编译器使用谓词。

您可以从始终使用圆倍数的块大小开始每个块使用40个线程会浪费GPU上37%的可用周期。此外,您可能希望在块中同时启动多个线程以隐藏延迟。您的外部循环写入
dataBlock[threadIdx.x]=temp;
每次迭代--因此您将覆盖相同的位置
streamSize/8次。将该行移到循环之外。理想情况下,每个块至少使用64个线程。sm_30和更早版本设备上的32个线程块将限制占用(因此能够覆盖内存延迟)由于每个SM最多可以有8个常驻块。每个块有32个线程,因此每个SM最多有8个扭曲,而如果使用64个线程块,则最多有16个扭曲。