何时使用 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 precision
值 ALPHA
和 BETA
。
如果没有更多选项,您将向 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
)。
我有这个简单的代码,它使用 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 precision
值 ALPHA
和 BETA
。
如果没有更多选项,您将向 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
)。