我有以下形式的示例循环。请注意,我的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