나는 합계를 계산하는 커널을 가지고있다. 선언 된 변수의 수를 세는 커널을 살펴보면 커널 당 총 5 개의 레지스터가 있다고 가정합니다. 그러나 커널을 프로파일 링 할 때는 34 개의 레지스터가 사용됩니다. 내가 1024 스레드의 실행을 허용하기 위해 30 레지스터 내려야합니다.CUDA - 커널이 예상보다 많은 레지스터를 사용합니까?
무엇이 잘못되었는지 누가 볼 수 있습니까?
__global__ void sum_kernel(float* values, float bk_size, int start_idx, int end_idx, int resolution, float* avgs){
// Allocate shared memory (assuming a maximum of 1024 threads).
__shared__ float sums[1024];
// Boundary check.
if(blockIdx.x == 0){
avgs[blockIdx.x] = values[start_idx];
return;
}
else if(blockIdx.x == resolution-1) {
avgs[blockIdx.x] = values[start_idx+(end_idx-start_idx)-1];
return;
}
else if(blockIdx.x > resolution -2){
return;
}
// Iteration index calculation.
unsigned int idx_prev = floor((blockIdx.x + 0) * bk_size) + 1;
unsigned int from = idx_prev + threadIdx.x*(bk_size/blockDim.x);
unsigned int to = from + (bk_size/blockDim.x);
to = (to < (end_idx-start_idx))? to : (end_idx-start_idx);
// Partial average calculation using shared memory.
sums[threadIdx.x] = 0;
for (from; from < to; from++)
{
sums[threadIdx.x] += values[from+start_idx];
}
__syncthreads();
// Addition of partial sums.
if(threadIdx.x != 0) return;
from = 1;
for(from; from < 1024; from++)
{
sum += sums[from];
}
avgs[blockIdx.x] = sum;
}
- 당 2 개 포인터 레지스터, 부호 INT 당 1 개 레지스터 상수 메모리에 저장된 인수를 가정.
작은 수정 : 술어는 R 레지스터에 저장되지 않지만 술어 레지스터 (이 경우 P0)에 저장됩니다. – njuffa
@njuffa 대단히 감사합니다. 나는 그 대답의 마지막 문장을 즉시 고쳤다. – JackOLantern