Re: [eigen] Tiny matrix in Eigen2

[ Thread Index | Date Index | More lists.tuxfamily.org/eigen Archives ]


On Thu, Sep 17, 2009 at 2:03 PM, WANG Xuewen <xuewen.wang@xxxxxxxxx> wrote:
> Hi,
>
> We are trying to replace our home made matrix vector library with Eigen2
> which provides an unified interface between tiny matrix and medium size
> matrix and sounds promising on performance. Surprisingly, it is 10%
> slower for tiny matrix (with 2.0.5, not sure about the devel branch
> since same code doesn't compile using it), so I wonder if there is
> something wrong that I've made and anything that can help improving it.
>
> Our tiny matrix whose dimension limits to 7 but the exact dimension is
> not known at compile time. The most costly computation on the matrix is
> to compute the exponential of a real or complex matrix. We use the
> method similar to MatrixExponential in unsupported.
>
> I've used something like
>
> typedef Eigen::Matrix<double, Eigen::Dynamic, Eigen::Dynamic,
>                     Eigen::RowMajor | Eigen::DontAlign,
>                     NMaxTinyMatrixDimension, NMaxTinyMatrixDimension>
>       TinyRMatrix;
>
> typedef Eigen::Matrix<std::complex<double>, Eigen::Dynamic, Eigen::Dynamic,
>                    Eigen::RowMajor | Eigen::DontAlign,
>                    NMaxTinyMatrixDimension, NMaxTinyMatrixDimension>
>       TinyCMatrix;
>
> typedef Eigen::Matrix<double, Eigen::Dynamic, 1,
>                     Eigen::RowMajor | Eigen::DontAlign,
>                     NMaxTinyMatrixDimension, 1>
>       TinyRVector;
>
> typedef Eigen::Matrix<std::complex<double>,
>                     Eigen::Dynamic, 1,
>                     Eigen::RowMajor | Eigen::DontAlign,
>                     NMaxTinyMatrixDimension, 1>
>       TinyCVector;
>
> Where NMaxTinyMatrixDimension is 7.
>
> My questions are:
>
> 1. Is the chosen storage the right choice for my problem? Should I just
> use Eigen::Matrix<double, Eigen::Dynamic, Eigen::Dynamic> etc?
Then your matrix would be stored in column major order. See if that
affects you. If not I'd just go with this declaration.
>
> 2. Even if the storage is in the stack, but the dimension is not known
> at compile time. Will the loop get unrolled for most operations?
AFAIK, if the dimensions are not known at compile time, then it wont
be stored on stack. I am not sure but I think it wont unroll.
Use -funroll-loops with gcc to do it in case eigen doesn't unroll it.
>
> 3. We do something like M = N + scalar * Matrix::Identity(); as seen in
> unsupported. Is this optimal? Does it really matter?
>
> 4. Our internal library stores a complex matrix by using two matrix, one
> for the real part and another for the imaginary part. It seems that this
> improves but is it still preferred even with Eigen2?
>
> Sorry that I don't know (yet) much about the internal of Eigen2 so
> haven't figured out the answer to my questions myself so your
> suggestions will be very appreciated.
>
> thanks,
>
> Xuewen
>
> P.S. I'm sorry if you have received the mail twice since apparently I used
> the wrong email address the first time.
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>



-- 
Rohit Garg

http://rpg-314.blogspot.com/

Senior Undergraduate
Department of Physics
Indian Institute of Technology
Bombay



Mail converted by MHonArc 2.6.19+ http://listengine.tuxfamily.org/