题目是产生如下4*4矩阵
{3,5,7,9,
9,21,37,47,
31,89,173,221,
121,383,777,999
}
产生此矩阵的运算规则是:
for(i=0;i<3;i++)//行
{
for(j=0;j<3;j++)//列
{ 若为第一列
k=buf[j]+buf[j+1]+1;
若为其他列
k=buf[j]+buf[j+1]+buf[j-1];
buf[j]=k;
d1[i*dx+j]=k;
}
}
起始有buf[0]~buf[4]=1;
问题:因为本算法有递归关系,想法是等一行处理了两个之后,下一行才开始处理。开辟4个thread,1个thread也就是一行
CUDA程序为:
int tid=threadIdx.x;//使用1维4个thread
int k=-1;//k为每一行(thread)的相应的列数
for(i=0;i<(3+2);i++)
{if(tid==i) active=1;//通过active来控制各个thread的操作
__syncthreads();
for(j=0;j<2;j++)
{__syncthreads();
if(k>3) active=0;//若某行(thread)列数超出3,则不启动
if(active==1)
{k++;
if(k==0)
result=buf_d[k]+buf_d[k+1]+1;
else
result=buf_d[k]+buf_d[k+1]+buf_d[k-1];
buf_d[k]=result;
}
__syncthreads();
}
}
:bad: 问题是按照以上程序,thread并不听话,除了第一行数据是正确的,其他行数据都不对。希望哪位大牛能指出问题,提前谢谢了