何时使用 iso_Fortran_env 、selected_int_kind、real(8) 或 -fdefault-real-8 来编写或编译 Fortran 代码?

when to use iso_Fortran_env ,selected_int_kind,real(8),or -fdefault-real-8 for writing or compiling fortran code?

我有这个简单的代码,它使用 DGEMM 例程进行矩阵乘法

program check

  implicit none
  real(8),dimension(2,2)::A,B,C
  A(1,1)=4.5
  A(1,2)=4.5
  A(2,1)=4.5
  A(2,2)=4.5
  B(1,1)=2.5
  B(1,2)=2.5
  B(2,1)=2.5
  B(2,2)=2.5

  c=0.0

  call DGEMM('n','n',2,2,2,1.00,A,2,B,2,0.00,C,2)
  print *,C(1,1)    
  print *,C(1,2)  

  print *,C(2,1)    
  print *,C(2,2)
end program check

现在当我用命令编译这段代码时

gfortran -o check check.f90   -lblas 

我得到了一些随机垃圾值。但是当我添加

-fdefault-real-8

我得到正确值的编译选项。

但由于它不是Fortran 中变量声明的好方法。所以我使用了 iso_fortran_env 内部模块并在代码中添加了两行

use iso_fortran_env
real(kind=real32),dimension(2,2)::A,B,C

并用

编译
 gfortran -o check check.f90 -lblas

我又得到了错误的输出。 我在这段代码中哪里出错了? 我在 32 位 linux 上并使用 GCC

DGEMM 期望 double precisionALPHABETA

如果没有更多选项,您将向 LAPACK 提供单精度浮点数 - 因此是垃圾。 使用 -fdefault-real-8 强制指定的每个浮点数默认为双精度,并且 DGEMM 被正确输入。

在你的情况下,调用应该是:

call DGEMM('n','n',2,2,2,1.00_8,A,2,B,2,0.00_8,C,2)

将 alpha 的值指定为 1 作为类型 8 的浮点数,对于 beta 指定类型为 8 的零。

如果您想在单精度中执行矩阵向量乘积,请使用SGEMM

请注意,这是高度特定于编译器的,您应该考虑使用 ISO_Fortran_env 模块中的 REAL32/REAL64(也用于 A 的声明, B,和 C)。