uncoalesced float2 CUDA内核

时间:2012-11-16 01:12:27

标签: cuda coalescing

我无法优化以下示例的网格和块大小。当我进行分析时,似乎内核代码中的内存写操作没有合并。

我在互联网上找到了一些解决方案,但他们建议我将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:我试过了,但没有运气! CUDA float2 coalescing

1 个答案:

答案 0 :(得分: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;
}

其他详情可在

找到