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