Skip to content

再说virtualbox虚拟机下的文件共享,还有字体

再说virtualbox虚拟机下的文件共享,还有字体 published on No Comments on 再说virtualbox虚拟机下的文件共享,还有字体

之前的一篇帖子讲到之前是怎么操作virtualbox共享的,需要每次运行一个脚本挂载一下,其实用它自动挂载的也可以,不过要设置一下权限

sudo adduser xxxxxxx vboxsf

如果是centos
sudo usermod -a -G vboxsf
然后会自动挂到/media/sf_******下面,如果需要放在home文件夹里面,ln -s一下就可以了,之前vmware也是这样做的。
额,也没说的可说的了,差不多就是这样了。vmware下不知道怎么就是共享不了了,原来还好好的,算了,还是用vb吧。

还有,之前一直用的consola字体在gvim下不知道怎么就是设置不好,还是支持免费的fonts-consolata吧,安装也方便,就是字体看起来比consola稍微硬一些,还是蛮漂亮的。关于其它一些编程字体可以参考:
http://hivelogic.com/articles/top-10-programming-fonts/

C++线性代数库

C++线性代数库 published on No Comments on C++线性代数库

前段时间接手这个项目以后,一直琢磨着把ws的程序用编译语言重写,这样可以抛弃matlab这种庞然大物。一直以来考虑的是python,方便快捷,作图功能几乎完美。但考虑到BEM方法里面大量的循环嵌套,为了应付以后可能出现的大规模计算量,还是想用一种编译型语言。以前写程序用fortran而放弃了自己熟悉的C,是看中了fortran的向量矩阵处理的方式,比如矩阵相加可以直接A+B,矩阵相乘可以matmul(A,B),子矩阵可以像matlab一样A(1:n,2:m)使用。这些操作在C里面想想就烦,更别说什么动态二维数组定义、内存分配……即使用imkl或lapack库来解线性方程组,也要面对一堆莫名其妙的函数名和莫名其妙的参数。至于C++,一直觉得类和模板就是低效的代名词,直到我接触到了各种各样的数学库。曾经有位大牛说过C++最有价值的就是各种库,现在感觉至少对于我们做数值计算的人来说,这些库太重要了。它们的存在可以让你的C++程序变得像matlab一样优雅。至于速度,也是我这篇文章要讨论的一点,不过我不会拿它和fortran比了,因为我不可能用fortran再重写一遍,虽然我真的想知道这些C++数学库在实际应用中,比纯fortran写的会不会慢,然后是慢多少呢?

开始正题。首先是数学库的选择,要追根溯源,很多库都是在BLAS和LAPACK上提供一个外包,因为BLAS和LAPACK,包括IMKL什么的库,其设计唯一的考虑就是速度,易用性根本就不予考虑。所以大多数人(包括我)看到这些库的时候,都是脑袋一片空白,找函数找不到,找到了也不知道该怎么用。对于我来说,易用性是放在第一位的,然后才是速度,只要差距不大都能接受。大概07-08年期间,网上出现了些五花八门的数学库,这些库大量应用了模板技术,让我们在C++中也可以享受到用A*B来进行矩阵相乘、用solve(A,b)来解线性方程组这样方便的操作。随便举例就可以找出一堆,比如boost::uBLAS,Eigen, Armadillo, Flens, IT++, GSL, MTL等等的,对于我这种有选择困难症的人,首先当然就是在网上大量找资料了。毕竟是比较小众的应用,找了很多中英文网页,有些资料还是过时的,才有个大概的概念。boost通用性不用说,但据说效率并不太高。Eigen和Armadillo差不多,功能都比较全,用起来也都很方便,这篇文章主要说这两个库。至于其它的,没精力试了,反正各种库用起来差别并不算大。

我的要求:
1. 语法优雅,写出来的程序漂亮。这个和效率同等重要。
2. 有稀疏矩阵功能。虽然现在做BEM用不上稀疏矩阵,但难保以后不会涉及到有限元的程序。我可不想把库改来改去。

