Memory 关于CUDA自动阵列的地址

Memory 关于CUDA自动阵列的地址,memory,cuda,local-variables,Memory,Cuda,Local Variables,我是CUDA和GPU的新手,我正在努力了解事物是如何工作的,尤其是内存是如何布局的 以下代码: #include <stdio.h> __global__ void addr (long long unsigned int * b) { int d[10]; b[threadIdx.x] = (long long unsigned int)&d[0]; } int main () { int i; long long unsigned int * bd

我是CUDA和GPU的新手,我正在努力了解事物是如何工作的,尤其是内存是如何布局的

以下代码:

#include <stdio.h>

__global__ 
void addr (long long unsigned int * b)
{
  int d[10];
  b[threadIdx.x] = (long long unsigned int)&d[0];
}


int main ()
{
  int i;
  long long unsigned int * bd, b[16];

  memset (b, 0, 16);
  cudaMalloc ((void**)&bd, 16 * sizeof (long long unsigned int)); 

  cudaMemcpy (bd, b, 16 * sizeof (long long unsigned int), cudaMemcpyHostToDevice); 

  addr<<<1, 16>>>(bd);

  cudaMemcpy (b, bd, 16 * sizeof (long long unsigned int), cudaMemcpyDeviceToHost); 

  for (i = 0; i < 16; i++)
    printf ("%3d 0x%llx\n", i, b[i]);

  return 0;
}
我希望每个线程有不同的值。这里发生了什么

这里发生了什么

查看编译器发出的代码很有帮助:

.version 6.2
.target sm_52
.address_size 64

    // .globl   _Z4addrPy

.visible .entry _Z4addrPy(
    .param .u64 _Z4addrPy_param_0
)
{
    .local .align 8 .b8     __local_depot0[40];
    .reg .b64   %SP;
    .reg .b64   %SPL;
    .reg .b32   %r<2>;
    .reg .b64   %rd<6>;


    mov.u64     %SPL, __local_depot0;
    cvta.local.u64  %SP, %SPL;
    ld.param.u64    %rd1, [_Z4addrPy_param_0];
    cvta.to.global.u64  %rd2, %rd1;
    mov.u32     %r1, %tid.x;
    mul.wide.u32    %rd3, %r1, 8;
    add.s64     %rd4, %rd2, %rd3;
    add.u64     %rd5, %SP, 0;
    st.global.u64   [%rd4], %rd5;
    ret;
}
.6.2版
.目标sm_52
.地址大小64
//.globl_Z4addrPy
.visible.entry\u Z4addrPy(
.param.u64_Z4addrPy_param_0
)
{
.local.align 8.b8_uuulocal_depot0[40];
.reg.b64%SP;
.reg.b64%SPL;
.注册号b32%r;
.reg.b64%rd;
mov.u64%SPL,本地存储;
cvta.local.u64%SP,%SPL;
ld.param.u64%rd1,[\u Z4addrPy\u param\u 0];
cvta.to.global.u64%rd2,%rd1;
mov.u32%r1,%tid.x;
mul.wide.u32%rd3,%r1,8;
add.s64%rd4、%rd2、%rd3;
add.u64%rd5,%SP,0;
st.global.u64[%rd4],%rd5;
ret;
}
d
存储在本地内存中。具有线程级别作用域的。据我所知,文档没有定义寻址或地址空间如何在本地内存中工作

如果要推测每个线程都有自己的本地内存专用地址空间,那么每个线程本地内存的第一个元素从线程本地地址空间中的同一地址开始似乎是合乎逻辑的。在全局内存库中,很可能存在到唯一地址的转换。再一次,所有的猜测

.version 6.2
.target sm_52
.address_size 64

    // .globl   _Z4addrPy

.visible .entry _Z4addrPy(
    .param .u64 _Z4addrPy_param_0
)
{
    .local .align 8 .b8     __local_depot0[40];
    .reg .b64   %SP;
    .reg .b64   %SPL;
    .reg .b32   %r<2>;
    .reg .b64   %rd<6>;


    mov.u64     %SPL, __local_depot0;
    cvta.local.u64  %SP, %SPL;
    ld.param.u64    %rd1, [_Z4addrPy_param_0];
    cvta.to.global.u64  %rd2, %rd1;
    mov.u32     %r1, %tid.x;
    mul.wide.u32    %rd3, %r1, 8;
    add.s64     %rd4, %rd2, %rd3;
    add.u64     %rd5, %SP, 0;
    st.global.u64   [%rd4], %rd5;
    ret;
}