我正在转换CUDA并行化代码中最初编写的C代码的过程。 还是一个新手,我把大部分代码转换成了CUDA,但是我的一些内核没有正确地完成这项工作。将“for”循环转换为CUDA并行代码
这里是我的内核:
__global__ void kernel(long int *neighbour, double *f, double *r, double *b, double *fn, double *rn, double *bn, int nfluidsite){
int ns = blockDim.x * blockIdx.x + threadIdx.x;
if(ns<nfluidsite)
{
double tempr = r[ns];
double tempb = b[ns];
rn[ns]=tempr;
bn[ns]=tempb;
for(int q=1;q<Q;++q)
{
double confr=r[q*NSITE+ns];
double confb=b[q*NSITE+ns];
__syncthreads();
int ns1=neighbour[q*NTOTAL+ns];
__syncthreads();
rn[q*NSITE+ns1]=confr;
bn[q*NSITE+ns1]=confb;
}
}
if(ns<NSITE)
{
for(int q=0;q<Q;++q)
{
double rqns = rn[q*NSITE+ns];
double bqns = bn[q*NSITE+ns];
__syncthreads();
r[q*NSITE+ns]=rqns;
b[q*NSITE+ns]=bqns;
f[q*NSITE+ns]=rqns+bqns;
}
}
}
所以,这个代码工作正常(虽然它不是在所有优化),但我也希望进行并行内的循环上q
。所以,我是这样的:
int ns = blockIdx.x;
int q = threadIdx.x;
,我开始了我的内核如下:
blocksPerGrid = NSITE;
threadsPerBlock = Q;
kernel<<<blocksPerGrid,threadsPerBlock>>>(neighbourCu, fCu, rCu, bCu, fnCu, rnCu, bnCu, nfluidsite);
而且它不会在所有的工作,CUDA不会对数组返回任何错误,但操作是随机的...我在完全并行版本中添加了__syncthreads()
命令,但它并没有解决这些差异。
而且,我不为什么,但如果我使用超过1024个线程,在我的内核中的指令也运行随机...
嗯,我一直不解两周内,如果有人看到我需要做的,请给我一个提示!
谢谢!我使用了第一个选项(最简单的一个),它工作。它也解决了我的线程每块数限制问题。如果在其他地方需要,我会记住其他选项。 – Seif