- 积分
- 22
- 注册时间
- 2009-4-15
- 仿真币
-
- 最后登录
- 1970-1-1
|
楼主 |
发表于 2010-5-21 17:50:25
|
显示全部楼层
来自 上海
六、ublas——统一数据格式?
易经语:易穷则变,变则通,通则久。我们的老祖宗非常重视变通之理,认为只有变通才能长久。当别的开源软件开发者都各行其路时,唯有变通才能立于不败之地。
前面说过选择矩阵求解器时,不仅要注意它的当前性能,还要考虑其存贮格式和调用方式的通用性,这其实是一种变通的思想。对于数学软件包的开发者来说,重视这一问题有助于所开发软件的长期健康发展,而对于使用者来说重视这一问题可以少走弯路,获得源源不断的技术支撑。实际上,这已经不是简单地只关心软件包的现状了,还要重视其未来的发展趋势,目前网上的讨论较少涉及到这一方面。
一个软件包的未来发展如何,是兴盛还是衰落,大多数人是不会关心的。但对于那些希望站在一个较高平台上进行软件开发的人来说,则不能不重视。
如果所选用的软件包一直傲视群伦,技术上保持领先优势,那应该庆幸当初的眼力不错。这使得我们可以只关心自己的软件功能,别的什么都不用操心,开源软件包就这么一直用下去,可谓省心省力。
但软件行业风云变幻,谁也料不定将来会怎么样,万一哪天江湖座次重新排过——这很可能就是一年半载的事,原来所用的软件包落伍了,更好的开源软件包出现,此时当然想更换一下软件包。这时得有思想准备,必须重新编写调用新软件包的有关代码,通常这样的修改还能接受,毕竟工作量不算大。但某些情况下,可能连数据结构都要重新设计,这可能导致程序许多模块都要重新编写,这样的情况是开发者最不愿意看到的。
怎么办?我们可能预见不到将来,但是我们能够尽量规避未来的不利情况。这里介绍一下我了解到的又一个开源软件包ublas,它对于上面的问题比较重视,目前正在发展中。
熟悉C++的人都比较了解boost,这里不打算专门介绍它。虽然boost中还有许多的其它数学软件包(如math/special_functions、math/statistical distributions等),但与矩阵计算有关的数学软件包只有ublas。国内可能讨论其它软件包(如lapack等)的人更多,但ublas还是有些特殊的地方值得关注。
1 首先,boost如同它的名字一样带给人强劲有力的印象。人们普遍认为它是继STL之后C++委员会陆续完成的一系列大动作。矩阵类以及相关的数学计算一直受到业界的广泛关注,人们确信Fortran更擅长大量的科学计算工作,而面向对象的C++语言则在体系架构方面具有显著优势,因此做为boost家庭的一员,ublas产生的目的就是要兼顾这两种语言的优点。
2 其次,ublas为使用者提供了最基本的矩阵数值计算(类似于blas的三个水平),这可满足大多数情况下的要求。
3 对于更高的计算要求,ublas可通过boost.numerical.bindings来拓展功能,从而建立起一座通向多个不同数学软件包(目前有amos、atlas、blas、lapack、mumps和umfpack)的桥梁。
4 最后,它似乎目标很大,别的软件包只想树起一面旗帜,而它可能更想一统江湖。我这样说是因为它的矩阵类实现了基于算子重载的数学自然语言语法,而不同属性矩阵的交叉计算则是采用了基于矩阵表达式模板(expression template)的调用方式,这样一来其矩阵的数据存贮方式达到了一定程度的通用性。
先看一个例子。
例1 MTL要通过下面的语句
template <class T, class Shape=rectangle<>, class Storage=dense<>, class Orientation=row_major>
struct matrix {
enum { Shape_id = Shape::id, Shape_M = Shape::M, Shape_N = Shape::N };
//: The generated type
typedef typename IF< EQUAL< Shape_id, RECT>::RET,
typename generate_rect<T,Orientation,Storage,
Shape_M, Shape_N>::RET,
typename IF< EQUAL< Shape_id, DIAG>::RET,
typename generate_diagonal<T,Storage,
Shape_M, Shape_N>::RET,
typename IF< EQUAL< Shape_id, BAND>::RET,
typename generate_banded<T,Orientation,Storage,
Shape_M, Shape_N>::RET,
typename IF< EQUAL< Shape_id, TRI>::RET,
typename generate_triangle<T,Shape,
Orientation,Storage,
Shape_M, Shape_N>::RET,
typename IF< EQUAL< Shape_id, SYMM>::RET,
typename generate_symmetric<T,Shape,
Orientation,Storage,
Shape_M, Shape_N>::RET,
generators_error
>::RET
>::RET
>::RET
>::RET
>::RET type;
};
来声明一个模板化的Matrix结构,我相信任何一个人当看到这样麻烦的矩阵类型时,虽然也会佩服程序设计者将typedef和宏语句用得出神入化,但会感觉到这种数据结构只能用于MTL自己,如果想换其它的软件包,势必有大量的代码需要重写,因此可以预料MTL后面的路不会太好走,除非它的开发队伍像苹果公司那样,能我行我素地闯出一条独具特色的路。
而ublas的作法与MTL完全不同,从下面的2个例子可以看出它打算基于统一的数据格式来实现对其它数学软件包的调用。
例2 调用lapack的方式
ublas::matrix<double, ublas::column_major> a(5,5),b(5,2);
...... // 生成矩阵数据
lapack::gesv(a,ipiv,b); // 调用lapack求解方程
例3 调用UMFPack
ublas::compressed_matrix<double,ublas::column_major,0,ublas::unbounded_array<int>,ublas::unbounded_array<double>> A(5,5,12);
ublas::vector<double> B(5),X(5);
...... // 生成矩阵数据
umf::symbolic_type<double> Symbolic;
umf::numeric_type<double> Numeric;
umf::symbolic (A,Symbolic);
umf::numeric (A,Symbolic,Numeric);
umf::solve (A,X,B,Numeric);
可以看出,不管调用什么软件包,数据格式都是ublas的,在这方面它应该做了大量的研究。ublas今后能走多远,我们拭目以待。 |
评分
-
1
查看全部评分
-
|