J'ai un noyau qui a un ajustement linéaire des moindres carrés. Il s'avère que les threads utilisent trop de registres, par conséquent, l'occupation est faible. Voici le noyau,pression de registre cuda
__global__
void strainAxialKernel(
float* d_dis,
float* d_str
){
int i = threadIdx.x;
float a = 0;
float c = 0;
float e = 0;
float f = 0;
int shift = (int)((float)(i*NEIGHBOURS)/(float)WINDOW_PER_LINE);
int j;
__shared__ float dis[WINDOW_PER_LINE];
__shared__ float str[WINDOW_PER_LINE];
// fetch data from global memory
dis[i] = d_dis[blockIdx.x*WINDOW_PER_LINE+i];
__syncthreads();
// least square fit
for (j=-shift; j<NEIGHBOURS-shift; j++)
{
a += j;
c += j*j;
e += dis[i+j];
f += (float(j))*dis[i+j];
}
str[i] = AMP*(a*e-NEIGHBOURS*f)/(a*a-NEIGHBOURS*c)/(float)BLOCK_SPACING;
// compensate attenuation
if (COMPEN_EXP>0 && COMPEN_BASE>0)
{
str[i]
= (float)(str[i]*pow((float)i/(float)COMPEN_BASE+1.0f,COMPEN_EXP));
}
// write back to global memory
if (!SIGN_PRESERVE && str[i]<0)
{
d_str[blockIdx.x*WINDOW_PER_LINE+i] = -str[i];
}
else
{
d_str[blockIdx.x*WINDOW_PER_LINE+i] = str[i];
}
}
J'ai 32x404 blocs avec 96 threads dans chaque bloc. Sur le GTS 250, le SM doit pouvoir gérer 8 blocs. Pourtant, visual profileer montre que j'ai 11 registres par thread, en conséquence, l'occupation est de 0,625 (5 blocs par SM). BTW, la mémoire partagée utilisée par chaque bloc est 792 B, de sorte que le registre est le problème. La performance n'est pas la fin du monde. Je suis simplement curieux de savoir si je peux contourner cela. Merci.
Qu'en est-il de la configuration de la grille? – fabrizioM
Je l'ai oublié, corrigé maintenant –