CUDA,可以使用共享内存提高我的表现吗?

时间:2014-01-29 13:41:30

标签: c++ performance cuda shared-memory

我正在实现一种使用CUDA将图像转换为灰度的算法。我现在已经开始工作,但我正在寻找提高性能的方法。 现在,整个彩色图像被传送到设备存储器,之后每个线程通过查找相应的三个(r,g,b)颜色值来计算灰度像素值。

我已经确定全局内存的访问权限已合并,但这并没有真正提高我的性能(在内存访问合并后,36 mb的图像减少了0.003 s ...)。现在,我想知道使用共享内存是否可以提高我的性能。这就是我现在所拥有的:

我的CUDA内核:

__global__ void darkenImage(const unsigned char * inputImage,
    unsigned char * outputImage, const int width, const int height, int iteration){

  int x = ((blockIdx.x * blockDim.x) + (threadIdx.x + (iteration * MAX_BLOCKS * nrThreads))) * 3;

  if(x+2 < (3 * width*height)){
    float grayPix = 0.0f;
    float r = static_cast< float >(inputImage[x]);
    float g = static_cast< float >(inputImage[x+1]);
    float b = static_cast< float >(inputImage[x+2]);

    grayPix = __fadd_rn(__fadd_rn(__fmul_rn(0.3f, r),__fmul_rn(0.59f, g)), __fmul_rn(0.11f, b));
    grayPix = fma(grayPix,0.6f,0.5f);


    outputImage[(x/3)] = static_cast< unsigned char >(grayPix);
  }
}

我的问题是,因为在任何两个线程之间没有共享内存,使用共享内存现在应该没有真正的帮助吗?还是我误解了?

此致

莱纳斯

2 个答案:

答案 0 :(得分:1)

如果多次使用相同的值,则使用共享内存(缓存)不会提高性能。但您可以尝试删除iteration参数并使用每个块处理更多数据。尝试在内核中启动单个内核和循环,以便每个线程可以计算多个输出数据。

答案 1 :(得分:1)

不正确共享内存不会帮助您,因为您不会多次访问数据。