MKL程序编译与连接:Lapack篇

How to build MTFMapper MTFMapper RequiresOpenCV automatically found 3.1.0. See “自动”检测OpenCV ?!! in Build OpenCV 3.1 from source files on Windows TCLAP (Templatized C++ Command Line Parser Library) Manually a 阅读详情

 原帖转自我的空间: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的形式存储于计算机中。这是最简单的方法,但是对稀疏矩阵或元素有一定相关性的矩阵效率较低

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,这个算矩阵乘法的程序代码:


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:


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,汗颜....

 

 

http://emuch.net/html/201012/2608578.html

VS2022 Fortran配置MKL 调用lapack 64位库 下载64位的,然后就是添加文件所在的文件夹,以及添加lib,就可以直接使用lapack中的函数,但是现在Oneapi中集成了lapack库,所以可以直接调用,如下所示。添加C:\Program Files (x86)\Intel\oneAPI\mkl\latest\include\intel64\ilp64。添加C:\Program Files (x86)\Intel\oneAPI\mkl\2023.0.0\lib\intel64。5. 在电脑属性-高级-环境变量-系统Path中添加。 阅读详情

相关推荐

在跨平台C++项目中条件化使用Intel MKL与LAPACK/BLAS进行矩阵计算

首先,定义一个纯虚类(接口),来抽象化所有你需要的线性代数操作(例如,矩阵乘法、求解线性方程组等)。这允许你在代码的其余部分使用统一的接口,而无需关心底层的具体实现。

weixin_30777913的博客 662

linux命令行如何换行,一行命令太长,看的不清晰,

1.如图是列子; 2."\"  +ENTER 就可以实现换行 3.还有一个linux命令行的相关操作;ctrl+a, ctrl+e分别代表把管标移动到这条一行命令最前和最后

sinat_36572927的博客 5万+

VS2022+Fortran调用MKL库实战:手把手教你配置LAPACK 64位环境(含常见错误排查)

本文提供了一份详尽的实战指南,手把手教你如何在Visual Studio 2022中配置Fortran项目以调用Intel MKL库中的LAPACK函数,特别针对64位环境。文章深入解析了VS2022、Fortran编译器与MKL的协作机制,详细说明了项目属性配置、库文件链接顺序及系统环境变量设置,并提供了完整的测试代码和针对“无法解析的外部符号”等常见链接错误的排查方案,旨在帮助开发者快速构建稳固的高性能科学计算环境。

night的博客 529

科学计算库BLAS LAPACK ATLAS OpenBLAS MKL EIGEN等之间的关系

1.BLAS(Basic Linear Algebra Subprograms)与LAPACK (Linear Algebra PACKage) Blas是Netlib基于Fortran实现的基本向量乘法,矩阵乘法的一种科学计算函数库。 Fortran语言是为了满足数值计算的需求而发展出来的。1953年12月,IBM公司工程师约翰·巴科斯(J. Backus)因深深体会编写程序很困难,而写了一份备...

bitcarmanlee的博客 3523

OneAPI环境下VS2022 Fortran调用MKL LAPACK 64位库的完整指南

本文提供在OneAPI环境下,使用Visual Studio 2022配置Fortran项目以调用Intel MKL 64位LAPACK库的完整教程。详细介绍了从环境准备、项目创建、编译器与链接器配置,到系统环境变量设置及实战测试的全过程,帮助开发者高效搭建高性能科学计算开发环境。

weixin_28365523的博客 183

Linux系统下oneAPI环境配置与MKL库编译实战指南

本文详细介绍了在Linux系统下配置oneAPI环境并使用MKL库进行高性能计算的实战指南。通过安装Intel的oneAPI工具包,开发者可以充分利用MKL(Math Kernel Library)的优化数学函数,显著提升矩阵运算等数学计算的性能。文章提供了从环境准备、安装配置到实际编译示例的完整流程,帮助开发者在Intel处理器上实现最佳性能。

weixin_34007020的博客 389

Intel OneAPI时代:如何在VS2022中高效使用Fortran调用MKL的LAPACK 64位库

本文详细介绍了在Intel OneAPI时代,如何在Visual Studio 2022中高效配置Fortran项目以调用MKL的64位LAPACK库。通过对比传统配置与OneAPI集成方式的差异,文章提供了从环境搭建、项目属性设置到实战编码(包括传统Fortran 77接口与现代LAPACK 95接口)的完整指南,帮助开发者简化流程、提升性能并规避常见错误。

sam99的博客 199

Intel oneAPI MKL 库链接实战:C/Fortran 程序编译提速 2 倍与 3 个常见链接错误

