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
我的確說得過去了,但現在需要更多的時間,那麼nowait怎麼樣? –
顯示修改後的代碼,誰想修復舊版本? –
@HighPerformanceMark是與上面相同的代碼,我沒有添加jm,jp,im和ip作爲私有,但它仍然很慢也變爲DYNAMIC,塊變爲STATIC –