`ignore_tkr` 指令中的 `d` 说明符

`d` specifier in `ignore_tkr` directive

我有这个旧代码

module foo
    interface
      subroutine bar(A)
        !dir$ ignore_tkr(trd) A
        DOUBLE COMPLEX, DIMENSION(*) :: A
      end subroutine
    end interface
end module foo

nvfortan 和 gfortran 编译器可以很好地编译它。然而,LLVM Flang 甚至无法解析它,因为它不知道 ignore_tkr 中的 d 是什么意思。

我想,这意味着“忽略维度”。但是我google对此一无所知。

有人可以发送一些东西来阅读吗and/or详细解释一下这个东西?

编译器指令是特定于编译器的。请注意,对于没有任何扩展的标准 Fortran 编译器,它们只是注释,将被忽略。它与许多编译器一起编译的事实可能只意味着这些编译器完全忽略该指令。

一些编译器会理解

!DIR$

其他会理解的

!DEC$

!GCC$

例如 Gfortran。没有义务理解特定于其他编译器的指令,只会忽略您显示的指令。


例如gfortran理解这些指令https://gcc.gnu.org/onlinedocs/gfortran/GNU-Fortran-Compiler-Directives.html

对于 Flang 支持的指令,请查阅文档 https://releases.llvm.org/12.0.0/tools/flang/docs/Directives.html


请注意 !dir$ ignore_tkr (tkr) var-list 受 Flang 支持,并且将省略检查类型,种类 and/or 传递给过程的参数的等级。

您在 (tkr) 中指定所需的检查。如果要禁用所有三个,请使用所有 tkr。字母 d 不在可能使用的字母之列,因此是错误的。如果要禁用对数组维数的检查,请使用 r for rank.

Rank 是 Fortran 标准中用于表示数组维数的正确词。

相同的语法适用于 nvfortran,请参阅 https://docs.nvidia.com/hpc-sdk/archive/20.7/compilers/pdf/hpc207ref.pdf 中的第 4.4 节。唯一允许的参数是 tkr。不,d 是不允许的。对于这些编译器,它在这种情况下没有任何意义。

程序员可能无意中使用了 d 而不是 r,nvfortran 编译器可能会忽略它,甚至可能会默默地将其转换为 d。这种行为只会特定于该编译器。如果在这种情况下有意义,我会把 d 转换成 r

4.4.1. IGNORE_TKR Directive Syntax
The syntax for the IGNORE_TKR directive is this:
!DIR$ IGNORE_TKR [ [(<letter>) <dummy_arg>] ... ]
<letter> is one or any combination of the following:
T – type
K – kind
R – rank
For example, KR indicates to ignore both kind and rank rules and TKR indicates to ignore the type, kind, and rank arguments