【问题标题】:Avoid IF statements in a Fortran DO loops [duplicate]避免在 Fortran DO 循环中使用 IF 语句 [重复]
【发布时间】:2017-11-29 12:07:05
【问题描述】:

在我的 Fortran 程序中,我有类似这个循环的东西

do i = 1,imax
    if(period) then
        call g_period()
    else
        call g()
    endif
 enddo

我在 do 循环中有几个地方,有时还有几个 If 循环,用于检查我是否应该调用函数 X 或 Y。所有这些的共同点是在输入文件中定义了句点,并且在整个运行时间。 有没有办法避免 if 语句 - 因为我的速度被所有检查的东西杀死了?虽然,我想维护一个通用的原因,即能够使用 period = true 运行程序一次,而使用 period = false 运行其他时间。

【问题讨论】:

    标签: if-statement fortran gfortran do-loops


    【解决方案1】:

    如果速度真的很重要,您总是可以编写两个不同的版本。一真一假:

    if(period) then
      do i = 1,imax
        call g_period()
      end do
    else
      do i = 1,imax
        call g()
      end do
    end if
    

    你甚至可以拥有完全独立的子程序和一切。

    当您调用子例程 g() 和替代例程时,它们会做大量工作,可能不会对 if 造成太大的性能损失。但是,如果你做一些事情,比如循环一个包含许多点的大型 3D 数组,并在每个点上做一些数学运算,只有少数例外,那么在任何地方计算它并在之后为那些少数例外点撤消它可能会更快,而不是在紧密循环中引入一个分支。

    【讨论】:

    • 如果我的 do 循环比这个例子大得多,这并不理想。
    • 嗯,总会有取舍的。更快的代码通常不那么优美和简短。您有时可以从一个公共的包含文件中生成子例程或循环。
    • @AliT。如果循环如此之大,那么if 调用的开销可能不会产生重大影响。
    • 确实如此。如果 if 真的减慢了它,应该始终分析它。我当然遇到过这种情况。
    • 公平地说,如果涉及子程序调用,那么 if 对性能很重要的可能性就很低。
    猜你喜欢
    • 2020-09-19
    • 2013-05-28
    • 1970-01-01
    • 1970-01-01
    • 2017-02-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多