本文详细介绍了Intel oneAPI MKL库在科学计算中的优化应用,包括编译加速、性能调优及常见链接错误解决方案。通过实际案例展示,使用MKL库可使C/Fortran程序性能提升2-5倍,特别适合矩阵运算和线性代数密集型任务。文章还提供了环境配置、编译器选择策略和高级优化技巧,帮助开发者充分利用Intel处理器的计算潜力。

weixin_33735077的博客 298

【小记】BLAS、OpenBLAS、ATLAS、MKL

BLAS BLAS的全称是Basic Linear Algebra Subprograms,中文可以叫做基础线性代数子程序。它定义了一组应用程序接口(API)标准,是一系列初级操作的规范,如向量之间的乘法、矩阵之间的乘法等。许多数值计算软件库都实现了这一核心。 BALS是用Fortran语言开发的,Netlib实现了BLAS的这些API接口,得到的库也叫做BLAS。Netlib只是一般性地实现了基...

学习 & 分享 ~ 7435

WIN下Intel MKL库 2018(32位)

WIN下英特尔数学核心函数库 2018(32位),带有.h与.lib文件,可方便程序调用

手把手教你用Simulink搭建BPSK调制解调系统(附完整参数设置与波形分析)

本文详细指导如何使用Simulink搭建BPSK调制解调系统,涵盖从理论到实践的全流程,包括参数设置、模块连接和波形分析。重点解析调制解调中的关键参数和常见问题,如带通滤波器设计、载波同步等,帮助读者快速掌握BPSK系统的实现与调试技巧。

weixin_27741699的博客 422

BLAS、OpenBLAS、ATLAS、MKL

