gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 10:41:40 29 4
gpt4 key购买 nike

我有这个简单的代码,它使用 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 ALPHABETA 需要 double 值。

如果没有其他选项,您将向 LAPACK 提供单精度 float - 因此是垃圾。使用 -fdefault-real-8 可以强制指定的每个 float 默认为 double ,并且 DGEMM 可以正确输入。

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

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

它将 alpha 的值指定为 1 作为类型 8 的 float ,并将 beta 的类型 0 指定为 0。

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

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

关于fortran - 何时使用 iso_Fortran_env 、selected_int_kind、real(8) 或 -fdefault-real-8 编写或编译 Fortran 代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31131382/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com