为什么线程块中的变量具有相同的内存地址?库达

Why variables in thread's block have the same memory address? Cuda

我想知道为什么它们有相同的内存地址,如果我没记错的话,每个线程都有自己的创建变量副本,这样:

__global__ void
Matrix_Multiplication_Shared(
   const int* const Matrix_A, 
   const int* const Matrix_B, 
         int* const Matrix_C)
{   
    const int sum_value = threadIdx.x;
    printf("%p \n", &sum_value);
}

输出:

我正在考虑一个线程阻塞的情况,例如 2 个或更多线程。

NVIDIA GPU 有多个地址 spaces。

指针使用的主虚拟地址spaced称为通用地址space。在通用地址 space 内是 windows 用于本地内存和共享内存。通用地址 space 的其余部分是全局地址 space。 PTX 和 GPU 指令集支持基于 0 访问本地和共享内存地址的附加指令 space.

一些自动变量和栈内存在本地内存地址space。全局内存和本地内存之间的主要区别在于,本地内存的组织方式是连续的线程 ID 访问连续的 32 位字。如果每个线程都从相同的本地内存偏移读取或写入,则内存访问将完全合并。

在 PTX 中,本地内存通过 ld.local 和 st.local 访问。

在 GPU SASS 中,指令有两种形式:

  1. LDL、STL 是直接访问以 0 为基础的偏移量给出的本地内存
  2. LD、ST 可用于通过通用本地内存进行本地内存访问window。

当您获取变量的地址时,将返回通用地址 space 地址。每个线程都从通用本地内存 window 基指针看到相同的偏移量。加载存储单元会将基于 0 的偏移量转换为每个线程唯一的全局地址。

有关详细信息,请参阅: