假设您在 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);
- “a”是否存储在堆栈中?
- 初始化时是否为每个线程创建一个新的“a”?
- 或者每个线程是否会在未知时间独立访问“a”,从而可能扰乱算法?
在内核函数内部声明的任何变量(标量或数组),如果没有 extern 说明符,对于每个线程来说都是本地的,即每个线程都有自己的该变量的“副本”,线程之间不会发生数据竞争!
编译器根据编译器执行的转换和优化来选择局部变量是否驻留在寄存器或本地内存(实际上是全局内存)中。
有关本地内存中的变量的更多详细信息,请参阅 NVIDIA CUDA 用户指南,第 5.3.2.2 章 https://docs.nvidia.com/cuda/cuda-c-programming-guide/index.html#device-memory-accesses
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)