use*_*570 1 c++ parallel-processing cuda gpu-shared-memory
我刚刚开始学习 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;
}
Run Code Online (Sandbox Code Playgroud)
这就是我到目前为止所做的,但我在理解共享和恒定内存方面遇到了问题,因此如果有人可以帮助编写代码或为我指出正确的方向,我将非常感激。
谢谢你的帮助。
小智 5
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/
请参考此链接。