考虑一个并行循环,其中每个线程都将在一个私有向量上进行计算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
谢谢你的任何建议。