在OpenMP并行循环中避免错误共享

时间:2015-12-17 17:47:42

标签: caching fortran openmp false-sharing

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

感谢您的任何建议。

0 个答案:

没有答案