在Windows和debian上配置Armadillo(线性代数库)并使用OpenBlas

老实说别的库就从来没配置成功过,好不容易配置成功了两个,要写点东西纪念一下。


第一节  Armadillo简介

Armadillo是一个C++的线性代数库,虽然它的官网自我介绍说高效,但是高效这个词要看和什么比了。不过,他的一个特点我很喜欢,那就是类似matlab的语法,而且是故意这样设计的,所以matlab的代码我复制到C++中稍加改动就可以用了。

Armadillo库实际上是包装了其他底层的库和C的cmath函数,默认是使用标准的Blas和Lapack这两个库为基础的,在其压缩包中就有预编译的x64位版本的lib和dll文件。如果需要32位版本的看第二节。反正个人来说不建议自己编译Blas和Lapack这两个库,略看过其源码,C的,C++的,fortran的代码在同一个库里都有,尤其在windows上编译得快崩溃了,而且最终还失败了。

Armadillo库还支持使用OpenBlas, Intel MKL,  AMD ACML这些数学库来提高效率,由于出现了Intel和AMD这些字眼,虽然没做过详细了解,不过估计是依赖于他们自己的CPU的特定加速,移植性可能不太好,最终我选择了OpenBlas。


第二节  前期准备(说人话!“下载”)

无论是在哪个平台上配置,都要下载它们的软件包。需要下载的有Armadillo;如果需要加速则下载OpenBlas;如果在不用OpenBlas的情况下需要32位程序,可以下载32位的Blas和Lapack预编译发行版。下面给出链接后再说明下载的一些注意事项:

Armadillo:

http://arma.sourceforge.net/download.html(直接官网就见到很明显的最新版下载了,Windows/Linux通用)


OpenBlas:

Linux:http://www.openblas.net(官网抬头就有.tar.gz和Zip,选一个下载,到linux里自己编译也是很快的。或者用命令直接装)

Windows:https://sourceforge.net/projects/openblas/files/develop/20150903/(别瞎折腾,直接下载预编译版,如果链接失效看下面怎么找这个链接)


32位的Blas和Lapack预编译发行版:

Windowshttp://icl.cs.utk.edu/lapack-for-windows/lapack/(只有Windows需要,Linux都是通过命令安装Blas和Lapack即可)


下面来说一下怎么下载:

先说Armadillo,点进前面说的链接,如图所示,很明显的字眼就是最新版下载,点连接下载就可以了。


再说OpenBlas:

点进去官网,如图所示。其实Windows发行版的链接是可以自己找到的,也如图所示:


Linux的直接下载最新版源代码编译,所以是红色框的图标,下载就行。

Windows上编译很不方便,所以下载预编译版就好了。绿色框里的链接点进去之后是版本选择列表,其中有个develop就是预编译的版本。

develop点进去之后还有一个文件夹,我现在看到的命名是20150903,应该是日期,可能以后看着文章的人看到的就不是了,所以如果以后上面给的链接失效了,那可能是新的预编译版出来了。


最后是32位的Blas和Lapack预编译发行版:

链接点进去之后,首先找到大字标题Prebuilt libraries for Microsoft Visual Studio Projects,然后慢慢往下找,找到一堆链接的地方


别跑错了下面的INTEL Compilers那里去了,除非你用的真的是英特尔的编译器套装。64位的有了,所以只需要下载Win32的就行,记住把dll和lib都下载下来!

第三节 Windows配置Armadillo
先说Windows下的配置,实际上是不用配置,将Armadillo的压缩包解压就可以用了。解压之后有如图的文件和文件夹

根据版本的不同可能会多或少一些文件,不过图中所标的①②③是肯定会有的。
①是例程,是Visual Studio的项目,都建好了的。7.300.1自带的是VS2013的sln文件,如果你的VS版本比这个低就可能打不开,不过不着急,很快来说一下怎么自建项目。
②是需要包含的头文件,根头文件就是Armadillo,没有后缀名的那个。顺便说一下src目录里就一个文件,那个源文件是在Linux下用的,Windows里怎么看都没有引用它的地方。所以说所有功能的实现都在头文件里,通过模板去实现。
③docs.html是文档,避免给浏览器做广告,白了它。文档是脱机的,全部都在这了。

example目录中包括如下的文件:


