【问题标题】:Cuda global to shared memory and constant memoryCuda 全局到共享内存和常量内存
【发布时间】:2016-04-20 16:28:57
【问题描述】:

我刚开始学习 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;
}

这是我到目前为止所做的,但我在理解共享和常量内存时遇到了问题,所以如果有人可以帮助我编写代码或指出正确的方向,我将不胜感激。

感谢您的帮助。

【问题讨论】:

    标签: c++ c parallel-processing cuda


    【解决方案1】:

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

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

    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/

    请参考此链接。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-12-15
      • 2011-06-08
      • 1970-01-01
      • 1970-01-01
      • 2012-06-11
      • 2012-01-08
      • 2021-05-17
      • 1970-01-01
      相关资源
      最近更新 更多