关于Armadillo和Eigen这两个库,Armadillo是基于blas和lapack库的,因此各种依赖和设置,安装起来会麻烦些,光研究怎么安装和编译就搞的我快哭了。Eigen完全自己开发的,安装非常容易。但反过来说,因为Armadillo主要是一个封装,所以程序运行的性能主要取决于blas和lapack这样一些库。比如可以用openblas这种库来代替,效率可以有很大的提升。而Eigen因为是完全自己开发,所以所有东西都要从底层写,对并行计算什么的好像支持的也不是太好(当然我现在也用不上)。文档方面,Eigen完爆Armadillo几条街,但,作为评价一个库的重要指标,在数值计算矩阵操作方面好像并不是那么重要。很多功能想当然的写出来的就是对的,对于我来说,对Armadillo的文档的评价是:刚刚够用。

然后就是最重要的效率方面,网上有一些benchmark,但很多都是评价1000阶矩阵相加相乘这些一些基本操作,这对我的程序没什么意义,连解线性方程组这种操作都没怎么评价。因为Eigen安装方便,文档漂亮,所以自然是首选。整个安装和编程过程几乎没有什么阻碍,顺利把matlab程序改成了c++,用我的Thankpad x201i本本,跑了一下1000个网格,Matlab:21.1秒,C++/Eigen:19.3秒……我靠这能忍?跑BEM这种循环套循环套循环的程序,C++你的优势呢?分析了一下,最大的瓶颈是解1000阶满阵非对称的线性方程组。这个matlab有天生的优势。不过还是赞一下matlab近年来的改进,做循环效率好像提升了很多啊。不过从另一方面来看这些库对效率的影响也还是不小的。

(下面这段说的很乱,主要是我自己参考用,可以无视之)
好了,说再多也没用,这种效率我还不如用matlab了。结果在逛Armadillo的网站的时候发现有一个开源的边界元程序BEM++(http://www.bempp.org/)也是用的这个库,早看到这个我就不去试Eigen了……算了换库吧。改程序基本没花时间,语法都太像了。可是安装和编译真把我玩死了。因为Armadillo要依赖很多库,但有很多都是选装的,其实对于我来说只要blas和lapack就够用了,但这两个库其它在openblas里面都包含了。我本来想分开做一下测试,结果又是自己编译,又是安装源里面的东西,又是安装乱七八糟的库,硬是把系统给完坏了(其实是自己水平太低了),怎么编译都不通过。结果又上网查资料,又换电脑重试,总算是有点眉目了。主要在于alternative这个东西,具体这是个什么可以上网搜搜,通过
ls -l /etc/alternatives/*.so.3gf
发现有些库的指向不是我想要的,好像blas和atlas这个库还有些冲突还是什么的,果断把atlas库删开净,把自己编译的所有库删干净,然后重要安装源里面的armadillo,blas和lapack,问题解决。

后来想想觉得不甘心,只能安装源里面的程序,新功能根本没办法用了。于是把armadillo卸了自己编译,果然不行。。。。。好郁闷啊。研究了好长时间发现是在config.hpp里面的设置,有一行关于WRAPPER的要把它注释掉。大概意思就是,对于有些blas和lapack库,armadillo把函数进行一些封装,而一般的库是不需要这个WRAPPER的。Bingo,搞定。其实这段话说的也很乱,不过因为几次安装都在这上面纠结了太长时间,所以还是写上做参考。

其实事情到这里基本已经可以完结了,armadillo+blas+lapack已经可以工作的很好了。不过人总是不死心的,看到armadillo的网站上推荐用openblas来代替blas+lapack,说是一个支持并行的库什么的,先试试吧。从源里面安装,发现运行时间基本没变化。然后自己下载来编译,觉得提升不少。不多说了,直接上数据。

matlab 21.1s
eigen  19.3s
arma(apt)+blas(apt)+lapacka(apt) 16.86
arma(apt)+openblas(apt)  16.75
arma(apt)+openblas(source) 10.26
arma(source)+openblas(source) 10.26

其实说实话我还是不太满意,在这么多循环的的情况下(虽然瓶颈还是解线性方程组),c++只比matlab快一倍,这是比较不能接受的。但想到每次要打开matlab那个庞然大物心里就发怵,还要找老板帮忙买licence,而且我的测试也确实不严谨,算了就这样吧,至少我目前用起来是完全够了的。

C++线性代数库 publish