Sto cercando di rintracciare l'utilizzo del registro e ho trovato uno scenario interessante. Si consideri il seguente fonte:Tracciamento dell'uso del registro del kernel Cuda
#define OL 20
#define NHS 10
__global__ void loop_test(float ** out, const float ** in,int3 gdims,int stride){
const int idx = blockIdx.x*blockDim.x + threadIdx.x;
const int idy = blockIdx.y*blockDim.y + threadIdx.y;
const int idz = blockIdx.z*blockDim.z + threadIdx.z;
const int index = stride*gdims.y*idz + idy*stride + idx;
int i = 0,j =0;
float sum =0.f;
float tmp;
float lf;
float u2, tW;
u2 = 1.0;
tW = 2.0;
float herm[NHS];
for(j=0; j < OL; ++j){
for(i = 0; i < NHS; ++i){
herm[i] += in[j][index];
}
}
for(j=0; j<OL; ++j){
for(i=0;i<NHS; ++i){
tmp = sum + herm[i]*in[j][index];
sum = tmp;
}
out[j][index] = sum;
sum =0.f;
}
}
Come nota a margine sulla sorgente - la somma parziale che potevo fare + =, ma stava giocando con il modo che cambia che gli effetti registrano utilizzo (sembra che non si - aggiunge solo un'istruzione extra in movimento). Inoltre questa sorgente è orientata per l'accesso alla memoria mappata allo spazio 3D.
Concludendo i registri sembrerebbe che ci siano 22 registri (credo che un float [N] occupi N + 1 registri - correggimi se sono wronge) in base alle dichiarazioni.
Tuttavia compilazione con:
nvcc -cubin -arch=sm_20 -Xptxas="-v" src/looptest.cu
rendimenti:
0 bytes stack frame, 0 bytes spill stores, 0 bytes spill loads
ptxas info : Used 25 registers, 72 bytes cmem[0]
Ok, quindi il numero è diverso da quello che si 'aspetta'. Inoltre, se compilato con:
nvcc -cubin -arch=sm_13 -Xptxas="-v" src/looptest.cu
L'utilizzo registro è lontano meno - 8 per l'esattezza (a quanto pare a causa di forte aderenza in sm_20 di sm_13 a standard IEEE matematiche in virgola mobile?):
ptxas info : Compiling entry function '_Z9loop_testPPfPPKfS2_4int3i' for 'sm_13'
ptxas info : Used 17 registers, 40+16 bytes smem, 8 bytes cmem[1]
Come nota finale, cambiare l'OL macro a 40, e improvvisamente:
0 bytes stack frame, 0 bytes spill stores, 0 bytes spill loads
ptxas info : Used 28 registers, 72 bytes cmem[0]
In conclusione vorrei sapere dove i registri sono in corso mangiato e cosa risulta dalle osservazioni di coppia che ho fatto.
non ho abbastanza esperienza con il gruppo per ottenere attraverso un cuobjdump - la risposta certamente giace sepolto in là - forse qualcuno mi può illuminare su quello che dovrebbe essere alla ricerca o mi mostra una guida su come affrontare il discarica di assemblaggio.
Potrebbe essere che i loop sono stati srotolati dal compilatore per OL con valore 20 e non srotolato per 40? –
Penso che il commento di Ashwin sia corretto. Inoltre, dovresti considerare di appiattire le somme in loop tramite i casi di aggiunta del livello di warp, come indicato nella guida alla programmazione CUDA C. http://developer.download.nvidia.com/compute/DevZone/docs/html/C/doc/CUDA_C_Programming_Guide.pdf –
Sono abbastanza sicuro che la differenza nel numero di registri non avrà nulla a che fare con il punto mobile o il ciclo srotolamento o qualsiasi altra cosa menzionata finora. Ricorda che sm_20 è internamente un'architettura a 64 bit e sm_13 è un'architettura a 32 bit. Ciò significa che i puntatori hanno il doppio del footprint del registro compilato per sm_20 rispetto a sm_12. – talonmies