__global__ void add( int *c, const int* a, const int* b )
{
int x = blockIdx.x;
int y = blockIdx.y;
int offset = x + y * gridDim.x;
c[offset] = a[offset] + b[offset];
}
В приведенном выше примере, я думаю, x
, y
, offset
сохраняются в регистрах, а
-
nvcc -Xptxas -v дает
4 registers, 24+16 bytes smem
-
профайлер показывает 4 регистра
-
и глава файла ptx:
.reg .u16 %rh<4>; .reg .u32 %r<9>; .reg .u64 %rd<10>; .loc 15 21 0 $LDWbegin__Z3addPiPKiS1_: .loc 15 26 0
Может ли кто-нибудь уточнить использование регистров? В Ферми максимальное количество регистров составляет 63 для каждого потока. В моей программе я хочу проверить случай, когда ядро потребляет слишком много регистров (так что переменные могут быть автоматически сохранены в локальной памяти и, следовательно, приводят к снижению производительности). Затем в этот момент я могу разделить одно ядро на два, чтобы каждый поток имел достаточно регистров. Предположим, что ресурсов SM достаточно для одновременных ядер.
Я не уверен, прав ли я.