首页 > 解决方案 > 为什么跨两个块的共享内存的指针位置相同?

问题描述

我认为 cuda 设备的共享内存是块私有的。但是,在我看来,跨两个块的共享内存指针是相同的:

#include <stdio.h>

__global__ void foo() {
    __shared__ int ar[8];
    printf("shared memory pointer %p at blockidx %i\n", ar, blockIdx.x);
}

int main() {
    dim3 blockDim(1);
    dim3 gridDim(2);
    foo<<<gridDim, blockDim>>>();
    cudaDeviceSynchronize();
}

运行上面的代码会产生:

shared memory pointer 0x7f88f5000000 at blockidx 0
shared memory pointer 0x7f88f5000000 at blockidx 1

使用这个程序,我希望创建两个不同的块,在每个块上初始化共享内存并获得两个不同的内存位置。我是不是误会了什么?还是这些指针确实具有不同的物理位置,但在一个块内地址似乎相同?

标签: c++pointersmemorycuda

解决方案


共享内存块私有的,即一个块中的线程不能访问另一个块的共享内存。

...出于这个原因,实际上可以预期共享内存的地址范围对于所有块都是相同的 - 但在每个块中,从这些地址加载或存储到这些地址会影响块本地共享内存。

直觉:这有点类似于在 CPU 上,两个进程中的代码可能使用相同的指针地址,但它们实际上会访问内存中的不同物理位置(通常)。


推荐阅读