我在Fortran 90中使用的子程序也有参数。在第一次调用这些子例程时,第二个例程没有用,但仍然存在。我知道这不是做事情的好方法,但是由于历史原因,它是这样制作的。

例如:

CALL myroutine(A, B + C)


哪里:

SUBROUTINE myroutine (A, B)
    IF(.NOT. first) THEN
       !Using B in a way or another..
    ELSE
       !Other operations, not using B.
    END IF
END SUBROUTINE routine


我正在使用gfortran 4.4.7与-O3进行编译。

我想知道是否执行了B + C操作,因为它没有使用第二个参数,所以在第一次调用myroutine时没有用。

而且,精确的编译优化对我来说是新的,并且我想知道在遇到此类问题时可以参考哪些资源。

最佳答案

这并不是对这个问题的答案,更多地是关于可能优化代码的评论。

正如Floris&High Performance Mark所说,即使子例程不使用B+C,编译器仍可能会执行它。作为每次将B+C传递给子例程的一种替代方法,可以将标志OPTIONAL用作子例程中变量B的标志,并与PRESENT查询结合使用。然后,您可以在第一次调用子例程时消除B+C,然后将其添加到第二次调用中:

PROGRAM main
    IMPLICIT NONE
    ! definitions of a, b, c, etc

    CALL myroutine(a)
    CALL myroutine(a,b+c)

  CONTAINS
    SUBROUTINE myroutine(a,b)
       <TYPE> :: a
       <TYPE>, OPTIONAL :: b
       IF(PRESENT(b)) THEN
          ! operations using b and a
       ELSE
          ! operations using a only
       ENDIF
    END SUBROUTINE
END PROGRAM


其中<TYPE>AB的类型。

关于optimization - fortran编译器如何优化例程参数中的操作,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/17996376/

10-12 22:22