| [eigen] slow adjoint sparse dense product |
[ Thread Index | Date Index | More lists.tuxfamily.org/eigen Archives ]
Hi,
I am working on iterative solvers for large sparse matrices and I am
thinking about switching from uBLAS to Eigen. But the one thing that
keeps me from changing the library is that the product of the adjoint of
a sparse matrix with a vector is about half the speed of multiplying
directly with the non-adjoint matrix. I attached a small simple test
file that measures the time for an example matrix.
I figured out that for the product y=Ax in class SparseTimeDenseProduct
the case "if(Rhs::ColsAtCompileTime==1)" is chosen and the computation
is quite fast.
But for y=A^{H}x there is no optimized case that can be chosen. Is there
a way to speed up the multiplication with an adjoint sparse matrix?
Sebastian
#include <Eigen/Core>
#include <Eigen/Sparse>
#include <iostream>
#include <complex>
#include <boost/timer.hpp>
using namespace std;
int main()
{
const int size = 100000;
const int nnzpc = 100;
const int iter = 1000;
boost::timer time;
Eigen::VectorXcd x(size),y(size);
Eigen::SparseMatrix<complex<double>,Eigen::ColMajor> A(size,size);
A.reserve(size*nnzpc);
for (int n = 0; n < size; ++n)
for (int m = 0; m < nnzpc; ++m)
A.insert((m*nnzpc+n)%size,n) = complex<double>(m,n);
A.finalize();
time.restart();
for (int i = 0; i < iter; ++i)
y = A*x;
cout << "time y=Ax: " << time.elapsed() << endl;
time.restart();
for (int i = 0; i < iter; ++i)
y = A.adjoint()*x;
cout << "time y=A^{H}x: " << time.elapsed() << endl;
}
// time y=Ax: 46.46
// time y=A^{H}x: 85.69
Attachment:
signature.asc
Description: OpenPGP digital signature
| Mail converted by MHonArc 2.6.19+ | http://listengine.tuxfamily.org/ |