gpt4 book ai didi

optimization - Fortran 编译器如何优化例程参数中的操作

转载 作者:行者123 更新时间:2023-12-03 17:23:22 26 4
gpt4 key购买 nike

我在 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>是任何类型 AB应该是。

关于optimization - Fortran 编译器如何优化例程参数中的操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17996376/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com