windows下使用Armadillo+openBLAS

来源:互联网 发布:php倒计时 编辑:程序博客网 时间:2024/06/07 23:14

最近做图像处理相关的工作,涉及到图像数据的协方差矩阵及其逆矩阵的求解,比如在PCA算法以及RXD异常检测算法中都需要求解协方差矩阵;虽然可以自己基于指针的方法求解,但是对于数据较大时,效率很难保证(也许是笔者能力有限吧委屈),但是在求逆矩阵时还是得需要用到其它库(当然大牛也可以自己写),所以就在网上查找了相关第三方开源矩阵库;总体来说,比较推荐的库有Armadillo,Eigen等,其中,Armadillo可以配合其它库进行加速,比如“Armadillo + BLAS + LAPACK”组合或“Armadillo + OpenBLAS”组合,第二种组合推荐的比较多,那么为什么呢?原因是因为OpenBLAS对intel cpu会进行一些优化,所以速度上也就有了一定的提升,另外值得一提的是OpenBLAS是由中国人负责开发的。Eigen也是比较推荐的一个,使用比较方便,只需要在工程中包含相应的头文件即可使用。好了,关于上面提到的两个库,有兴趣的读者可以自行Google或百度了解更多。

先来一张图,关于线性代数库的一些基本关系:



1. Armadillo

首先是下载Armadillo,目前最新版是armadillo-7.400.1.tar.xz,下载好后解压出来,然后将里面的头文件即include文件夹拷贝出来,放到你想放的位置,比如我将拷贝出来的放到“D:\Code\3rdPart\Armadillo-7.400.1”目录下。

2. Armadillo + BLAS + LAPACK

下载BLAS和LAPACK,网上有挺多地址可以下载到,不同地址下载下来的可能会存在效率不同问题,但是应该区别不会太大吧。这里推荐一个下载地址,也是Armadillo例子中自带BLAS和LAPACK的来源,点我下载。(貌似需要翻墙)

这里我以Win-32-Debug版为例介绍,同样将下载下来的文件解压,然后将里面的文件拷贝到你想放置的位置,比如我放置在“D:\Code\3rdPart\LAPACK&BLAS\LAPACK-3.2.1_Debug_x86”目录下,目录下包括blas_win32_MTd.dll,blas_win32_MTd.lib,lapack_win32_MTd.dll,lapack_win32_MTd.lib四个文件。

好了,上面的准备工作已经完成,下面就要在项目中使用该矩阵库,新建一个win32空项目,为了方便,这里用Armadillo里自带的例子,直接将example1.cpp文件拷贝到我们的项目中,然后在工程中打开;然后将Armadillo中的include文件夹包含到工程属性中的C/C++常规中的附加依赖项中,将BLAS和LAPACK的lib文件所在路径添加到链接中的常规附加依赖项中去,再将blas_win32_MTd.lib,lapack_win32_MTd.lib添加到链接中的输入中,配置如下所示:


运行结果(注意将blas_win32_MTd.dll,lapack_win32_MTd.dll拷贝置*.exe所在目录下):


3. Armadillo + OpenBLAS

下载OpenBLAS(注意下载.zip结尾的那个文件,下载另一个.tar.gz结尾的编译出来的结果不正确,不知道为啥,有知道的请告知一下),目前最新版是OpenBLAS-0.2.18,为了编译方便,我将解压后的文件全部拷贝至“D:\OpenBLAS”目录下。

下载MinGW,然后检查gcc版本,如果低于4.7,那么进行升级,否则直接编译即可,命令如下:

gcc -v 查看gcc版本

mingw-get removegcc  卸载gcc

mingw-get updatagcc 更新gcc

minge-get upgradegcc       升级gcc

确保gcc版本不低于4.7之后,在Mysys shell中进入OpenBLAS目录,利用make命令进行编译,这里需要说明一下,如果直接输入make开始编译,则make会自动探测机器的一些基本属性,比如笔者的机器是64位系统,则直接make的结果是默认生成64位的Release版的OpenBLAS;更多的时候是需要Debug版,这时可在make后面跟上选项"DEBUG=1",表示生成的是Debug版,另外选项“BINARY=32”或“BINARY=64”表示生成32位或64位的OpenBLAS,更多的编译选项可参考http://my.oschina.net/xianyi/blog/101897?p={{page}}。

make DEBUG=1 BINARY=32


这里以编译32位的Debug版OpenBLAS为例,在编译好之后,会在OpenBLAS目录下生成libopenblas.a和libopenblas.dll两个文件,接着输入如下命令将生成的结果安装到指定目录中去:

make PREFIX=/c/warmerda/OpenBLAS install

安装完毕后,在C:\warmerda\OpenBLAS目录下会出现include和lib和bin三个目录,include中包含库的头文件,lib目录里是libopenblas.a和libopenblas.dll.a两个文件,其中libopenblas.a是MinGW的lib库文件,bin文件中存放libopenblas.dll文件,libopenblas.dll是Windows的动态库文件,目前我们只有动态库,没有lib文件,因此需要进一步处理,生成windows的lib文件才可以使用。

Mingw实际上提供了一个工具用于完成这个事情,只是在HOWTO Create an ImportLibrary for a DLL using MinGW一文中他们自己都没有说清楚,对于libopenblass.dll,在MinGW下使用下面的命令生成def文件(需要首先切换到libopenblas.dll所在目录):

pexports libopenblas.dll > libopenblas.def 
如果Mingw提示没有pexports命令,我们只需要使用Mingw-get安装一下即可:

mingw-get install pexports
然后使用lib命令(VC中的工具),生成lib文件,如下:

lib /machine:X86 /def:libopenblas.def
其中,X86表示32位,X64表示64位,可根据具体情况修改。这样,我们就生成了libopenblas.lib文件,至此,对于OpenBLAS的编译工作已全部完成,下面就是测试编译的结果是否成功。

测试:

新建一个Win32控制台空项目,然后将example1.cpp拷贝至该工程中,在项目的属性C/C++常规中的附加依赖项添加Aramdillo和OpenBlas的include目录,在链接中的常规的附加依赖项里添加OpenBLAS的lib库的目录,并且把libopenblas.lib加入到链接中的输入的附加依赖项里就可以使用OpenBlas库了。





注意这里,我们只依赖了OpenBLAS的库,并没有使用BLAS和LAPACK的库,这是因为在使用OpenBLAS的时候不需要额外添加那两个库。

然后运行程序(需要将libopenblas.dll拷贝至*.exe所在目录),如下:


在运行的时候可能会报提示缺少libgcc_s_dw2-1.dll,libgfortran-3.dll,libquadmath-0.dll这三个动态库,解决方法就是到MinGW的安装目录的bin文件夹下找到这三个文件,然后拷贝至*.exe所在目录即可。


=======================================================华丽的分割线=================================================================

参考:http://blog.csdn.net/ldd530314297/article/details/41328951



1 0