现在有个算法,想在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]不知道上述代码有什么问题?自己对二维线程理解还是有问题的。这个是我根据自己对二维线程的理解写的代码,结果不对的。