分析Fortran语言中的循环配对,及相互包含关系。
1)待分析的Fortran代码,这个代码来自NPB
!$omp parallel default(shared)
!$omp& private(i,j,k,m,zeta,eta,xi,add,u_exact,rms_local)
!$omp& shared(rms)
do m = 1, 5
rms_local(m) = 0.0d0
enddo
!$omp do
do k = 0, grid_points(3)-1
zeta = dble(k) * dnzm1
do j = 0, grid_points(2)-1
eta = dble(j) * dnym1
do i = 0, grid_points(1)-1
xi = dble(i) * dnxm1
call exact_solution(xi, eta, zeta, u_exact)
do m = 1, 5
add = u(m,i,j,k)-u_exact(m)
rms_local(m) = rms_local(m) + add*add
enddo
enddo
enddo
enddo
!$omp end do nowait
do m = 1, 5
!$omp atomic
rms(m) = rms(m) + rms_local(m)
enddo
!$omp end parallel
2)
循环对包含这些
[[3, 5, -100], [15, 18, -100], [11, 19, -100], [9, 20, -100], [7, 21, -100], [23, 26, -100]]
初步看起来是对的。
但是中间包含函数调用
3)
[[3, 5, -1], [15, 18, 2], [11, 19, 3], [9, 20, 4], [7, 21, -1], [23, 26, -1]]
4)总结:
a)没有对函数调用进行分析。
b)3中的结果看起来是对的。
c)Fortran中enddo 也行,一般是end do,也是服了。