fortran编译器如何在例程参数中优化操作

时间:2013-08-01 14:07:17

标签: optimization compiler-construction fortran

我正在使用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因为第二个参数未使用时无用,是否执行...

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

1 个答案:

答案 0 :(得分:3)

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

作为Floris&高性能标记注释,即使子例程不使用它,编译器仍可能执行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应该是什么类型。