我有以下形式的示例循環。請注意,我的psi[i][j]
依賴於psi[i+1][j], psi[i-1][j], psi[i][j+1] and psi[i][j-1]
,我只能計算內部矩陣的psi
。現在,我嘗試在CUDA中編寫此代碼,但結果與順序不同。CUDA並行化依賴2D陣列
for(i=1;i<=leni-2;i++)
for(j=1;j<=lenj-2;j++){
psi[i][j]=(omega[i][j]*(dx*dx)*(dy*dy)+(psi[i+1][j]+psi[i-1][j])*(dy*dy)+(psi[i][j+1]+psi[i][j-1])*(dx*dx))/(2.0*(dx*dx)+2.0*(dy*dy));
}
這是我的CUDA格式。
//KERNEL
__global__ void ComputePsi(double *psi, double *omega, int imax, int jmax)
{
int x = blockIdx.x;
int y = blockIdx.y;
int i = (jmax*x) + y;
double beta = 1;
double dx=(double)30/(imax-1);
double dy=(double)1/(jmax-1);
if((i)%jmax!=0 && (i+1)%jmax!=0 && i>=jmax && i<imax*jmax-jmax){
psi[i]=(omega[i]*(dx*dx)*(dy*dy)+(psi[i+jmax]+psi[i-jmax])*(dy*dy)+(psi[i+1]+psi[i-1])*(dx*dx))/(2.0*(dx*dx)+2.0*(dy*dy));
}
}
//Code
cudaMalloc((void **) &dev_psi, leni*lenj*sizeof(double));
cudaMalloc((void **) &dev_omega, leni*lenj*sizeof(double));
cudaMemcpy(dev_psi, psi, leni*lenj*sizeof(double),cudaMemcpyHostToDevice);
cudaMemcpy(dev_omega, omega, leni*lenj*sizeof(double),cudaMemcpyHostToDevice);
dim3 grids(leni,lenj);
for(iterpsi=0;iterpsi<30;iterpsi++)
ComputePsi<<<grids,1>>>(dev_psi, dev_omega, leni, lenj);
其中psi[leni][lenj] and omega[leni][lenj]
和雙數組。
問題在於順序問題,CUDA代碼給出了不同的結果。代碼中是否需要修改?
無關提示:我總是將輸入緩衝區聲明爲const指針,所以我不會搞砸。 – texasbruce
相關提示:始終將輸入和輸出緩衝區分開,並且不要寫入全局輸入緩衝區 – texasbruce