BLAS BLAS的全称是Basic Linear Algebra Subprograms,中文可以叫做基础线性代数子程序。它定义了一组应用程序接口(API)标准,是一系列初级操作的规范,如向量之间的乘法、矩阵之间的乘法等。许多数值计算软件库都实现了这一核心。 BALS是用Fortran语言开发的,Netlib实现了BLAS的这些API接口,得到的库也叫做BLAS。Netlib只是一般性地实现了基本功能,并没有对运算做过多的优化。 LAPACK LAPACK (linear algebra pack

顺其自然~专栏 9392

ESP32-C3微型9轴感知模块的硬件工程实践

在嵌入式系统小型化趋势下,低功耗微控制器与多传感器融合成为智能终端的基础技术路径。其核心原理在于芯片能效比、射频合规性与电源噪声抑制的协同优化,技术价值体现在降低认证门槛、提升EMC鲁棒性及保障MEMS传感器精度。典型应用场景包括可穿戴设备、微型无人机姿态控制和工业边缘传感节点。本文围绕ESP32-C3平台展开,深入解析QFN封装选型逻辑、同步降压电源设计、LSM9DS1九轴校准策略等关键环节,覆盖FCC/CE认证规避、USB-C接口EMC防护等高频工程痛点。

weixin_42607969的博客 366

MKL相关知识(kaldi安装MKL可以用ATLAS代替)

BLAS BLAS的全称是Basic Linear Algebra Subprograms,中文可以叫做基础线性代数子程序。它定义了一组应用程序接口(API)标准,是一系列初级操作的规范,如向量之间的乘法、矩阵之间的乘法等。许多数值计算软件库都实现了这一核心。 BALS是用Fortran语言开发的,Netlib实现了BLAS的这些API接口,得到的库也叫做BLAS。Netlib只是一般性地实现...

qq_39816087的博客 2392

高通Camera PDAF调试实战:从Type2到Type3的避坑指南与Log分析技巧

本文深入解析高通Camera平台PDAF调试实战,重点对比Type2与Type3的核心差异,提供详细的配置迁移方案和Log分析技巧。针对常见兼容性问题如对焦速度变慢、低光失效等,给出具体解决方案,并分享性能优化案例与高级调试工具链,帮助开发者快速提升PDAF调试效率。

weixin_29164185的博客 409

【漆学军】MT4进阶到MT5速成之路(2)获取持仓

MT5在持仓获取上,要比MT4复杂些,分两部分,获取持仓和挂单采用了不同的方法。 一、获取持仓中的buy和sell单 int b=0;//获取buy单个数 int s=0;//获取sell单个数 double lot_total_buy=0;//获取持仓中buy单的总手数 double lot_total_sell=0;//获取持仓中sell单的总手数 for(int i=0; i<PositionsTotal(); i++) { ulong ticket=Positi

漆学军的编程笔记 1623

blas、lapack和atlas、openblas的区别联系

1、Fortran语言 Fortran语言是为了满足数值计算的需求而发展出来的一种编程语言。 Fortran语言的最大特性是接近数学公式的自然描述,在计算机里具有很高的执行效率。它可以直接对矩阵和复数进行运算,自诞生以来广泛地应用于数值计算领域,积累了大量高效而可靠的源程序。 许多科学计算库的底层实现都是采用的Fortran语言,下面介绍的BLAS和LAPACK也不例外。 2、BL

u013677156的专栏 2万+

pgsql:还原数据库后出现重复序列导致“more than one owned sequence found“报错问题的解决

pgsql数据库通过备份数据库文件进行还原时,如果表中有自增序列,还原后可能会出现重复的序列,此时若向表中插入新行时会出现“more than one owned sequence found”的报错提示。还原数据库时把序列取消勾选,选择不还原序列。因为还原表的同时,会自动将自增序列还原上去,此处勾选会导致数据库重复创建序列。点击还原数据库完毕后,可以看到序列仅有一个,没有出现重复序列。但此时的序列当前值是从1开始的,需要重置。点击菜单“其它”-》“序列”,可以看到有多个重复序列。

奋斗鱼 1042

LAPACK windows visual studio 开发安装

下载后打开CMAKE,进行编译。注意需要指定fortran 编译器。选择前面安装的Fortran编译器的位置。运行测试可能会失败,那是由于其他原因。安装成功后可以采用程序进行验证是否成功。生成工程后,打开visual studio 2019进行编译安装。下载后,按照提示安装。

qq_16171053的博客 1111

Infiniband互连网络概述

一、Infiniband是什么? InfiniBand(简称IB)是一种工业标准规范,它定义了一种输入/输出架构,用于计算节点、通信基础设施设备、存储和嵌入式系统的互连。操作系统可以是Linux、Windows或ESXI。 IB网络一共是五层,从第一天起,IB就被设计为提供一个端到端的解决方案,改善和加速从物理层到上层的所有协议层。 IB协议于2000年由IBTA(InfiniBand Trade Association)提出,其规定了一...

weixin_41687819的博客 5226

SNN目标识别MNIST

总体来说这篇论文提出的方法用了多种更精密的细节,如LIF膜电位公式,三种STDP方法,但我觉得还可以有很大的改进,比如输入层全连接到兴奋层,兴奋层通过抑制层实现的侧向抑制,抑制层不参与学习等等。尤其是兴奋层通过抑制层实现侧向抑制这里,当神经元兴奋时,通过抑制层再倒回兴奋层,所抑制的已经经过一了一段时间的延迟。如有错误,请不吝赐教。

m0_74982304的博客 1262

如何利用nalgebra与LAPACK集成打造高性能数值计算解决方案

nalgebra是Rust语言中一款强大的线性代数库,而LAPACK作为高性能数值计算的行业标准,两者的集成能够为科学计算、工程仿真等领域提供高效可靠的解决方案。本文将详细介绍如何在Rust项目中配置和使用nalgebra-lapack扩展,充分发挥LAPACK的计算能力。 ## 🚀 快速了解nalgebra-lapack扩展 nalgebra-lapack是nalgebra的官方扩展 cr

gitblog_00872的博客 848

飞牛fnNAS虚拟机开启OVS导致失联的解决

摘要:用户在使用飞牛NAS时发现开启OVS网络功能后导致NAS失联。通过多种尝试(包括开关OVS、更换系统版本、手工配置、更换网卡、处理器检查等)后发现,OVS启用状态下DHCP无法获取IP地址,手动设置IP可暂时恢复网络。但重启后问题依旧,初步判断为OVS功能存在bug。目前临时解决方案是在需要时手动开关OVS,或考虑其他虚拟化方案。用户计划后续探索替代方案,并等待官方修复该问题。

dgnankai的专栏 4331

如何利用BLAS/LAPACK提升Eigen性能:完整优化指南

Eigen是一个高效的C++线性代数库,通过与BLAS/LAPACK等底层数学库集成,可以显著提升矩阵运算性能。本文将详细介绍Eigen与BLAS/LAPACK的集成方法,帮助开发者快速实现性能优化。 ## 为什么需要BLAS/LAPACK集成? Eigen内置了高效的矩阵运算实现,但对于大规模计算或复杂线性代数操作,集成经过高度优化的BLAS(Basic Linear Algebra Sub

gitblog_00810的博客 1057

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

windows c语言 lapack安装,Windows Scipy安装:找不到Lapack/Blas资源

在Windows764位上安装SciPy时,缺少BLAS/LAPACK库的解决方案如下所述:安装Anaconda要容易得多,但如果不付费,您仍然无法获得英特尔MKL或GPU支持(它们在MKL优化中,并加速Anaconda的附加组件-我不确定它们是否也使用PLASMA和MAGMA)。通过MKL优化,numpy在大型矩阵计算方面的性能比IDL提高了10倍。MATLAB在内部使用Intel MKL库,并...

weixin_39667080的博客 473

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

上一篇: CPU : 二级缓存容量
下一篇: 简单建立个人WEB网站
crazyhacking
博客等级 码龄15年 299粉丝 148原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值