1

以下の例のグリッドとブロックのサイズを最適化するのに問題があります。プロファイリングを行うと、カーネルコードのメモリ書き込み操作が合体していないようです。

インターネットでいくつかの解決策を見つけましたが、c_imageの構造を次のように変更するように提案されました。[x1, x2, x3...] [y1, y2, y3...]

ただし、[x1, y1] [x2, y2]...この正確な形式を必要とする別の場所のコードでCUFFTライブラリを使用しているため、構造が必要です。

c_image構造体で操作を実行するための合体した方法はありますか?

私のコード:

void main()
{
    float2 *c_image;  // x1 y1 x2 y2 x3 y3 x4 y4 .. .. .. .. x2048 y2048
    cudamalloc(c_image, 2048*2048*8);

    //warp size = 32
    //max thread count = 1024
    dim3 blocksize(1024, 1);
    dim3 gridsize(2048, 2);
    test<<<gridsize, blocksize>>(C_image);  
}


__global__ void test(float2 *o) 
{
    int x = threadIdx.x + blockIdx.y*1024;
    int y = blockIdx.x;

    int index = x + 2048*y;

        o[index].x = x;
        o[index].y = y;
}

どうもありがとう!

PS:私はこれを試しましたが、運がありません!CUDAfloat2合体

4

1 に答える 1

3

一時的なfloat2変数を使用してこれを単一の割り当てに減らすと、64ビットの書き込みになります。

_global__ void test(float2 *o) 
{
    int x = threadIdx.x + blockIdx.y * 1024;
    int y = blockIdx.x;
    int index = x + 2048 * y;
    float2 tmp = float2(x, y);
    o[index] = tmp;
}

詳細については、次のURLをご覧ください。

于 2012-11-16T01:34:17.407 に答える