假设您在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;
}
Run Code Online (Sandbox Code Playgroud)
并且内核调用看起来像下面这样,有多个线程和块:
int threads = 200;
uint3 blocks = make_uint3(200,1,1);
kernel<<<blocks,threads>>>(d_delt, d_deltb);
Run Code Online (Sandbox Code Playgroud)
以上都不是.CUDA编译器足够智能且具有足够的积极性,可以检测到a 未使用的优化,并且可以优化完整的代码.您可以通过编译内核-Xptxas=-v作为选项来确认这一点,并查看资源计数,这应该是基本的没有寄存器,没有本地内存或堆.
在一个不太简单的例子中,a可能存储在每线程寄存器中,或存储在每线程本地存储器中,这是片外DRAM.