找回密码
 注册
Simdroid-非首页
查看: 1009|回复: 8

[其他] 一些开源软件介绍(1)

[复制链接]
发表于 2011-5-26 05:23:15 | 显示全部楼层 |阅读模式 来自 英国
本帖最后由 myleader 于 2011-5-27 04:12 编辑

我们的实际工程和研究中要用到很多软件,这些软件要用到很多算法、模式……一大堆的知识。对于我们大多数人而言并不适合重新发明轮子,所以能够尽量利用前人的成果才是最有效率的,当然如果你就是个以发明轮子为己任的人,那又另当别论。
这世上有一种心态较开放,有一种软件叫开源软件,我们可以得到他们的源代码并直接使用,有兴趣的也可以研究研究人家是怎么写的。这里介绍一些楼主知道的开源软件给大家,希望大家能够从中得益。如果坛子里其他兄弟有相关的资料,也请不要吝啬,放出来给大家介绍一下

之前坛子里有人refeihc隆重介绍过lapack
http://home.simwe.com/space.php?uid=397755
我也曾经发帖
http://forum.simwe.com/viewthread.php?tid=963143
lapack的确是开源科学软件中当之无愧的王者,起码目前如此,当然it界就是这样,风水轮流转,可能很快就被后来者取而代之也说不定。

不管怎么说lapack是目前计算机上求解线性代数问题事实上的标准,其他相关软件不是要与lapack保持api一致,就是要以lapack作为后端。这样的软件不少,比如Intel MKL、AMD ACML、lapack++、gotoblas、atlas……

lapack不仅有一本user guide,而且国内还有袁亚湘教授翻译的《矩阵计算》,基本就是基于lapack的。这本书是中科院考博士的参考材料,科学出版社曾经出版过,后来绝版了,我原本以为已经再也找不到了,没想到去年人民邮电出版社又再版了。当然如果你有原版情节可以自己去下载英文版。

这里介绍一些与lapack相关的软件,第一个要介绍的是armadillo
http://arma.sourceforge.net/
在我之前说明lapack编译流程的帖子里,曾经反复提到过,这个软件是一个澳大利亚人开发的,最初是澳大利亚科学院的一个项目的子项目,后来独立发展至今,而且现在开发人员也多起来了。

他是用C++给lapack包装了一下,本身不能生成库文件,基本都是头文件,使用的时候#include一下就好了。当然这个软件脱离lapack也能运行,差别下文会说。

这个软件的最大特点就是仿MATLAB,里面大量的函数命名都和MATLAB一致,甚至连参数也一致,只不过MATLAB允许多个返回值,c++不允许,所以参数的使用会有一些差别。用过lapack的人都知道,这个软件的函数命名规则和参数命名法实在是让人太烦了,lapack++虽然是C++包装,可是命名法居然还沿用了lapack的一套,这让人实在头大,我个人更愿意用友好一点的。

目前该软件最新稳定版是1.2.0,测试版是2.0beta2

从网站下载了软件包以后里面有几个目录:
doc目录是其使用文档,他的文档非常的清楚、详尽而且简单,基本上照着文档就可以开动了;
examples目录是样例代码,其中lib_win32子目录下包含有已经编译好的lapack-3.2.1不过是win32的,win64的编译方法见我之前的帖子;

include目录是主目录,软件的主要内容都在这里了;他的代码写得非常清晰,是学习的好资料。

license里面有许可的说明,该软件是双重许可,GPL和LGPL的,也就是说如果你希望你的代码具备开源传染性,就按照GPL使用,你可以使用lapack的静态库,直接包含到你的程序二进制文件中,如果不想让你自己的软件具备开源传染性,可以选择LGPL,不过你的lapack必须要使用动态库,通常动态库比静态库慢一些。作者选择了GPL v3,这个版本饱受诟病,主要是其中对DRM的条款,不过伴随着时代的进步,连苹果都已经放弃DRM了,就剩索尼还在死撑,armadillo本身是一个数学库,对于硬件身份识别什么的应该是没什么影响的,因为我们不太可能在CD唱机里运行一个线性代数求解器,当然如果有一天,armadillo支持信号处理,并且和信号设备联系起来,那可能就要考虑一下了

src目录里的东西我认为没什么用;

根目录里几个文件似乎可以用来安装,不过我还是喜欢手动的。安装方法很简单,只要把include目录拷贝到硬盘上哪个地方就可以了,如果你想省事就放到编译器默认的include目录,否则每次编译的时候都要指定一下include目录,当然你也可以修改项目设置,使其成为某个项目的专属include。

include目录下的armadillo文件就是主文件,其他头文件都包含在里面了,也就是说你只要在使用的时候
#include "armadillo"
using namespace arma;
就可以用了

armadillo是对lapack的封装,如果你有快速的lapack,比如MKL或者gotoblas,可以使用你有的,只要修改include目录下config.hpp,把
#define ARMA_USE_LAPACK

#define ARMA_USE_BLAS
前面的注释符号去掉就可以了。这样armadillo就会调用你所拥有的高速lapack,以提高计算速度。此时需要在项目设置中指定链接器要链接的文件为你的lapack库文件,gcc用的是.a文件,VC用的是.lib文件

