Matrix 特征向量矩阵乘法

Matrix 特征向量矩阵乘法,matrix,vector,eigen,Matrix,Vector,Eigen,我想使用库Eigen进行线性代数计算。特别是,我想用一个随机矩阵乘以一个随机向量。以下是我正在使用的代码: #include <iostream> #include <chrono> #include <Eigen/Dense> using namespace Eigen; int main(){ Eigen::initParallel(); Matrix<unsigned int,Dynamic,Dynamic> A; A

我想使用库
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;
}
我相信一切都很好(我没有检查实际结果),但它似乎真的很慢。为了给大家一个想法,我写了一个
C++
代码,它做了完全相同的事情,并显式地使用
thread
s,它的运行速度大约是我上面粘贴的代码的54倍!特别是,在我的机器上,它是286904微秒,而在我的
C++
code中是5300微秒

为什么它这么慢?如何使它更快


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

除了将
-O2
-O3
添加到编译标志(如注释中所指出的),您应该将
s
b
的类型更改为
矩阵
。如果Eigen在编译时知道产品的一个因素是向量,那么它可以使用更快的产品实现。 在我的机器上,将执行时间从25392µs更改为4751µs


但是,目前矩阵向量积的多线程处理(Eigen 3.3rc1)对您没有好处。

-O2
-O3
添加到编译命令中。@AviGinsburg谢谢!我很尴尬我忘了这件事。。。无论如何,使用
-O2
-O3
甚至
-Ofast
时,时间不会低于21500微秒,仍然比我的代码慢4倍!是否要发布与之比较的代码?您也可以添加
-march=native
以提高性能(sse/avx),但生成的可执行文件将需要CPU上提供这些扩展。还有,什么版本的gcc,在什么平台上?@AviGinsburg有关代码,请参阅原始帖子中的编辑。至于编译器,我正在Ubuntu 12.04上使用
g++4.6.3
,这是个好主意!我确认执行时间现在大约是5300微秒,正好是C++代码。用EGIN 3.3,不要忘记<代码> -Maxe=原生< /代码>以获得AVX加速。
g++ -I. -Wall -std=c++0x -fopenmp main.cpp