为什么线程块中的变量具有相同的内存地址?库达
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 中,指令有两种形式:
- LDL、STL 是直接访问以 0 为基础的偏移量给出的本地内存
- LD、ST 可用于通过通用本地内存进行本地内存访问window。
当您获取变量的地址时,将返回通用地址 space 地址。每个线程都从通用本地内存 window 基指针看到相同的偏移量。加载存储单元会将基于 0 的偏移量转换为每个线程唯一的全局地址。
有关详细信息,请参阅:
CUDA Programming Guide 本地内存部分
PTX ISA 通用寻址部分。有关本地内存的详细信息分散在整个手册中。
我想知道为什么它们有相同的内存地址,如果我没记错的话,每个线程都有自己的创建变量副本,这样:
__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 中,指令有两种形式:
- LDL、STL 是直接访问以 0 为基础的偏移量给出的本地内存
- LD、ST 可用于通过通用本地内存进行本地内存访问window。
当您获取变量的地址时,将返回通用地址 space 地址。每个线程都从通用本地内存 window 基指针看到相同的偏移量。加载存储单元会将基于 0 的偏移量转换为每个线程唯一的全局地址。
有关详细信息,请参阅:
CUDA Programming Guide 本地内存部分
PTX ISA 通用寻址部分。有关本地内存的详细信息分散在整个手册中。