cuda中静态分配共享内存的正确方法是什么?为什么?

cuda中静态分配共享内存的正确方法是什么?为什么?,cuda,Cuda,在以下两种静态分配共享内存的方法中,哪种方法正确?为什么?我得到了两个相同的结果,但我正试图更详细地理解这一行为 内核1: __shared__ int as[3][3],bs[3][3]; __global__ void Sharesum(int* a,int* b,int* c,int n) { int s,k,i,sum=0; int tx,ty,bx,by; tx=threadIdx.x; ty=threadIdx.y; as[ty][tx]=a[

在以下两种静态分配共享内存的方法中,哪种方法正确?为什么?我得到了两个相同的结果,但我正试图更详细地理解这一行为

内核1:

__shared__ int as[3][3],bs[3][3];
__global__ void Sharesum(int* a,int* b,int* c,int n)
{
    int s,k,i,sum=0;
    int tx,ty,bx,by;
    tx=threadIdx.x;
    ty=threadIdx.y;
    as[ty][tx]=a[tx+n*ty];
    bs[ty][tx]=b[tx+n*ty];
    sum += as[ty][tx]+bs[ty][tx];
    c[tx*n+ty]=sum;
}
内核2:

    __global__ void Sharesum(int* a,int* b,int* c,int n)
{
    __shared__ int as[3][3],bs[3][3];

    int s,k,i,sum=0;
    int tx,ty,bx,by;
    tx=threadIdx.x;
    ty=threadIdx.y;
    as[ty][tx]=a[tx+n*ty];
    bs[ty][tx]=b[tx+n*ty];
    sum += as[ty][tx]+bs[ty][tx];
    c[tx*n+ty]=sum;
}

对于您所展示的内容,这两种方法之间应该没有任何区别。我不确定是否有一个答案表明一个是“正确的”,另一个不是

然而,第一个,我们可以称之为“全局范围”声明,影响模块中定义的所有内核。这意味着根据全局定义,所有内核都将保留可用的共享分配

第二个仅影响其作用域的内核


一个或两个都可能是正确的,这取决于您想要的目的。

谢谢您的解释。在全局声明的情况下,它不会将共享内存的范围从块更改为网格吗?那么网格中的所有线程都将看到相同的共享内存?不。共享内存始终是一个逻辑块作用域分配。不可能也不可能让网格中的所有线程都看到“相同”的共享内存。每个threadblock始终获得其自己的共享内存副本。只有全局内存具有网格范围的全局可见性。很抱歉,我理解得不好,“逻辑块作用域分配”是什么意思。这意味着对于网格中的任何两个不同的块a和B,由块a写入共享内存的项在块B可用的共享内存中都不可见。