24小时热门版块排行榜    

查看: 2785  |  回复: 6
本帖产生 1 个 程序强帖 ,点击这里进行查看

coolrainbow

木虫 (著名写手)

未来国家冻凉

[交流] 【分享】MKL程序编译与连接:Lapack篇 已有5人参与

原帖转自我的空间:http://hi.baidu.com/coolrainbow/blog/index/1

经验表明,第一次做MKL程序编译时,大多数人都会走很多弯路,编译几个小时也不成功。其实这个原因很简单,就是:懒于阅读技术文档!!!!!!事实上,本人当时就是这样,看到3000多页的MKL手册头都大了,于是在编译时就“跟着感觉走”,弄得找不到库或者函数错误。其实,花一个小时读下文档,绝对比自己瞎折腾要强的多,这里把编译MKL的一些经验与大家分享下,作为快速入门。真正深入的话,还是那句:读文档!

1 MKL的环境变量

安装好MKL后,需要设置一些环境变量,这样才能找到所需要的库,这可以通过/opt/intel /Compiler/11.1/064/mkl/lib/tools/enviroments/mklvars{your-architecutre}. {sh|csh}实现。如果需要的话,可以加入到/etc/profile或你的.bashrc中。在程序编译或运行时,如果发生can not find libXXX之类,记得导出相应的LD_LIBRARY_PATH。如:

can not find libmkl_intel_thread: cannot open shared object file‎...

如果你的这个库位于/opt/intel/Compiler/11.1/064/mkl/lib/em64t,那么:

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/opt/intel/Compiler/11.1/064/mkl/lib/em64t

即可。

2 函数选择:Lapack

MKL提供了3000多页的技术文档,对每一个函数进行了详细的介绍。这里仅对Lapack系列做一些介绍。

初学Lapack的人可能会问:我怎么知道哪个函数是做向量点积的,哪个函数是做奇异值分解的。问的最多的是:有没有什么书可以参考的?答案:至少我没见过哪个书像讲MFC或PHP那样详细的把Lapack的每一个函数讲解的书。那么唯一的途径就是阅读技术文档。不要头疼,那个文档有英文版和日语版(shit)的,没有中文版的。好好学英文吧。

Lapack中的函数的名称都是XYYZZZ形式(BLAS类似)的,

X     精度。 如
s     单精度(对应于Fortran中的real(kink = 4),C中的float)
d     双精度(对应于Fortran中的real(kink = 8),C中的double)
c     单精度复数   z      双精度复数

YY   对应的矩阵类型和存储方式

ge    一般的矩阵,存储方式full
所谓full就是说,矩阵A的元素aij以数组a(i, j)或a[j]的形式存储于计算机中。这是最简单的方法,但是对稀疏矩阵或元素有一定相关性的矩阵效率较低

sy     对称矩阵,以full方式存储
sp     对称矩阵,以pack方式存储
pack方式对symmetric matrix采用了一维数组优化存储的方法,可以减小内存的使用。有两种存储方法,在Lapack程序中分别用'U' 'L'表示,对于'U',简单的说:
aij --->    a(i+j*(j-1/2)) where i < j
'V‘类似。

还有其他的类型,请参考技术文档。

ZZZ 任务类型

就是你要干什么。如dot表示点积,trd表示三对角化等等

知道了这个命名规则后,找函数就方便多了。

3 函数参数:Lapack

Lapack中的每一个函数都有很长的参数,常常把初学者吓倒。并不是说对矩阵A,B求乘法,只要简单的输入A,B就可以了。还有一些辅助空间,任务类型之类的,都要输入,如矩阵乘法:

call dgemm('n','n',N,M,K,a,x,N,y,K,b,z,N)

执行矩阵乘法z=x*y,但还有一些character*1 的'n','n'以及integer的N,K等等,这些含义一定要仔细弄清,不然可能会使任务执行错误!

4 编译连接

这是最头痛的问题。MKL的连接选项比较长,最好使用make工具,我常用的一个模板如下

