【发布时间】:2011-10-17 19:05:42
【问题描述】:
有没有办法提高boost ublas产品的性能?
我有两个矩阵 A,B 我想乘/加/子/...
在 MATLAB 与 C++ 中,对于 2000x2000 矩阵运算,我得到以下时间 [s]
OPERATION | MATLAB | C++ (MSVC10)
A + B | 0.04 | 0.04
A - B | 0.04 | 0.04
AB | 1.0 | 62.66
A'B' | 1.0 | 54.35
为什么这里会有如此巨大的性能损失?
矩阵只是真正的双精度数。 但我也需要正定、对称、矩形乘积。
编辑: 代码很简单
matrix<double> A( 2000 , 2000 );
// Fill Matrix A
matrix<double> B = A;
C = A + B;
D = A - B;
E = prod(A,B);
F = prod(trans(A),trans(B));
编辑 2: 结果是 10 次尝试的平均值。标准差小于 0.005
我预计系数可能是 2-3,但不是 50(!)
编辑 3: 一切都在发布 (NDEBUG/MOVE_SEMANTICS/..) 模式下进行。
编辑 4: 产品结果的预分配矩阵不影响运行时间。
【问题讨论】:
-
一定要重新运行一个干净的 Matlab,它往往会缓存......好吧,一切。完全不相关,但您应该能够从Eigen 获得不错的性能和简单的语法。 (我很感兴趣它与您的小基准有何关系,提示提示 :-)
-
我预计乘法与加法的时间约为 2000 倍..
-
你记得打开uBlas的发布模式吗?请参阅 [link=boost.org/doc/libs/1_47_0/libs/numeric/ublas/doc/… 末尾的常见问题解答,这表明您需要具有“-DNDEBUG”或其他一些标志才能使 ublas 编译发布。
-
你不知道内存管理在这里扮演什么角色。
prod必须分配一个 32mb 的矩阵,trans也是如此,两次,然后你就做了 10 次。拿几个stackhots 看看它真正在做什么。我愚蠢的猜测是,如果您预先分配矩阵,您会得到更好的结果。 -
@Mike -
ublas使用表达式模板,因此预分配不太可能使事情变得更快,除非编码员故意浪费矩阵副本(这里不是这种情况)。
标签: c++ performance boost ublas boost-ublas