多维线程求助

现在有个算法,想在GPU上实现。然后串行的代码如下:

void spmv(int n,int *row,int *data,int *col,int *x,int *y)
{
   int i,j,a; 
   for(i=0;i<n;i++){           //矩阵行数循环
   float sum=0.0f;
   for(j=0;j<i;j++){         
   for(a=row[j];a<row[j+1];a++){                  //矩阵每行的个数循环
   if( (col[a]==i) ){                        //在该行找到所需要的行,则把改值加入到y中
   y[i]+=data[a]*x[col[a]];
   break;
   }
   }
   }
   }
}

  在GPU上实现这个算法,我想的是开启二维线程。代码如下:

global void smvpS3_1( float *res, float *temp,int *rpos,int *col )
{ int tid_in_grid_x = blockDim.x * blockIdx.x + threadIdx.x ;
int tid_in_block_y = threadIdx.y ;
int inc=blockDim.y;

for(int tid=0;tid<tid_in_grid_x;tid+=inc){
int end_rpos = rpos[tid+1];
int start_rpos = rpos[tid];
for( int j = start_rpos+tid_in_block_y ; j< end_rpos; j+=inc){ //y方向线程来循环找寻对应的列信息
if(tid_in_grid_x==col[j]){
res[tid_in_grid_x]+=temp[j];
}
}
}
}
[indent]
[/indent]不知道上述代码有什么问题?自己对二维线程理解还是有问题的。这个是我根据自己对二维线程的理解写的代码,结果不对的。

unsigned int x = blockIdx.xblockDim.x+threadIdx.x;
unsigned int y = blockIdx.y
blockDim.y+threadIdx.y;

你这个我知道。我只是想一个block开启二维,然后来实现我要的效果的。

看了一下LZ提供的串行代码,不甚理解,觉得实现和注释似乎没有对上,暂无法提供建议了,请见谅,欢迎其他网友补充。