不同的编译器对二进制文件中函数名的命名规则不同,gcc编译器都是小写字母后面加下划线,VC都是大写字母,intel的编译器linux下和gcc一样,windows下和VC一样,其他的编译器我没研究过。这样由于lapack使用的是二进制文件,armadillo读取二进制文件,所以这个lapack是由什么编译器按照何种函数命名方法而来对使用效果影响很大。在1.2.0之前,armadillo的开发者只在linux下开发,使用的也都是gcc,所以仅能识别二进制文件中小写字母加下划线的函数名,作者也从未遇到过不能识别函数名的问题,这也就是我之前无法使用田纳西大学的库文件和armadillo配合使用的原因;1.2.0后,作者已经把大写函数命名的识别添加到软件中,所以gcc、VC、Intel编译出来的库文件基本都没问题了。(什么,VC也能编译Fortran写的lapack?其实是有个clapack,api和lapack一致,可以用VC编译,二进制文件里,函数名都是大写的)

如果你没有高速lapack,armadillo也能工作,不过有一些缺陷:
1)速度慢。基本的blas功能armadillo自带了,不过其速度大致和lapack自带的blas差不多,和MKL、gotoblas比大概有10倍左右的差距,更别提自动多线程支持了
2)有一些函数不能使用。官方是这么宣称的,不过我没有实验过,也不清楚到底哪个函数需要lapack二进制库的支持,哪位同学有兴趣可以去研究一下

在这种情况下,就要注释掉
#define ARMA_USE_LAPACK

#define ARMA_USE_BLAS
当然,原始文件中本来是注释掉的,除非你确定有高速lapack,否则不用修改可以直接拿来用

评分

1

查看全部评分

 楼主| 发表于 2011-5-29 06:29:55 | 显示全部楼层 来自 英国
Simdroid开发平台
本帖最后由 myleader 于 2011-5-29 16:30 编辑

接下来介绍一下it++http://itpp.sourceforge.net

这也是一个以lapack为后端的软件,c++的,和armadillo不同,it++侧重于信号处理,类似于MATLAB的simulink,更主要的是:it++也是仿MATLAB语法的,这样熟悉MATLAB的研究人员可以很快上手。

可是有人会问,为什么要用armadillo、it++呢?MATLAB不是用的挺好的吗?主要原因是速度,MATLAB程序运行时相当于一个解释器,多了着一层调用本来就会慢很多,更要命的是,这个解释器非常庞大,解释起来也很慢,而如果使用lapack和可编译语言来写程序,运行速度就会快很多,更何况MATLAB本来就是lapack的包装,其核心就是lapack,这样用同样基于lapack的软件来改造MATLAB代码自然就方便多了。

目前最新的稳定版是4.2.0,似乎有将近半年没有更新了

it++的安装比armadillo要复杂


it++需要系统里已经安装有lapack/blas,当然推荐高速的,而不是原始的blas。除此之外it++安装时还需要有c++和Fortran编译器,armadillo是不需要编译器的。当然根据官方介绍没有lapack/blas也可以编译安装,不过楼主亲身试验表明不行

http://herve.boeglen.free.fr/itpp_windows/index.htm
提供了在windows下安装it++的方法

首先你要安装vc编译器,如果你用的是express版的编译器,还需要安装windows SDK。另外还需要blas、lapack和fftw的库文件。在源码目录下创建lib目录,把这些库文件放到这个目录里。如果这些库文件是完整的库文件,而非索引库文件,那这样就足够了,如果是索引库文件(就是还要搭配dll的),那就需要把dll文件放在系统能够识别的位置,通常是c:\windows

blas和lapack的库文件可以按照
http://forum.simwe.com/viewthread.php?tid=963143
的方法来得到。这里得到的是索引库文件,所以要把dll放对位置

fftw是快速傅里叶变换的一个开源软件包,非常适合做信号处理,我会另外写文章介绍,写好以后会在这里留下链接

我没进行过详细的实验对比不同的lapack库文件会带来什么影响,不过推测如果你的库文件中函数名是大写的,恐怕无法识别,所以推荐使用gcc/mingw编译出来的库文件

当然如果读者嫌烦也可以直接下载那个法国人做好的,不过我要提醒一下,按照我的帖子来编译你不仅可以获得最新的软件包,最新的软件包不仅包含有计算的功能,而且还具备支持新一代cpu特性——如乱序执行、高级指令集等,而且还具备诸如线程安全之类的软件新特性,而且如果针对你的cpu进行优化编译,效能还可以大幅提高。

修改itpp-4.2.0\itpp\config_msvc.h,把包含
#if defined(HAVE_ACML) || defined(HAVE_MKL)
的一共3行全部更改为
#if defined(HAVE_ACML) || defined(HAVE_MKL) || define(HAVE_FFTW3)

