问题很简单,当我们在编写KERNEL的时候,分配了一个数组,那么这段数组空间是在register中,还是local memory中呢?通过几个测试,我们可以来看一下:
首先一些定义:
#define BLOCK_SIZE 32
#define GRID_SIZE 1
#define ARRAY_SIZE 32
第一个kernel测试,静态索引static indexing,代码:
__global__ void kernel1(float *buf) {
float a[ARRAY_SIZE];
int tid = threadIdx.x + blockIdx.x * blockDim.x;
#pragma unroll
for (int i = 0; i < 5; ++i) {
a[i] = buf[tid];
}
float sum = 0.f;
#pragma unroll
for (int i = 0; i < 5; ++i) {
//static indexing
sum += a[i];
}
buf[tid] = sum;
}
这里,我们注意第二个for循环中,我们使用了pragma unroll展开循环,编译器将会将i优化为对应的数字0,1,2,3,4,同时,编译器也会将a[ARRAY_SIZE]优化为寄存器。我们可以通过nvvp来看一下sass代码,第41