我正在实现一种使用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);
}
}
我的问题是,因为在任何两个线程之间没有共享内存,使用共享内存现在应该没有真正的帮助吗?还是我误解了?
此致
莱纳斯
答案 0 :(得分:1)
如果多次使用相同的值,则使用共享内存(缓存)不会提高性能。但您可以尝试删除iteration
参数并使用每个块处理更多数据。尝试在内核中启动单个内核和循环,以便每个线程可以计算多个输出数据。
答案 1 :(得分:1)
不正确共享内存不会帮助您,因为您不会多次访问数据。