下载
http://herve.boeglen.free.fr/itpp_windows/chap1/fftw3.h
本贴后面也有这个文件
把这个文件放在\itpp-4.2.0\itpp
当然其实放在什么地方都可以,只不过这样比较符合这个软件的习惯风格
按照http://herve.boeglen.free.fr/itpp_windows/index.htm的说法,需要做以下事情:
修改\itpp-4.2.0\itpp\signal\transforms.cpp
在46行添加
#include <itpp\fftw3.h>

我看了一下4.2.0的代码,这个已经包含在内了,不过路径不对,需要把
#include <fftw3.h>
修改为
#include<itpp\fftw3.h>

然后在软件目录下有一个win32目录,进去后能找到两个vc的项目文件,一个是给Intel MKL准备的,另一个是给AMD ACML准备的,根据你的cpu打开合适的项目文件。然后在项目上点右键,选属性,在配置窗口中选C++->预处理,然后再加上HAVE_FFTW3

其他的配置根据需要自行修改,最后编译后在你指定的输出位置会有lib文件输出,这就是it++的库文件

然后修改vc的appwizard配置文件
C:\Program Files\Microsoft Visual Studio 9\VC\VCWizards\AppWiz\Generic\IT++\Scripts\1033\default.js
新增2行
var ITPP_LIB_PATH = "C:\\itpp-4.0.7\\lib";
var ITPP_INC_PATH = "C:\\itpp-4.0.7\\";

当然这些目录都要根据读者自己的机器配置来修正的
然后在创建新项目时,向导中就会有it++了

如果你有Intel的编译器,安装的时候mkl和Fortran编译器都会一并装上,mkl中包含了blas、lapack和fftw的功能,而且还会被vc自动识别,所以就不用设置项目属性,也不用拷贝库文件了。

linux或者msys下的安装比较简单,首先你要有gcc能够识别的blas、lapack和fftw3库文件,并把它们拷贝到gcc默认的lib目录,然后
./configure
mingw32-make
mingw32-make install
就好了
it++的库文件就安装到系统的lib目录里了
如果你是用msys/mingw来编译,那么找到这个库文件,用ar命令解包,再用dllwrap打包成dll,然后用vc的lib命令来生成索引库文件也可以

这样安装默认是要生成文档的,这需要linux或者msys能够识别到doxygen、latex、ghostscrip和dvips,当然你可以在./configure时加--no-doc

如果你想要使用其他的blas、lapck,可以在./configure时加--with-blas="-L放blas的目录 blas库文件名"

默认生成的是动态库,你也可以加-static开关生成静态库,这样以后的依赖性少很多

这个软件是GPLv2许可证,就是说源代码开放有传染性,所以使用的时候要小心,如果你只是想研究研究,或者也想开放源代码,那就使用,如果你想封闭自己的源代码,那就不能使用

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×

评分

1

查看全部评分

回复 不支持

使用道具 举报

发表于 2011-10-5 16:54:25 | 显示全部楼层 来自 黑龙江大庆
没有用过开源软件,谢谢介绍!
回复 不支持

使用道具 举报

发表于 2011-10-28 17:44:07 | 显示全部楼层 来自 江苏南京
了解的挺多的啊
回复 不支持

使用道具 举报

发表于 2011-10-30 15:56:26 | 显示全部楼层 来自 四川大学
楼主高人啊,开源程序我也了解一点,不知楼主对GSL(GNU Scientific Library)有何评价,它的应用又如何。GNU网站上说这个库有些资历了。
回复 不支持

使用道具 举报

 楼主| 发表于 2011-10-30 17:18:30 | 显示全部楼层 来自 英国
对于GSL,我的建议是尽量不要使用。它是严格GPL协议的,不能用于开发私有软件,如果你是纯学术研究倒是没有问题,如果是企业里面工作用还是算了。而且它宣称要实现各种各样丰富的功能,目标非常宏大,不过目前看来实现的不太好,各个不同的功能都有其他的软件包实现得比他好。比如说线性代数的lapack,信号处理的fftw和KissFFT等。而且不知道姓名的某位前辈说:“科学软件包应该把效率摆在第一位,而把易用性摆在后面。”这也成了GSL的指导精神,可事实上GSL的效率并不高,速度上和gotoblas、fftw没法比,而且api非常难懂,用软件工程的观点来看非常糟糕,也就是说效率和易用性做的都不好。

如果你的需求超过lapack,我建议你使用Eigen

如果你有什么需求,可以在这里讨论,我也可以翻翻我的家底,看看有没有能用的,要是找到了,会在这里发帖告知大家如何使用。
回复 不支持

使用道具 举报

发表于 2012-1-27 12:37:17 | 显示全部楼层 来自 江苏扬州
很好的话题
回复 不支持

使用道具 举报

发表于 2012-2-19 23:21:46 | 显示全部楼层 来自 广东广州
恩到时候用用看看
回复 不支持

使用道具 举报

发表于 2012-4-7 21:46:12 | 显示全部楼层 来自 北京
很不错的介绍!
回复 不支持

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|小黑屋|联系我们|仿真互动网 ( 京ICP备15048925号-7 )

GMT+8, 2024-4-19 21:39 , Processed in 0.041501 second(s), 15 queries , Gzip On, MemCache On.

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表