我有这个简单的代码,使用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
答案 0 :(得分:2)
DGEMM
预计double precision
和ALPHA
的{{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
)。