考虑一个并行循环,其中每个线程将在私有向量dudz(izfirst:izlast)
上进行计算。在我的实现中,我想完成两件事:
为了避免问题1,我正在考虑创建数组dudz(izfirst:izlast,nproc)
,其中每个线程只访问dudz(:, omp_id)
,但这不容易被错误共享?为了避免错误共享,我在考虑使用private(dudz)
,但这不会分配内存吗?
以下代码可以适用于我的任何一种解决方案,但哪种更好?还有第三种方法可以处理我的问题吗?
!$omp parallel do num_threads(nproc) private(ix, iz, ishift)
do ix = ixfirst, ixlast
do iz = izfirst, izfirst+ophalf-1
dudz(iz) = 0.0
enddo
!$omp simd
do iz = izfirst+ophalf, izlast-ophalf+1
dudz(iz) = az(1)*( u(iz,ix) - u(iz-1,ix) )
do ishift = 2, ophalf
dudz(iz) = dudz(iz) + az(ishift)*( u(iz+ishift-1,ix) - u(iz-ishift,ix) )
enddo
dudz(iz) = dudz(iz)*buoy_z(iz,ix)
enddo
!$omp end simd
do iz = izlast-ophalf+2, izlast
dudz(iz) = 0.0
enddo
enddo
!$omp end parallel do
感谢您的任何建议。