在OpenMP中并行化此循环的最佳方法

时间:2013-12-22 09:05:53

标签: fortran openmp fortran77

我有以下循环,我试图使用OpenMP进行并行化,但我没有看到性能提升,任何人都可以建议如何改进它。

thread = omp_get_max_threads ( )
chunk=jmaxm/thread
c$omp parallel shared (zetun,zetvn) private (i, j)
c$omp do schedule(DYNAMIC,chunk) ORDERED
    do j=2,jmaxm
        jm=j-1
        jp=j+1
             do i=2,imaxm
                if (rmask(i,j).eq.1.0)then
             im=i-1
             ip=i+1
             zetun(i,j)=
           +  (un(im,j,km)+un(ip,j,km)-2.*un(i,j,km))*recdx2
           +  + ((un(i,jp,km)-un(i,j,km))-
           +  (un(i,j,km)-un(i,jm,km)))*recdy2

             zetvn(i,j)=
           +  ((vn(ip,j,km)-vn(i,j,km))-
           +  (vn(i,j,km)-vn(im,j,km)))*recdx2
           +  + (vn(i,jp,km)+vn(i,jm,km)-2.*vn(i,j,km))*recdy2
              endif

        end do

    end do
 c$omp end do nowait
 c$omp end parallel

我现在正在添加修改后的代码如下,但似乎仍然没有任何改进 修改后的代码:

  c$omp parallel shared (zetun,zetvn) private (i,j,jm,jp,im,ip,km)

  c$omp do schedule(DYNAMIC,20) 
   do j=2,jmaxm
        jm=j-1
        jp=j+1
             do i=2,imaxm
                if (rmask(i,j).eq.1.0)then
             im=i-1
             ip=i+1
             zetun(i,j)=
           +  (un(im,j,km)+un(ip,j,km)-2.*un(i,j,km))*recdx2
           +  + ((un(i,jp,km)-un(i,j,km))-
           +  (un(i,j,km)-un(i,jm,km)))*recdy2

             zetvn(i,j)=
           +  ((vn(ip,j,km)-vn(i,j,km))-
           +  (vn(i,j,km)-vn(im,j,km)))*recdx2
           +  + (vn(i,jp,km)+vn(i,jm,km)-2.*vn(i,j,km))*recdy2
              endif

           end do

    end do
c$omp end do
c$omp end parallel

1 个答案:

答案 0 :(得分:2)

代码无效。 jmjpimip必须至少是私密的。另外,为什么需要ordered?它肯定会减慢速度。另外,hhy schedule dynamic有这么大的一块?只需使用static

此外,在编码时使用一些行缩进,或者至少在将代码呈现给其他人时使用。