语言, Fortran专题

Fortran程序的OpenBLAS链接和编译

GNU 的 Fortran 编译器(gfortran)的安装参考这篇:Linux系统中GNU编译器gcc/g++/gfortran的安装。Intel 的 Fortran 编译器(ifort / ifx)参考这篇:在Linux系统下Fortran的下载以及设置MKL环境。在链接 OpenBLAS 时,几乎任何主流 Fortran 编译器都可以使用,但这里推荐使用 GNU 编译器,理由是安装方便,体积较小,且 OpenBLAS 的官方文档和社区默认测试环境通常基于 gcc/gfortran。另外,如果是已经安装了 Intel oneAPI 环境,更多调用的是 Intel 的 MKL 库,而不是 OpenBLAS 库。

OpenBLAS 的介绍参考这篇:线性代数库BLAS和LAPACK的简介,安装参考这篇:在Linux系统中安装开源的线性代数库OpenBLAS

Fortran 代码调用 OpenBLAS 矩阵求逆的例子 openblas_test.f90:

program invert_simple
    implicit none
    integer, parameter :: n = 2
    double precision :: a(n,n)
    integer :: ipiv(n)
    double precision :: work(n)  ! 最小工作空间(LWORK = N)
    integer :: info

    ! 初始化一个简单的可逆矩阵: [[2, 1], [1, 2]]
    a(1,1) = 2.0d0; a(1,2) = 1.0d0
    a(2,1) = 1.0d0; a(2,2) = 2.0d0

    ! LU 分解
    call DGETRF(n, n, a, n, ipiv, info)
    if (info /= 0) stop 'DGETRF failed'

    ! 求逆(使用最小工作空间 LWORK = N)
    call DGETRI(n, a, n, ipiv, work, n, info)
    if (info /= 0) stop 'DGETRI failed'

    ! 输出结果(应为 [[0.6667, -0.3333], [-0.3333, 0.6667]])
    print *, 'Inverse:'
    print *, a(1,1), a(1,2)
    print *, a(2,1), a(2,2)
end program

默认 OpenBLAS 环境,动态链接编译:

gfortran -o test openblas_test.f90 -lopenblas

指定 OpenBLAS 路径,静态链接 OpenBLAS,动态链接 pthread 库,编译:

gfortran -o test openblas_test.f90 ~/OpenBLAS/lib/libopenblas.a -lpthread

指定 OpenBLAS 路径,完全静态链接编译:

gfortran -static -o test openblas_test.f90 ~/OpenBLAS/lib/libopenblas.a -lpthread

可以查看编译后的可执行文件 test 的大小,静态链接编译的文件会更大些:

16K     test_1
300K    test_2
1.8M    test_3

推荐使用静态链接 OpenBLAS,动态链接 pthread 库,运行会更稳定些,不容易受到系统环境的影响。

编译后运行:

./test

运行结果:

 Inverse:
  0.66666666666666663      -0.33333333333333331
 -0.33333333333333331       0.66666666666666663
6 次浏览

【说明:本站主要是个人的一些笔记和代码分享,内容可能会不定期修改。为了使全网显示的始终是最新版本,这里的文章未经同意请勿转载。引用请注明出处:https://www.guanjihuan.com

发表评论

您的邮箱地址不会被公开。 必填项已用 * 标注

Captcha Code