Bird分享 http://blog.sciencenet.cn/u/fengweiigg

博文

Linux环境下Lapack软件包的编译和使用

已有 24230 次阅读 2009-12-23 13:29 |个人分类:生活点滴|系统分类:科研笔记

自行下载编译过程

  1. 从 netlab 下载最新版本的源代码
 
  http://www.netlib.org/lapack/lapack-3.2.1.tgz
 
  2. 将源代码解压缩
 
  tar -zxf lapack-3.2.1.tgz
 
  3. 编辑 make.inc 文件,进行一些系统相关的编译参数设置
 
  PLAT : 设置生成的库函数的后缀,比如 SUN, LINUX之类的,当然也可以不设置;
 
  FORTRAN : 设置编译器,比如 g77, gfortran, ifort, g95 等等;(我设置为FORTRAN  = ifort -g)

 
  OPT:设置编译选项,根据具体的编译器和优化要求进行设置;
 
  LOADER : 设置成和FORTRAN 一样就可以了;
 
  4. 编辑 Makefile
 
  找到 lib: 选项。然后设置需要编译的库函数如下
 
  #lib: lapacklib tmglib
 
  lib: blaslib lapacklib tmglib
 
  默认的情况是不编译 blas 库的。(除非事先编译好了blas库,否则应一起编译。)
 
  5. 编译和测试 Lapack.
 
  在源代码的根目录下输入 make 回车。然后 make 程序就会自动进行编译和测试。
 
  6. Lapack 函数的使用
 
  如果编译和测试顺利的话会在源代码的根目录下生成三个文件 lapack_LINUX.a、blas_LINUX.a、tmglib_LINUX.a,其中lapack_LINUX.a 和 blas_LINUX.a 就是我们所需要的库函数。它们的使用有多种途径:

 
方法1:

  将lapack_LINUX.a 和blas_LINUX.a所在路径加入到LD_LIBRARY_PATH环境变量

  在命令行输入 echo $LD_LIBRARY_PATH,结果为/usr/lib/alliance/lib:/usr/lib/alliance/lib;

  输入LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/fengwei.igg/lapack-3.2.1

     输入 export LD_LIBRARY_PATH

  进入代码所在目录,输入 ifort test.f90 lapack_LINUX.a blas_LINUX.a

  编译生成a.out文件,命令行执行./a.out,输出结果。


方法2:

首先,必须将lapack_LINUX.a 和blas_LINUX.a库文件重命名为liblapack_LINUX.a 和libblas_LINUX.a


如以上两文件在/home/fengwei.igg/lapack-3.2.1 文件夹下,在命令行输入

ifort test.f90 -L/home/fengwei.igg/lapack-3.2.1 -llapack_LINUX -lblas_LINUX

编译生成a.out文件,命令行执行./a.out,输出结果。


方法3:
把lapack_LINUX.a 和blas_LINUX.a拷贝至代码所在目录,
输入 ifort test.f90 lapack_LINUX.a blas_LINUX.a
编译生成a.out文件,命令行执行./a.out,输出结果。


使用intel商业mkl库调用lapack

如果安装了intel公司的mkl数据库,则里面包含了lapack库,简单的使用方法为在命令行输入:
ifort test.f90  -L/opt/intel/mkl/10.2.2.025/lib/32 -lmkl_lapack95 -lguide  -lmkl_core -lmkl_intel -lmkl_intel_thread  -lpthread
如出现如下类似错误:
error while loading shared libraries: libguide.so: cannot open shared object file: No such file or directory
解决方法为将/opt/intel/mkl/10.2.2.025/lib/32添加到LD_LIBRARY_PATH,如方法1.
编译生成a.out文件,命令行执行./a.out,输出结果。

实例
 test.f90源文件:
program test_sgesv
implicit none
real :: a(3,3),b(3)
integer :: v(3),iflag
external sgesv
a=reshape([2.0,0.0,0.0,0.0,3.0,0.0,0.0,0.0,4.0],[3,3])
b=[998.0,999.0,1000.0]
print *,'a=',a
print *,'b=',b
call sgesv(3,1,a,3,v,b,3,iflag)
print *,'solve=',b
end program test_sgesv

输出结果:
 a=   2.000000      0.0000000E+00  0.0000000E+00  0.0000000E+00   3.000000   
  0.0000000E+00  0.0000000E+00  0.0000000E+00   4.000000   
 b=   998.0000       999.0000       1000.000   
 solve=   499.0000       333.0000       250.0000 

https://blog.sciencenet.cn/blog-271986-280793.html

上一篇:linux下利用ifort编译DLL
下一篇:在法国签美国B1/B2类签证
收藏 IP: .*| 热度|

0

发表评论 评论 (2 个评论)

数据加载中...

Archiver|手机版|科学网 ( 京ICP备07017567号-12 )

GMT+8, 2024-5-5 21:08

Powered by ScienceNet.cn

Copyright © 2007- 中国科学报社

返回顶部