2

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

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

4

1 回答 1

3

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

B+C正如 Floris & High Performance Mark 评论的那样,即使子例程不使用编译器,编译器很可能仍然会执行。作为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应该在哪里。

于 2013-08-01T15:44:59.210 回答