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

问题描述 投票:0回答:1

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

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

optimization fortran
1个回答
3
投票

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

正如 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
应该是什么类型。

© www.soinside.com 2019 - 2024. All rights reserved.