【问题标题】:Why is the pointer location of shared memory across two blocks identical?为什么跨两个块的共享内存的指针位置相同?
【发布时间】:2020-05-21 17:38:55
【问题描述】:

我认为 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++ pointers memory cuda


    【解决方案1】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-08
      • 2012-07-21
      • 2013-03-27
      • 2012-06-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多