mkllib=/opt/intel/Compiler/11.1/064/mkl/lib/em64t
mklinc=/opt/intel/Compiler/11.1/064/mkl/include
foo: foo.o
           ifort -o foo foo.o -I$(mklinc) -L$(mkllib) -lmkl_intel_lp64 -lmkl_intel_thread -lmkl_core -lmkl_lapack95_lp64 -liomp5 -lpthread

在连接MKL程序时,要在每一个“LAYER”中选择一个库,
1 interface layer:提供程序接口,即libmkl_intel{lp64},其中lp64是对em64t或ia64版本。
2 threading layer:线程接口。一般都是libmkl_intel_thread。注意,有了它后,一定要加上iomp5和pthread库,不然会出现连接错误。
3 computational layer,计算接口,即libmkl_core和你所需要的,如lapack的libmkl_lapack95_lp64或者线性方程组的libmkl_solver_lp64等等。
4 RTL接口,即pthread等等。

这样才可以连接成功。

实例:

现在以一个实例完成。想算一个矩阵乘法,矩阵用双精度,一般存储模式,则选用dge???函数,查文档得知?gemm做矩阵乘法,于是选用dgemm,这个算矩阵乘法的程序代码:
CODE:
program main
    integer,parameter::N=3000
    integer,parameter::M=2000
    integer,parameter::K=4000
    real(kind=8) a,b
    real(kind=8),pointer::x(:,:)
    real(kind=8),pointer::y(:,:)
    real(kind=8),pointer::z(:,:)
        a=1.0
        b=0.0
        allocate(x(N,K))
        allocate(y(K,M))
        allocate(z(N,M))
        x=10.0
        y=20.0
        z=0.0
        write (*,*) "Performing matrix multiplication..."
        call dgemm('n','n',N,M,K,a,x,N,y,K,b,z,N)
        write (*,*) "DONE!"
   deallocate(x)
   deallocate(y)
   deallocate(z)
end

命名为dge.f90,写Makefile:
CODE:
mkllib=/opt/intel/Compiler/11.1/064/mkl/lib/em64t
mklinc=/opt/intel/Compiler/11.1/064/mkl/include
FCCFLAG= -lmkl_intel_lp64 -lmkl_intel_thread -lmkl_core -lmkl_lapack95_lp64 -liomp5 -lpthread
FCC = ifort
dge: dge.o
        $FCC -o dge dge.o -I$(mklinc) -L$(mkllib) $(FCCFLAG) -g
dge.o: dge.f90
        $FCC dge.f90 -c -g

然后执行make,好,一个叫dge的可执行程序出现了,在我的机器上运行时间为1.457s。用我自己随手写的一个矩阵乘法程序一算:11min34s,汗颜....

[ Last edited by coolrainbow on 2010-11-18 at 15:21 ]
回复此楼

» 收录本帖的淘帖专辑推荐

vasp计算资料 科研录 并行计算

» 本帖已获得的红花(最新10朵)

» 猜你喜欢

» 本主题相关价值贴推荐,对您同样有帮助:

技术博客:http://hi.baidu.com/coolrainbow/blog
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

dumashu

铁虫 (初入文坛)


小木虫(金币+0.5):给个红包,谢谢回帖交流
lapack有95的接口,不需要写很多参数
2楼2010-11-22 14:01:58
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

holmescn

金虫 (正式写手)


小木虫(金币+0.5):给个红包,谢谢回帖交流
谢谢分享啊! 过两天可能需要用这个.

另外, 我一般都会先看一个Tutorial或者Getting Started什么的, 然后再在基本的demo里开始修改.
3楼2010-11-22 16:36:16
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

holmescn

金虫 (正式写手)


小木虫(金币+0.5):给个红包,谢谢回帖交流
话说, 不用写
USE MKL95_LAPACK
吗?
4楼2010-12-01 08:50:10
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

coolrainbow

木虫 (著名写手)

未来国家冻凉

引用回帖:
Originally posted by holmescn at 2010-12-01 08:50:10:
话说, 不用写
USE MKL95_LAPACK
吗?

