【问题标题】:Is there a way I can avoid these nested loops?有没有办法可以避免这些嵌套循环?
【发布时间】: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


【解决方案1】:

除非trackslopes/trackconvolve过程可以简化为简单的东西,否则就没有办法(非常重要地)删除嵌套循环。

看到这一点的最好方法是每个子循环至少依赖于它的一个超级循环的值,因此除非最里面的计算可以使整个过程在数学上得到简化,否则它是已经是最简单的形式了。

如果你只是不喜欢看那么多层次的嵌套,你可以尝试通过使用索引数组而不是 5 个不同的索引来展平 5 维空间,然后你必须写一个相当丑陋的 1 -D 循环检查 5 个索引中每一个的边界,然后适当地推进索引数组。

【讨论】:

    猜你喜欢
    • 2011-05-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-05
    • 2021-09-29
    • 2021-03-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多