我认为 cuda 设备的共享内存是 block 私有(private)的。但是,在我看来,跨两个 block 的共享内存指针是相同的:
#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
使用这个程序,我希望创建两个不同的 block ,在每个 block 上初始化共享内存并获得两个不同的内存位置。我是不是误会了什么?还是这些指针确实具有不同的物理位置,但在一个 block 内地址似乎相同?
最佳答案
共享内存是 block 私有(private)的,即一个 block 中的线程不能访问另一个 block 的共享内存。
...出于这个原因,实际上可以预期共享内存的地址范围对于所有 block 都是相同的 - 但在每个 block 中,从这些地址加载或存储到这些地址会影响 block 本地共享内存。
直觉:这有点类似于在 CPU 上,两个进程中的代码可能使用相同的指针地址,但它们实际上会访问内存中的不同物理位置(通常)。
关于c++ - 为什么跨两个 block 的共享内存的指针位置相同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60082025/