2013-12-22 28 views
1

我有以下循環,我嘗試使用OpenMP進行並行化,但是我看不到任何性能改進,任何人都可以建議如何改進它。在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 

回答

2

的代碼是無效的。至少jm,jp,imip必須是私人的。另外,爲什麼你需要ordered?它肯定會放慢速度。另外,hhy schedule dynamic有這麼大的塊?只需使用static即可。

另外,在編碼時使用一些行縮進,或者至少在將代碼呈現給其他人時使用。

+0

我的確說得過去了,但現在需要更多的時間,那麼nowait怎麼樣? –

+0

顯示修改後的代碼,誰想修復舊版本? –

+0

@HighPerformanceMark是與上面相同的代碼,我沒有添加jm,jp,im和ip作爲私有,但它仍然很慢也變爲DYNAMIC,塊變爲STATIC –