我正在轉換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