【发布时间】:2016-11-23 23:47:48
【问题描述】:
我正在比较 Eigen (v3.2.8) 和 GSL (v2.1) 库在各种线性代数运算中的性能。虽然在大多数操作中,Eigen 以很大的优势(少数因素)获胜,但在奇异值分解的计算中它落后了。我使用了 SVD 的两种实现 - JacobiSVD 和 BDCSVD(后者在此版本中仍处于“不支持”模块中),并在多个平台上测试了以下代码:
#include <gsl/gsl_rng.h>
#include <gsl/gsl_linalg.h>
#include <unsupported/Eigen/SVD>
#include <ctime>
#include <iostream>
void testSVD(const int size)
{
clock_t tbegin;
gsl_rng* rng = gsl_rng_alloc(gsl_rng_default);
gsl_rng_set(rng, 42);
Eigen::MatrixXd mat(size, size);
for(int i=0; i<size; i++)
for(int j=0; j<size; j++)
mat(i, j) = gsl_rng_uniform(rng);
gsl_matrix_view matv = gsl_matrix_view_array(mat.data(), size, size);
gsl_matrix* mat1 = &matv.matrix;
gsl_matrix* mat2 = gsl_matrix_alloc(size, size);
gsl_vector* vec1 = gsl_vector_alloc(size);
gsl_vector* vec2 = gsl_vector_alloc(size);
tbegin = std::clock();
Eigen::JacobiSVD<Eigen::MatrixXd> jac(mat, Eigen::ComputeThinU | Eigen::ComputeThinV);
double tjac = (std::clock() - tbegin)*1.0/CLOCKS_PER_SEC;
tbegin = std::clock();
Eigen::BDCSVD<Eigen::MatrixXd> bdc(mat, Eigen::ComputeThinU | Eigen::ComputeThinV);
double tbdc = (std::clock() - tbegin)*1.0/CLOCKS_PER_SEC;
tbegin = std::clock();
gsl_linalg_SV_decomp(mat1, mat2, vec1, vec2);
double tgsl = (std::clock() - tbegin)*1.0/CLOCKS_PER_SEC;
std::cout << "Matrix size: "<<size<<", GSL SVD: "<<tgsl<<" s, JacobiSVD: "<<tjac<<" s, BDCSVD: "<<tbdc<<" s\n";
gsl_vector_free(vec2);
gsl_vector_free(vec1);
gsl_matrix_free(mat2);
}
机器 1(旧,gcc 4.2.1,编译器选项 -O3):
矩阵大小:125,GSL SVD:0.054497 s,JacobiSVD:0.143428 s,BDCSVD:0.177061 s 矩阵大小:250,GSL SVD:0.457591 s,JacobiSVD:1.16189 s,BDCSVD:1.291 s 矩阵大小:500,GSL SVD:6.01799 s,JacobiSVD:15.2217 s,BDCSVD:12.1353 s 矩阵大小:1000,GSL SVD:67.3727 s,JacobiSVD:155.501 s,BDCSVD:114.372 s机器 2(gcc 4.8.3,-O3):
矩阵大小:125,GSL SVD:0.008666 s,JacobiSVD:0.029863 s,BDCSVD:0.026779 s 矩阵大小:250,GSL SVD:0.082332 s,JacobiSVD:0.318304 s,BDCSVD:0.235657 s 矩阵大小:500,GSL SVD:0.807378 s,JacobiSVD:2.93758 s,BDCSVD:1.98003 s 矩阵大小:1000,GSL SVD:23.1846 s,JacobiSVD:59.1015 s,BDCSVD:27.8348 s机器 3(icc 13.1.3,-O3):
矩阵大小:125,GSL SVD:0.02 s,JacobiSVD:0.05 s,BDCSVD:0.04 s 矩阵大小:250,GSL SVD:0.15 s,JacobiSVD:0.4 s,BDCSVD:0.28 s 矩阵大小:500,GSL SVD:2.18 s,JacobiSVD:3.51 s,BDCSVD:2.41 s 矩阵大小:1000,GSL SVD:10 s,JacobiSVD:42.87 s,BDCSVD:23.4 s问题是,为什么 Eigen 没有击败 GSL?
【问题讨论】:
-
如果某个答案可以帮助您解决问题,请不要忘记“接受”它。