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

时间:2015-06-30 06:44:23

标签: fortran gfortran

我有这个简单的代码,使用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实时-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

1 个答案:

答案 0 :(得分:2)

DGEMM预计double precisionALPHA的{​​{1}}值。

如果没有其他选项,您可以向LAPACK提供单精度浮点数 - 因此垃圾。 使用BETA默认情况下强制指定的每个浮点数都是双精度,并且正确输入-fdefault-real-8

在您的情况下,电话应该是:

DGEMM

指定alpha为call DGEMM('n','n',2,2,2,1.00_8,A,2,B,2,0.00_8,C,2) 的值为类型为8的浮点数,而为类型为8的类型为零。

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

请注意,这是高度针对特定于编译器的,您应该考虑使用1模块中的REAL32 / REAL64来代替ISO_Fortran_env,{{ 1}}和A)。