我正在使用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因为第二个参数未使用时无用,是否执行...
此外,精确的编译优化对我来说是新的,我很想知道在遇到这些问题时我可以参考哪些资源。
答案 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>
是A
和B
应该是什么类型。