Cuda全局共享内存和恒定内存

时间:2016-04-20 16:28:58

标签: c++ c parallel-processing cuda

我刚刚开始学习cuda,我在转换某些代码以使用共享内存和另一个使用常量内存时出于问题进行比较。

__global__ void CUDA(int *device_array_Image1, int *device_array_Image2,int *device_array_Image3, int *device_array_kernel, int *device_array_Result1,int *device_array_Result2,int *device_array_Result3){

int i = blockIdx.x;
int j = threadIdx.x;


int ArraySum1 = 0 ; // set sum = 0 initially
int ArraySum2 = 0 ;
int ArraySum3 = 0 ;
for (int N = -1 ; N <= 1 ; N++)
{
    for (int M = -1 ; M <= 1 ; M++)
    {
        ArraySum1 = ArraySum1 + (device_array_Image1[(i + N) * Image_Size + (j + M)]* device_array_kernel[(N + 1) * 3 + (M + 1)]);
        ArraySum2 = ArraySum2 + (device_array_Image2[(i + N) * Image_Size + (j + M)]* device_array_kernel[(N + 1) * 3 + (M + 1)]);
        ArraySum3 = ArraySum3 + (device_array_Image3[(i + N) * Image_Size + (j + M)]* device_array_kernel[(N + 1) * 3 + (M + 1)]);
    }
}

device_array_Result1[i * Image_Size + j] = ArraySum1;
device_array_Result2[i * Image_Size + j] = ArraySum2;
device_array_Result3[i * Image_Size + j] = ArraySum3;
}

这是我到目前为止所做的事情,但我有一个理解共享和恒定记忆的问题,所以如果有人可以帮助代码或指出我正确的方向,我真的很感激。

感谢您的帮助。

1 个答案:

答案 0 :(得分:4)

a)共享内存:此内存仅对块中的所有线程可见。如果您从该块中多次访问数据,则此共享内存非常有用。因此,在对数字进行平方时,它将没有用,但在矩阵乘法时它很有用。
b)常量内存:数据存储在设备全局内存中,数据可以通过多处理器常量缓存读取。每个多处理器都有64KB的常量内存和8KB高速缓存。如果warp中的所有线程请求相同的值,则将数据广播到warp.So中的所有线程。该值将在一个周期内传递给它。

以下链接帮助我理解常量和共享内存

1)http://cuda-programming.blogspot.in/2013/01/what-is-constant-memory-in-cuda.html
2)http://cuda-programming.blogspot.in/2013/01/shared-memory-and-synchronization-in.html
3)https://devblogs.nvidia.com/parallelforall/using-shared-memory-cuda-cc/

请参阅此链接。