繁体   English   中英

在CUDA内核中声明变量

[英]Declaring Variables in a CUDA kernel

假设您在CUDA内核中声明一个新变量,然后在多个线程中使用它,例如:

__global__ void kernel(float* delt, float* deltb) {
int i = blockIdx.x * blockDim.x + threadIdx.x;
float a;
a = delt[i] + deltb[i];
a += 1;
}

并且内核调用看起来像下面这样,有多个线程和块:

int threads = 200;
uint3 blocks = make_uint3(200,1,1);
kernel<<<blocks,threads>>>(d_delt, d_deltb);
  1. “a”存储在堆栈中吗?
  2. 是否为每个线程初始化时创建了一个新的“a”?
  3. 或者每个线程是否会在未知时间独立访问“a”,可能会弄乱算法?

在没有extern说明符的情况下在内核函数内声明的任何变量(标量或数组)对于每个线程都是本地的,即每个线程都有自己的变量“副本”,线程之间不会发生数据竞争!

编译器选择局部变量是驻留在寄存器上还是驻留在本地内存中(实际上是全局内存),具体取决于编译器执行的转换和优化。

有关哪些变量在本地内存上的更多详细信息,请参阅NVIDIA CUDA用户指南, 第5.3.2.2章

以上都不是。 CUDA编译器足够智能且具有足够的积极性,可以检测到a未使用,并且可以优化完整的代码。您可以通过使用-Xptxas=-v作为选项编译内核来确认这一点,并查看资源count,应该基本上没有寄存器,也没有本地内存或堆。

在一个不太简单的例子中, a可能存储在每线程寄存器中,或存储在每线程本地存储器中,这是片外DRAM。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM