【发布时间】:2013-07-25 21:05:59
【问题描述】:
我需要使用每个变量(wndspeed、xh、yh、A 和 B)的值进行函数调用 有没有人知道如何在不使用这些嵌套循环的情况下做到这一点?
do i=1,windsteps
wndspeed =windinc*float(i-1)+windstart
write(*,*)i,wndspeed
do j=1,ixsteps
xh=xinc*float(j-1)
xh=xh/height
do k=1,iysteps
yh=10.*float(k-1)*1e3
yh=yinc*float(k-1)
yh=yh/height
do l=1,iasteps
A=(ainc*float(l-1)+50)*1e3
do m=1,ibsteps
B=binc*float(m-1)+1
Pdelt=wndspeed*wndspeed*rho*exp(1.)/B
call trackslopes(elevang,wndspeed,coxmkcor,skewpeak,
1 numslops,slopary,tanumax,xh,yh,A,B,Pdelt,height,numchips,
2 bkgrdwnd,antgain)
skewpeak=0
call trackconvolve(height,tanumax,numslops,slopary,numchips,
1 stppchip,deadband,elevang,convary)
enddo
enddo
enddo
enddo
【问题讨论】:
-
你需要找到更好的 O(n^x) 算法。这似乎是 O(n^5) 现在也许你可以找到独立的,所以可以减少到 n^4 但需要看到轨道坡的内部。
-
您查看过Elemental 程序吗?
-
嵌套循环有什么问题?如果要计算 5-D 空间中每个点的值,则可以使用嵌套循环。如果你不写它们,编译器会(这可能不是一个坏方法)。您寻找消除循环嵌套的方法的目标是什么?
-
正如马克已经写的那样,嵌套循环是要走的路。您仍然可以尝试使用一些特殊的循环结构(例如
do concurrent... )来并行计算。 -
为了加快速度,用加法替换所有不必要的乘法(在循环中 a=ib 与 a+=b 相同,但要慢得多)也可以避免循环内的 int->float 转换在你的情况下。避免除法 a/b 比 c=1.0/b 慢; ... ac;当 c 在循环之前计算时。电话做什么? (他们也可以加快速度)
标签: performance loops optimization fortran nested-loops