我有一個內核做線性最小二乘擬合。原來線程使用的寄存器太多,因此佔用率很低。這裏是內核,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];
}
}
我有32x404塊,每個塊有96個線程。在GTS 250上,SM應該能夠處理8個塊。然而,可視化剖析器顯示每個線程有11個寄存器,因此佔用率爲0.625(每個SM 5個塊)。順便說一句,每個塊使用的共享內存是792 B,所以寄存器是問題。 表演並非世界末日。我只是好奇,如果有任何我可以解決這個問題。謝謝。
怎麼樣的網格配置? – fabrizioM 2010-11-17 00:14:04
我忘記了,現在修復了 – 2010-11-17 00:28:10