0

次のコードは、一連のビットを徐々に通過し、それらを 20 バイトのブロックに再配置します。ブロックあたり 40 スレッドの 32*8 ブロックを使用しています。ただし、このプロセスには、私の GT630M では 36ms ほどかかります。私ができるさらなる最適化はありますか?特に、最も内側のループで 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) 可能であれば、unsigned char の代わりに 32 ビット ワードを使用します。

2) 32 の倍数のブロック サイズを使用します。

3) 条件付きコードは、期待したほどコストがかからない可能性があります。--cubin --gpu-architecture sm_xx (xx はターゲット ハードウェアの SM バージョン) を使用してコンパイルし、生成されたcubin ファイルで cuobjdump --dump-sass を使用して、生成されたアセンブリを確認することで確認できます。ソース コードを変更して、共通部分式を別の変数にロフトするか、三項演算子 ? を使用する必要がある場合があります。: 述語を使用するようにコンパイラーに示唆します。

于 2012-07-17T05:57:03.803 に答える