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