矢量矩阵乘法与特征

时间:2016-09-27 11:27:20

标签: matrix vector eigen linear

我想使用库Eigen进行线性代数计算。特别是,我想将随机向量乘以随机矩阵。这是我正在使用的代码:

#include <iostream>
#include <chrono>
#include <Eigen/Dense>

using namespace Eigen;

int main(){

    Eigen::initParallel();
    Matrix<unsigned int,Dynamic,Dynamic> A; A = Matrix<unsigned int,500,15500>::Random();
    Matrix<unsigned int,Dynamic, Dynamic> s; s= Matrix<unsigned int,1,500>::Random();
    Matrix<unsigned int,Dynamic,Dynamic> b;

    auto t1 = std::chrono::high_resolution_clock::now();

    b=s*A;

    auto t2 = std::chrono::high_resolution_clock::now();
    auto timeMult = std::chrono::duration_cast <std::chrono::microseconds>(t2 - t1).count();
    std::cout << "Result size: " << b.rows() << "x" << b.cols() << std::endl;
    std::cout << "Time for multiplication: " << timeMult << " microseconds" << std::endl;

    return 0;
}

然后,为了编译它,我做

g++ -I. -Wall -std=c++0x -fopenmp main.cpp

我相信一切正常(我没有检查实际结果)但看起来真的很慢。为了给出一个想法,我写了一个C++代码完全相同的事情并明确使用thread s,其运行速度比我粘贴的代码快54倍!特别是在我的机器上,使用我的C++代码,它是286904微秒,而5300微秒。

任何想法为什么它如此缓慢以及如何让它更快?

修改

我没有发布我写的代码,因为它是一个更大的软件,并且制作一个MWE需要大量的工作。相反,我将描述它的作用:我为包裹std::vector s的向量和矩阵定义了类,然后进行乘法我定义了一定数量的thread s,将矩阵拆分成块并使每个thread根据向量中的系数计算行的线性组合。每个thread将其部分结果写入另一个行向量,最后将所有向量相加在一起以获得最终结果。非常简单。顺便说一下,我正在使用4 thread s,即使这个值可能会被优化。

1 个答案:

答案 0 :(得分:2)

除了在编译标志中添加-O2-O3(如评论中所述),您应该将sb的类型更改为{{ 1}}。如果Eigen在编译时知道产品的一个因素是向量,那么它可以使用更快的产品实现。 在我的机器上,将执行时间从25392μs更改为4751μs。

但是,目前你不会受益于矩阵矢量产品的多线程(Eigen 3.3rc1)。