我在 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>
是 A
和 B
应该是什么类型。