使用BLAS(LAPACK)模块编译Fortran代码

4

我刚开始使用Fortran,在我的程序中使用BLAS模块从LAPACK中遇到了问题。

我正在使用Ubuntu 18.04,已经通过命令sudo apt-get install libblas-dev liblapack-dev安装了LAPACK和BLAS包。我还从http://www.netlib.org/lapack/网站下载了LAPACK,并按照此视频中的说明进行安装。

我的程序应该使用blas_sparse模块,因此我编写了类似以下的代码:

program example

use blas_sparse

implicit none

    ! some code ...

end program example

我正在尝试使用以下命令使用gfortran编译我的代码(example.F90):

gfortran example.F90 -llapack -lblas

就像这个示例视频(1:11)上的操作一样。但是它并不能正常工作,编译器会返回以下错误信息:

example.F90:3:8:

 use blas_sparse
    1
Fatal Error: Can't open module file ‘blas_sparse.mod’ for reading at (1): No such file or directory

这里的问题是什么?我看到三个潜在原因:
  1. 代码有误。
  2. 我用来编译的命令不正确。
  3. LAPACK 和 BLAS 没有真正安装。
ad. 1. 也许我应该在我的代码中添加一个名为 blas_sparse 的模块?此外,这只是把问题转移到了另一个地方,因为我仍然需要从 BLAS 中导入某些过程。不幸的是,我不知道 use 命令如何工作,所以我不知道应该尝试改变什么。
ad. 2. 也许我的编译器不知道 -llapack-lblas 库的位置。我尝试明确写出它们,并使用它们:
gfortran example.F90 -llapack -lblas -L/usr/local/lib

在安装LAPACK和BLAS时,我创建了指向liblapack.aliblapack.a的符号链接(参见ad. 3.)。我不知道-llapack-lblas标志是什么,这使得我很难检查编译器是否“能看到”它们。

ad. 3. 我在计算机上安装BLAS和LAPACK的步骤如下:

  • 从netlib.org/lapack网站下载LAPACK 3.8.0
  • 使用以下命令提取库并将文件安装在计算机上

:

tar zxvf lapack-3.8.0.tar.gz
cd lapack-3.8.0/
cp make.inc.example make.inc
make blaslib
make lapacklib
sudo ln -s /home/Download/lapack-3.8.0/liblapack.a /usr/local/lib/liblapack.a
sudo ln -s /home/Download/lapack-3.8.0/librefblas.a /usr/local/lib/librefblas.a

还可以通过apt-get安装它:

sudo apt-get install libblas-dev liblapack-dev

我非常感谢任何帮助解决这个问题的人。

编辑:

我实际上发现应该使用来自BLAST网站blas_sparse.f90blas_sparse_namedconstant.f90blas_sparse_proto.h文件创建那些.mod文件。前两个文件我只是作为模块添加到我的代码中,gfortan编译器会创建正确的(我希望如此).mod文件。但是第三个文件是用C语言编写的,因此我不能将其直接放入我的代码中。

所以现在的问题是如何将.h文件与我的代码绑定。我需要创建一些makefile或编译.h文件以创建.mod文件吗?

编辑2:

看起来我只是没有从BLAST网站安装稀疏BLAS。我应该做的是:

  • 下载库:
wget -P target/directory/ http://www.netlib.org/toms/818
  • 解压文件:
mv 818 818.gz
gunzip 818.gz
  • 删除前三行并添加.sh扩展名:
tail -n +4 818 > 818.sh; rm 818
  • 安装库:
bash 818.sh
# before doing the following step read the notes below
bash INSTALL # this file has been created by 818.sh
./TESTER/test_all # running test

在最后一步中,我还需要编辑SOFTWARE/MakefileINSTALL文件,并创建TESTER/Makefile.GNU文件以使用gfortran作为编译器。最后,我将blas_sparse.mod文件复制到我的程序所在的目录中。
cp SOFTWARE/blas_sparse.mod blas_sparse.mod

现在我可以使用gfortran编译器编译程序:

gfortran example.F90 -llapack -lblas
1个回答

3
你不只是使用大多数教程、问题和答案所讲述的简单常规BLAS。你实际上是在使用现代Fortran接口,使用模块。
大多数编译器使用.mod文件来描述模块,并且您需要告诉编译器在哪里找到这些文件以用于稀疏BLAS。在gfortran中,您可以使用-Ipath来完成这个过程,其中path是指向那些.mod文件的路径。这与C++中的头文件需求非常相似,有关此相关问题请参阅是否未包含稀疏BLAS?

但是在我的电脑上没有这些文件。这些文件是在编译我的程序时创建的。我意识到应该从BLAST的模块和包含文件中准备这些文件。现在我的问题是,我不知道如何使用用C编写的这个包含文件(blas_sparse_proto.h)创建一个 .mod 文件。 - Maciej K.
不,Fortran编译器无法使用包含C代码的.h文件。如果您的库同时支持Fortran和C,则会有单独的头文件或模块文件。 - tim18
1
@MaciejK 当安装库时,编译器会创建.mod文件。 - Vladimir F Героям слава

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接