我这里不用~
技术博客:http://hi.baidu.com/coolrainbow/blog
5楼2010-12-01 09:58:02
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

田山东

捐助贵宾 (著名写手)

gfortran下有介绍吗
everythinghasitsseason.enjoyyourlife.
6楼2012-05-31 18:35:02
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

wufengseu

木虫 (正式写手)

送红花一朵
好文章!
7楼2013-12-06 22:01:27
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖
相关版块跳转 我要订阅楼主 coolrainbow 的主题更新
普通表情 高级回复 (可上传附件)
最具人气热帖推荐 [查看全部] 作者 回/看 最后发表
[基金申请] 投票:  有多少人是今天查系统知道结果的? +15 爱看书的可乐 2026-08-26 17/850 2026-08-27 17:25 by xxniao123
[基金申请] 国自然面上复盘~欢迎讨论 (金币+5) +10 晴天加油 2026-08-26 11/550 2026-08-27 16:35 by msuhlx
[基金申请] 为什么资助数各大高校都创新高,自己申请怎么就这么难 +7 Kittylucky 2026-08-27 7/350 2026-08-27 16:31 by msuhlx
[基金申请] 基金未中,这种答复是模板吗? +5 zhaosm1982 2026-08-27 6/300 2026-08-27 16:00 by lfy8008
[教师之家] 导师吐槽:我怎么摊上了这么个极品研究生! +6 苏东坡二世 2026-08-23 6/300 2026-08-27 13:57 by zhangjianl
[文学芳草园] 梦想 +3 myrtle 2026-08-26 3/150 2026-08-27 10:01 by angelyueyi
[基金申请] 为什么 国际(地区)合作与交流项目 没有放榜? 10+3 majunge000 2026-08-26 11/550 2026-08-27 08:42 by 北京莱茵编辑
[基金申请] 让我中一个面上吧! +13 大萍1987 2026-08-20 17/850 2026-08-27 08:20 by 大萍1987
[硕博家园] 售SCI一区T0P文章,我:8.O.55.1.O.54,科目齐全,可+急 +3 LIbGuocjEEYw 2026-08-26 4/200 2026-08-27 02:01 by Ie9AyIAvGbvs
[基金申请] 我不理解! +15 Edward_pc 2026-08-26 23/1150 2026-08-26 20:34 by zzuzxg
[基金申请] 2026年的国家社科基金项目通讯评审的新规则与新动向、新挑战 +7 process2012 2026-08-23 10/500 2026-08-26 19:23 by hmhminy
[基金申请] 系统查不到 +10 董八千 2026-08-26 10/500 2026-08-26 16:30 by Equinoxhua
[基金申请] 2026年8月25日国自然放榜前突然收到列入评审专家邮件,有关系吗? +25 木水思豆 2026-08-25 28/1400 2026-08-26 14:53 by draco1987
[基金申请] 出来了 +9 trojank 2026-08-26 9/450 2026-08-26 14:25 by 宝贝虫子
[基金申请] 国际合作可查了,中了面上 (EPI+1)(金币+50) +18 Ldrop2023 2026-08-26 18/900 2026-08-26 11:15 by cmrandy
[基金申请] 国合现在查不到了吗? +10 chengyan1220 2026-08-24 20/1000 2026-08-26 08:57 by peasantsprig
[基金申请] 没有任何消息-是不是就凉了 +9 图啦图啦 2026-08-24 10/500 2026-08-25 11:59 by 南海小哥
[基金申请] 建议基金发布提前给出明确的时间点 +13 kulium 2026-08-21 16/800 2026-08-24 16:27 by superceng
[教师之家] 跳槽后在研项目怎么办? +5 简单化xn 2026-08-22 10/500 2026-08-23 12:38 by 简单化xn
[基金申请] 应该是下周三26日公布了吧? +4 哈哈蛤? 2026-08-21 4/200 2026-08-21 10:58 by Vivilian
信息提示
请填处理意见