1

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

谢谢你的任何建议。

4

0 回答 0