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

drnojrws  于 2023-05-20  发布在  其他
关注(0)|答案(1)|浏览(116)

在下面两种静态分配共享内存的方法中,哪种方法是正确的,为什么?我得到了相同的结果,但我试图了解的行为更详细一点。
内核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;
}
kknvjkwl

kknvjkwl1#

这两个方法之间不应该有任何区别 * 对于你所展示的 *。我不确定是否有一个答案表明一个是“正确的”,一个不是。
然而,第一个,我们可以称之为“全局作用域”声明,影响模块中定义的所有内核。这意味着所有内核将根据全局定义保留并具有可用的共享分配。
第二个只影响它所作用的内核。
其中一个或两个都可能是正确的,这取决于你想要的意图。

相关问题