aboutsummaryrefslogtreecommitdiffhomepage
path: root/Eigen/src/Core/DiagonalProduct.h
diff options
context:
space:
mode:
authorGravatar Benoit Jacob <jacob.benoit.1@gmail.com>2009-06-29 04:01:31 +0200
committerGravatar Benoit Jacob <jacob.benoit.1@gmail.com>2009-06-29 04:01:31 +0200
commit2de9b7f537057101f9684370004156425a24032e (patch)
tree4bf58e995cc50edc45ddb5e0f7801a6b318a4262 /Eigen/src/Core/DiagonalProduct.h
parent6809f7b1cdb3da897b996b72bb7f3c9dd4c26921 (diff)
fully vectorize DiagonalProduct
(it used to be partially vectorized and that had been lost in the big changes from the previous commit)
Diffstat (limited to 'Eigen/src/Core/DiagonalProduct.h')
-rw-r--r--Eigen/src/Core/DiagonalProduct.h38
1 files changed, 31 insertions, 7 deletions
diff --git a/Eigen/src/Core/DiagonalProduct.h b/Eigen/src/Core/DiagonalProduct.h
index 5948111c6..b838d1b31 100644
--- a/Eigen/src/Core/DiagonalProduct.h
+++ b/Eigen/src/Core/DiagonalProduct.h
@@ -26,8 +26,8 @@
#ifndef EIGEN_DIAGONALPRODUCT_H
#define EIGEN_DIAGONALPRODUCT_H
-template<typename MatrixType, typename DiagonalType, int Order>
-struct ei_traits<DiagonalProduct<MatrixType, DiagonalType, Order> >
+template<typename MatrixType, typename DiagonalType, int ProductOrder>
+struct ei_traits<DiagonalProduct<MatrixType, DiagonalType, ProductOrder> >
{
typedef typename MatrixType::Scalar Scalar;
enum {
@@ -35,14 +35,15 @@ struct ei_traits<DiagonalProduct<MatrixType, DiagonalType, Order> >
ColsAtCompileTime = MatrixType::ColsAtCompileTime,
MaxRowsAtCompileTime = MatrixType::MaxRowsAtCompileTime,
MaxColsAtCompileTime = MatrixType::MaxColsAtCompileTime,
- Flags = (unsigned int)(MatrixType::Flags) & HereditaryBits,
+ Flags = (HereditaryBits & (unsigned int)(MatrixType::Flags))
+ | (PacketAccessBit & (unsigned int)(MatrixType::Flags) & (unsigned int)(DiagonalType::DiagonalVectorType::Flags)),
CoeffReadCost = NumTraits<Scalar>::MulCost + MatrixType::CoeffReadCost + DiagonalType::DiagonalVectorType::CoeffReadCost
};
};
-template<typename MatrixType, typename DiagonalType, int Order>
+template<typename MatrixType, typename DiagonalType, int ProductOrder>
class DiagonalProduct : ei_no_assignment_operator,
- public MatrixBase<DiagonalProduct<MatrixType, DiagonalType, Order> >
+ public MatrixBase<DiagonalProduct<MatrixType, DiagonalType, ProductOrder> >
{
public:
@@ -51,7 +52,7 @@ class DiagonalProduct : ei_no_assignment_operator,
inline DiagonalProduct(const MatrixType& matrix, const DiagonalType& diagonal)
: m_matrix(matrix), m_diagonal(diagonal)
{
- ei_assert(diagonal.diagonal().size() == (Order == DiagonalOnTheLeft ? matrix.rows() : matrix.cols()));
+ ei_assert(diagonal.diagonal().size() == (ProductOrder == DiagonalOnTheLeft ? matrix.rows() : matrix.cols()));
}
inline int rows() const { return m_matrix.rows(); }
@@ -59,7 +60,30 @@ class DiagonalProduct : ei_no_assignment_operator,
const Scalar coeff(int row, int col) const
{
- return m_diagonal.diagonal().coeff(Order == DiagonalOnTheLeft ? row : col) * m_matrix.coeff(row, col);
+ return m_diagonal.diagonal().coeff(ProductOrder == DiagonalOnTheLeft ? row : col) * m_matrix.coeff(row, col);
+ }
+
+ template<int LoadMode>
+ EIGEN_STRONG_INLINE PacketScalar packet(int row, int col) const
+ {
+ enum {
+ StorageOrder = Flags & RowMajorBit ? RowMajor : ColMajor,
+ InnerSize = (MatrixType::Flags & RowMajorBit) ? MatrixType::ColsAtCompileTime : MatrixType::RowsAtCompileTime,
+ DiagonalVectorPacketLoadMode = (LoadMode == Aligned && ((InnerSize%16) == 0)) ? Aligned : Unaligned
+ };
+ const int indexInDiagonalVector = ProductOrder == DiagonalOnTheLeft ? row : col;
+
+ if((int(StorageOrder) == RowMajor && int(ProductOrder) == DiagonalOnTheLeft)
+ ||(int(StorageOrder) == ColMajor && int(ProductOrder) == DiagonalOnTheRight))
+ {
+ return ei_pmul(m_matrix.template packet<LoadMode>(row, col),
+ ei_pset1(m_diagonal.diagonal().coeff(indexInDiagonalVector)));
+ }
+ else
+ {
+ return ei_pmul(m_matrix.template packet<LoadMode>(row, col),
+ m_diagonal.diagonal().template packet<DiagonalVectorPacketLoadMode>(indexInDiagonalVector));
+ }
}
protected: