CentOS7系统上的LAPACK源码安装

参考链接:linux下安装blas和lapack

BLAS 和 LAPACK 这两个数学库是很多 Linux 科学计算软件需要调用的,所以经常会用到。

LAPACK,其名为Linear Algebra PACKage的缩写,是一以Fortran编程语言编写,用于数值计算的函式集。LAPACK提供了丰富的工具函式,可用于诸如解多元线性方程式、线性系统方程组的最小平方解、计算特征向量、用于计算矩阵QR分解的Householder转换、以及奇异值分解等问题。

LAPACK的源码可以从http://www.netlib.org/lapack/处下载,BLAS也包含在其中。

BLAS,全称Basic Linear AlgebraSubprograms,即基础线性代数子程序库,里面拥有大量已经编写好的关于线性代数运算的程序。

BLAS的源码可以从 http://www.netlib.org/blas/ 下载,但实际上LAPACK中已经包含了BLAS。

0. 写在前面的:

之前采用gfortran来编译生成了lapack的库文件,但是在后续采用pgf90命令(pgf90 -llapack)来编译其它文件时,产生了以下的类似错误:

[[email protected] TEC_She]$ make
pgf90  -g -fast -c  m_bern.f90
pgf90  -g -fast -c  d_inpkey.f90
pgf90  -g -fast -c  p_menaux.f90
...
pgf90  -g -fast -o main_igsTec  -L/usr/local/lib m_bern.o d_inpkey.o ... -llapack -lblas
/usr/local/lib/liblapack.a(dormlq.o):在函数‘dormlq_’中:
dormlq.f:(.text+0x32b):对‘_gfortran_concat_string’未定义的引用
dormlq.f:(.text+0x887):对‘_gfortran_concat_string’未定义的引用
/usr/local/lib/liblapack.a(dormqr.o):在函数‘dormqr_’中:
dormqr.f:(.text+0x2f8):对‘_gfortran_concat_string’未定义的引用
dormqr.f:(.text+0x81c):对‘_gfortran_concat_string’未定义的引用
/usr/local/lib/liblapack.a(ilaenv.o):在函数‘ilaenv_’中:
ilaenv.f:(.text+0x58):对‘_gfortran_compare_string’未定义的引用
ilaenv.f:(.text+0x287):对‘_gfortran_compare_string’未定义的引用
ilaenv.f:(.text+0x2b4):对‘_gfortran_compare_string’未定义的引用
ilaenv.f:(.text+0x2d5):对‘_gfortran_compare_string’未定义的引用
ilaenv.f:(.text+0x2f4):对‘_gfortran_compare_string’未定义的引用
/usr/local/lib/liblapack.a(ilaenv.o):ilaenv.f:(.text+0x313): more undefined references to `_gfortran_compare_string‘ follow
/usr/local/lib/liblapack.a(xerbla.o):在函数‘xerbla_’中:
xerbla.f:(.text+0x49):对‘_gfortran_st_write’未定义的引用
xerbla.f:(.text+0x54):对‘_gfortran_string_len_trim’未定义的引用
xerbla.f:(.text+0x66):对‘_gfortran_transfer_character_write’未定义的引用
xerbla.f:(.text+0x76):对‘_gfortran_transfer_integer_write’未定义的引用
xerbla.f:(.text+0x7e):对‘_gfortran_st_write_done’未定义的引用
xerbla.f:(.text+0x87):对‘_gfortran_stop_string’未定义的引用
/usr/local/lib/liblapack.a(iparmq.o):在函数‘iparmq_’中:
iparmq.f:(.text+0x150):对‘_gfortran_compare_string’未定义的引用
iparmq.f:(.text+0x16f):对‘_gfortran_compare_string’未定义的引用
iparmq.f:(.text+0x18f):对‘_gfortran_compare_string’未定义的引用
iparmq.f:(.text+0x273):对‘_gfortran_compare_string’未定义的引用
iparmq.f:(.text+0x28e):对‘_gfortran_compare_string’未定义的引用
/usr/local/lib/liblapack.a(iparam2stage.o):iparam2stage.F:(.text+0x263): more undefined references to `_gfortran_compare_string‘ follow
make: *** [all] 错误 2

这是由于gfortran和pgf90编译命令不同导致的,因而本文以PGI编译器来执行lapack源代码的编译,即,Fortran程序采用pgf90命令,C程序采用pgcc命令来编译,相应的具体过程及参数记录如下。

1. 确保机器上安装了PGI gfortran编译器。如果没有安装的话,手动安装:

sudo yum install gfortran

PGI编译器需要去官网下载,具体安装过程参见我的另一篇博客《CentOS 7上安装PGI 2017编译器》

2. 下载blas, cblas, lapack 源代码, 这些源码都可以在http://www.netlib.org 上找到,下载并解压。

我下载的版本是lapack-3.7.1.tgz,解压之后会有一个文件夹,lapack-3.7.1,它含有BLAS,CBLAS,LAPACKE等文件夹,其中BLAS是BLAS的源码,CBLAS是BLAS的C语言接口。

3. 这里就是具体的编译步骤

(1) 编译blas

进入 BLAS/SRC 文件夹,执行以下几条命令

cd BLAS/SRC# gfortran -c -O3 *.f # 编译所有的 .f 文件,生成 .o文件,这里采用PGI编译器的pgf90命令来编译
pgf90-c -O3 *.f  # 编译所有的 .f 文件,生成 .o文件,这个pgf90编译命令与~/lapack*/make.inc保持一致
ar rv libblas.a *.o  # 链接所有的 .o文件,生成.a 文件
sudo cp libblas.a /usr/local/lib  #将库文件复制到系统库目录

(2) 编译cblas

进入CBLAS 文件夹,首先根据你自己的计算机平台,将目录下某个 Makefile.XXX复制为 Makefile.in , XXX表示计算机的平台,如果是linux,那么就将Makefile.LINUX 复制为Makefile.in,然后执行以下命令

cd .. && cd ../CBLAScp ../BLAS/SRC/libblas.a ./testing/  # 将上一步编译成功的 libblas.a复制到 CBLAS目录下的testing子目录
make # 编译所有的目录
sudo cp ../libcblas.a /usr/local/lib/libcblas.a #将库文件复制到系统库目录下 

(3) 编译 lapack 以及 lapacke

这一步比较麻烦,首先进入lapack-3.7.1文件夹,然后根据平台的特点,将该目录下对应的 make.inc.example 文件另存为 make.inc ,再编辑 Makefile,编译 lapack 和 lapacke 文件,并将 lapacke 目录下的头文件、lapack 目录下生成的 *.a 文件拷贝到系统目录(/usr/local/lib, /usr/lib)下。

cd ..
cp make.inc.example make.inc
vi Makefile # 修改 lapack-3.7.1/Makefile 文件,因为 lapack 依赖于 blas 库
 # 旧版本lib: lapacklib tmglib
#lib: blaslib variants lapacklib tmglib

 # 新版本#lib: lapacklib tmglib
lib: blaslib variants lapacklib tmglib

若采用PGI编译器,则以下参数也要作修改:...#  CC is the C compiler, normally invoked with options CFLAGS.#CC     = pgcc # gccCFLAGS = -O3

#  Modify the FORTRAN and OPTS definitions to refer to the compiler#  and desired compiler options for your machine.  NOOPT refers to#  the compiler options desired when NO OPTIMIZATION is selected.##  Note: During a regular execution, LAPACK might create NaN and Inf#  and handle these quantities appropriately. As a consequence, one#  should not compile LAPACK with flags such as -ffpe-trap=overflow.#FORTRAN = pgf90 # gfortranOPTS    = -O2 -Mrecursive # -frecursiveDRVOPTS = $(OPTS)NOOPT   = -O0 -Mrecursive # -frecursive

#  Define LOADER and LOADOPTS to refer to the loader and desired#  load options for your machine.#LOADER   = pgf90 # gfortranLOADOPTS =

#  The archiver and the flag(s) to use when building an archive#  (library).  If your system has no ranlib, set RANLIB = echo.#ARCH      = arARCHFLAGS = crRANLIB    = ranlib

#  Timer for the SECOND and DSECND routines##  Default:  SECOND and DSECND will use a call to the#  EXTERNAL FUNCTION ETIME#TIMER = EXT_ETIME#  For RS6K:  SECOND and DSECND will use a call to the#  EXTERNAL FUNCTION ETIME_#TIMER = EXT_ETIME_#  For gfortran compiler:  SECOND and DSECND will use a call to the#  INTERNAL FUNCTION ETIME#TIMER = INT_ETIME#  If your Fortran compiler does not provide etime (like Nag Fortran#  Compiler, etc...) SECOND and DSECND will use a call to the#  INTERNAL FUNCTION CPU_TIMETIMER = INT_CPU_TIME#  If none of these work, you can use the NONE value.#  In that case, SECOND and DSECND will always return 0.#TIMER = NONE...

make # 编译所有的lapack文件

cd LAPACKE # 进入LAPACKE 文件夹,这个文件夹包含lapack的C语言接口文件
make # 编译lapacke
sudo cp include/*.h /usr/local/include #将lapacke的头文件复制到系统头文件目录,# 包括: lapacke.h, lapacke_config.h, lapacke_mangling.h,lapacke_mangling_with_flags.h lapacke_utils.h
cd ..  # 返回到 lapack-3.7.1 目录
sudo cp *.a /usr/local/lib  # 将生成的所有库文件复制到系统库目录,包括:liblapack.a, liblapacke.a, librefblas.a,libtmglib.a。

sudo cp *.a /usr/lib        # 将生成的所有库文件复制到系统库目录,包括:liblapack.a, liblapacke.a, librefblas.a,libtmglib.a

Ques: 事实上,编译 lapack 时生成的 librefblas.a 文件与编译 BLAS 时生成的 libblas.a 文件大小基本一样,这里生成了两次,是否可以省去第(1)-(2)步?

至此blas,cblas 和 lapack 就成功安装到你的电脑上了。

时间: 2024-10-18 00:24:39

CentOS7系统上的LAPACK源码安装的相关文章

CentOS7系统上的GPSTK源码安装

网址:http://www.gpstk.org/bin/view/Documentation/BuildingGPSTkUnderUnix 这里使用Cmake来安装源码,网站上的原文摘抄如下,有少部分作了修改的地方,使用红色字体和下划线来标识. The following procedure will build and install the GPSTk. Ensure that prerequisites such as CMake have been installed. Download

centos6.5上mysql5.6源码安装

先用yum把依赖包都安装,最好在yum update一下升级系统.关闭selinux. yum -y install ntp vim-enhanced vixie-cron gcc gcc-c++ gcc-g77 flex bison autoconf automake glibc make gmake \glibc-devel glib2 glib2-devel bzip2 bzip2-devel ncurses ncurses-devel libtool* zlib-devel 创建mysq

LNMP架构 源码安装nginx+mysql+php+memcache+论坛

一.LNMP架构 LNMP代表的就是:Linux系统下Nginx+MySQL+PHP这种网站服务器架构. Linux是一类Unix计算机操作系统的统称,是目前最流行的免费操作系统.代表版本有:debian.centos.ubuntu.fedora.gentoo等. Nginx是一个高性能的HTTP和反向代理服务器,也是一个IMAP/POP3/SMTP代理服务器. Mysql是一个小型关系型数据库管理系统. PHP是一种在服务器端执行的嵌入HTML文档的脚本语言. 这四种软件均为免费开源软件,组合

在 Linux 系统上源码安装 GTK+ 2.0

在 Linux 系统上源码安装 GTK+ 2.0==================================================Keywords: GTK+, Install, Linux, SourceAuthor:       whyglinux (whyglinux AT hotmail DOT com)Date:          2007-01-07==================================================目录0. 前言1.

CentOS7 上源码安装KVM(qemu--kvm)

在centos7下已经集成了kvm 环境:centos7 检查/dev/kvm这个文件,它是kvm内核模块提供给用户空间的qemu-kvm程序使用的一个控制接口,它提供了客户机(Guest)操作系统运行所需要的模拟和实际的硬件设备环境. 确定KVM模块确实全部安装好,下面来看一下qemu-kvm的编译和安装. 源码安装qemu-kvm 除了在内核空间的KVM模块之外,在用户空间需要QEMU来模拟所需要CPU和设备模型以及用于启动客户机进程,这样才有了一个完整的KVM运行环境. 参考文档:http

[原创]在Centos7.2上源码安装PHP、Nginx、Zentao禅道

版本 操作系统:CentOS Linux release 7.2.1511 (Core) PHP:5.6.33 Nginx:1.12.2 MySQL:5.6.38(192.168.1.103的Windows) Zentao禅道:9.7.stable 安装路径 源码路径:/usr/local/src PHP:/usr/local/php Nginx:/usr/local/nginx Zentao禅道:/opt/zentao 安装PHP 安装php依赖 yum install gcc libxml2

源码安装nagios(centos7)

一.nagios简介1.一款开源的电脑系统和网络监视工具,可以有效监控windows.Linux和Unix的主机状态 ,交换机.路由器等网络设置.在系统或服务状态异常时发出邮件或者短信报警,第一 时间通知支离维人员,在状态恢复后发出正常的邮件或者短信通知.2.主要功能 网络服务监控(SMTP.POP3.HTTP.NNTP.ICMP.SNMP.FTP.SSH) 主机资源监控(CPU load.disk usage.system logs),也包括Windows主机(使用NSClient++ plu

Centos7源码安装mysql

转子 http://www.linuxidc.com/Linux/2015-06/119354.htm 目录 准备工作 运行环境 确认你的安装版本 下载MySQL 安装MySQL 准备安装环境 编译和安装 配置MySQL 单实例配置 单实例配置方法 添加防火墙 启动MySQL 重启MySQL 多实例配置 什么是多实例 多实例配置方法 创建启动文件 初始化数据库 配置防火墙 启动MySQL 登陆MySQL 重启MySQL 准备工作 运行环境 本文的运行环境如下 系统版本 CentOS7最小化安装:

CentOS7下源码安装mysql5.6

目录 准备工作 运行环境 确认你的安装版本 下载mysql 安装mysql 准备安装环境 编译和安装 配置mysql 单实例配置      单实例配置方法          添加防火墙          启动mysql          重启mysql 多实例配置          什么是多实例          多实例配置方法          创建启动文件          初始化数据库          配置防火墙          启动mysql          登陆mysql