下面说一下怎么自己配置项目,实际上就是四步:
1. 在项目属性里,C++目录中,在包含目录中 添加include的路径。
2. 在库目录中添加example\lib_win64\的完整路径
3. 在链接器的输入中,添加blas_win64_MT.lib和lapack_win64_MT.lib
4. 将blas_win64_MT.dll和lapack_win64_MT.dll复制到exe的生成目录中

1和2.

3.


这样就配置完了,注意平台必须是x64,因为默认的dll和lib是x64的。建项目的时候选择Win32 控制台项目,把example1.cpp添加进来,就能编译成功了。如果链接不成功,提示找不到gdi32.lib的问题,那是因为VS兼容版本之间的转换没有做好,在解决方案管理器里对着项目右键单击【重定SDK版本目标】即可,如图:


编译链接都成功之后可能还有一点问题,如图所示

后面的路径可能会变,这个实际上就是配置的第4步,将dll复制到exe的生成目录,本来是可以通过VS的【生成事件】机制自动去完成的,不过不知道为什么不行,所以把【生成事件】的命令去掉就好了,如图


这样再生成项目就不会有问题了。如果运行时闪退,就在main函数的return前加上system("pause");。最后运行结果如图(部分):


第四节 Linux配置Armadillo
本人使用的是Debian,首先安装依赖库Blas和Lapack,直接用命令装即可:

sudo apt-get install liblapack-dev libblas-dev(或libopenblas-dev)

可能在不同的linux发行版上包的名称不同,如果有aptitude工具的,可以运行如下命令去寻找这两个库在当前发行版上适用的包名称:

aptitude search blas
aptitude search lapack

以blas为例,我的输出如下(部分):

找到开发组件(development file)就装上即可。

顺便说一下,如果要自己编译OpenBlas,可能会遇到找不到文件strmm_kernel_LN.o,这种情况下可以用make BINARY=32命令取代make来编译,一般是在32位的linux上会出这个问问题(参考:https://github.com/xianyi/OpenBLAS/issues/719


然后就是编译安装,这事基本上在各个Linux上面都没什么差别,况且这个编译不复杂。解压出来,终端切换到解压目录,然后就是标准的三个操作:
1) cmake . (或./configure)
2) make
3) sudo make install

1)
camke .(或./configure)的前面一部分如图所示:

输出的信息告诉我们找到了OpenBlas,Blas,Lapack三个库,并且还给出了一个警告:“如果同时存在OpenBlas和Blas,那么Blas不会被使用”,所以OpenBlas和Blas只安装一个即可,我一开始没考虑过使用OpenBlas,就按说明装了Blas,后来考虑到速度又把OpenBlas装上了(据测试说1000*1000矩阵求逆,Blas是8000ms+,OpenBlas是230ms。我自己测试2000*2000矩阵求逆,前者24s,后者15s)。

2)
make成功如图,本来就只有一个cpp,所以make一瞬间就搞定



终端切换目录到examples下,用命令g++ example1.cpp -o example1 -O2 -larmadillo编译,生成应用程序,然后在终端中输入./example1运行程序,正确输出如下:



或者像我,用集成环境CodeBlocks的话,可以建立一个控制台项目,将example1.cpp加进去,然后进行配置。每个IDE的配置不同,但是都必须在链接器符号里加入符号-larmadillo,与Windows不一样的是不需要导入lib之类的操作,由符号-larmadillo指示链接器去做了。

第五节  在Windows上使用OpenBlas

在Linux上使用OpenBlas只是在cmake .之前装上OpenBlas即可,如果想自己编译最新版也是一样的三个步骤。现在说一下在Windows上怎么搞。先去上面给的链接下载发行版,进去之后有如下的文件,一般这两个都下载下来,但是我只说x64怎么配置,做法是一样的。


解压出来之后,只有三个文件夹,分别是bin,include, lib。将include的路径在VS中加入项目的C++包含目录,lib加入库目录。


然后在链接器输入中,用libopenblas.dll.a代替默认的blas_win64_MT.lib


这样就可以了。如果想用回Blas,如果之前的包含目录和库目录没有删掉,就直接用回blas_win64_MT.lib即可。

不过在Windows上可能会遇到这些问题:



第六节 使用32位的Blas和Lapack

在上述链接中,下载四个文件,分别是libblas.dll,liblapack.dll,libblas.lib,liblapack.lib。在链接器输入里用libblas.lib,liblapack.lib取代默认的blas_win64_MT.lib和lapack_win64_MT.lib;相应地,运行时改为将libblas.dll,liblapack.dll放到exe运行目录即可。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值