我有一个内核做线性最小二乘拟合。原来线程使用的寄存器太多,因此占用率很低。这里是内核,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