diff options
author | Jitse Niesen <jitse@maths.leeds.ac.uk> | 2011-03-28 21:29:47 +0100 |
---|---|---|
committer | Jitse Niesen <jitse@maths.leeds.ac.uk> | 2011-03-28 21:29:47 +0100 |
commit | 8175fe43e0d2a662bcc9c057e1e5b69a88d15b8f (patch) | |
tree | 85f4807cecf6ab4a2de55d42d7cfb912f931eda5 /Eigen | |
parent | 00991b5b64eb374af377b63000b2c46aa342c05d (diff) |
Evaluators: Make inner vectorization more similar to default traversal.
Diffstat (limited to 'Eigen')
-rw-r--r-- | Eigen/src/Core/AssignEvaluator.h | 7 | ||||
-rw-r--r-- | Eigen/src/Core/CoreEvaluators.h | 99 |
2 files changed, 36 insertions, 70 deletions
diff --git a/Eigen/src/Core/AssignEvaluator.h b/Eigen/src/Core/AssignEvaluator.h index 0b90ef70f..78014c6f9 100644 --- a/Eigen/src/Core/AssignEvaluator.h +++ b/Eigen/src/Core/AssignEvaluator.h @@ -259,8 +259,11 @@ struct copy_using_evaluator_impl<DstXprType, SrcXprType, InnerVectorizedTraversa const Index outerSize = dst.outerSize(); const Index packetSize = packet_traits<typename DstXprType::Scalar>::size; for(Index outer = 0; outer < outerSize; ++outer) - for(Index inner = 0; inner < innerSize; inner+=packetSize) - dstEvaluator.template writePacketByOuterInner<Aligned>(outer, inner, srcEvaluator.template packetByOuterInner<Aligned>(outer, inner)); + for(Index inner = 0; inner < innerSize; inner+=packetSize) { + Index row = dst.rowIndexByOuterInner(outer, inner); + Index col = dst.colIndexByOuterInner(outer, inner); + dstEvaluator.template writePacket<Aligned>(row, col, srcEvaluator.template packet<Aligned>(row, col)); + } } }; diff --git a/Eigen/src/Core/CoreEvaluators.h b/Eigen/src/Core/CoreEvaluators.h index 734936681..008285b4c 100644 --- a/Eigen/src/Core/CoreEvaluators.h +++ b/Eigen/src/Core/CoreEvaluators.h @@ -75,30 +75,29 @@ struct evaluator_impl<Transpose<ExpressionType> > return m_argImpl.coeffRef(index); } + // TODO: Difference between PacketScalar and PacketReturnType? template<int LoadMode> - const typename ExpressionType::PacketScalar packet(Index index) const + const typename ExpressionType::PacketScalar packet(Index row, Index col) const { - return m_argImpl.template packet<LoadMode>(index); + return m_argImpl.template packet<LoadMode>(col, row); } - // TODO: Difference between PacketScalar and PacketReturnType? - // TODO: Get this function by inheriting from DenseCoeffBase? - template<int LoadMode> - const typename ExpressionType::PacketScalar packetByOuterInner(Index outer, Index inner) const + template<int LoadMode> + const typename ExpressionType::PacketScalar packet(Index index) const { - return m_argImpl.template packetByOuterInner<LoadMode>(outer, inner); + return m_argImpl.template packet<LoadMode>(index); } template<int StoreMode> - void writePacket(Index index, const typename ExpressionType::PacketScalar& x) + void writePacket(Index row, Index col, const typename ExpressionType::PacketScalar& x) { - m_argImpl.template writePacket<StoreMode>(index, x); + m_argImpl.template writePacket<StoreMode>(col, row, x); } template<int StoreMode> - void writePacketByOuterInner(Index outer, Index inner, const typename ExpressionType::PacketScalar& x) + void writePacket(Index index, const typename ExpressionType::PacketScalar& x) { - m_argImpl.template writePacketByOuterInner<StoreMode>(outer, inner, x); + m_argImpl.template writePacket<StoreMode>(index, x); } protected: @@ -116,16 +115,6 @@ struct evaluator_impl<Matrix<Scalar, Rows, Cols, Options, MaxRows, MaxCols> > typedef typename MatrixType::Index Index; - Index colIndexByOuterInner(Index outer, Index inner) const - { - return m_matrix.colIndexByOuterInner(outer, inner); - } - - Index rowIndexByOuterInner(Index outer, Index inner) const - { - return m_matrix.rowIndexByOuterInner(outer, inner); - } - typename MatrixType::CoeffReturnType coeff(Index i, Index j) const { return m_matrix.coeff(i, j); @@ -147,35 +136,29 @@ struct evaluator_impl<Matrix<Scalar, Rows, Cols, Options, MaxRows, MaxCols> > } template<int LoadMode> - typename MatrixType::PacketReturnType packet(Index index) const - { - // eigen_internal_assert(index >= 0 && index < size()); - return m_matrix.template packet<LoadMode>(index); - } - - template<int LoadMode> typename MatrixType::PacketReturnType packet(Index row, Index col) const { return m_matrix.template packet<LoadMode>(row, col); } template<int LoadMode> - typename MatrixType::PacketReturnType packetByOuterInner(Index outer, Index inner) const + typename MatrixType::PacketReturnType packet(Index index) const { - return m_matrix.template packetByOuterInner<LoadMode>(outer, inner); + // eigen_internal_assert(index >= 0 && index < size()); + return m_matrix.template packet<LoadMode>(index); } template<int StoreMode> - void writePacket(Index index, const typename MatrixType::PacketScalar& x) + void writePacket(Index row, Index col, const typename MatrixType::PacketScalar& x) { - // eigen_internal_assert(index >= 0 && index < size()); - m_matrix.const_cast_derived().template writePacket<StoreMode>(index, x); + m_matrix.const_cast_derived().template writePacket<StoreMode>(row, col, x); } template<int StoreMode> - void writePacketByOuterInner(Index outer, Index inner, const typename MatrixType::PacketScalar& x) + void writePacket(Index index, const typename MatrixType::PacketScalar& x) { - m_matrix.const_cast_derived().template writePacketByOuterInner<StoreMode>(outer, inner, x); + // eigen_internal_assert(index >= 0 && index < size()); + m_matrix.const_cast_derived().template writePacket<StoreMode>(index, x); } protected: @@ -195,16 +178,16 @@ struct evaluator_impl<Array<Scalar, Rows, Cols, Options, MaxRows, MaxCols> > typedef typename ArrayType::Index Index; - Index colIndexByOuterInner(Index outer, Index inner) const - { - return m_array.colIndexByOuterInner(outer, inner); - } - typename ArrayType::CoeffReturnType coeff(Index i, Index j) const { return m_array.coeff(i, j); } + typename ArrayType::CoeffReturnType coeff(Index index) const + { + return m_array.coeff(index); + } + typename ArrayType::Scalar& coeffRef(Index i, Index j) { return m_array.const_cast_derived().coeffRef(i, j); @@ -216,35 +199,29 @@ struct evaluator_impl<Array<Scalar, Rows, Cols, Options, MaxRows, MaxCols> > } template<int LoadMode> - typename ArrayType::PacketReturnType packet(Index index) const - { - // eigen_internal_assert(index >= 0 && index < size()); - return m_array.template packet<LoadMode>(index); - } - - template<int LoadMode> typename ArrayType::PacketReturnType packet(Index row, Index col) const { return m_array.template packet<LoadMode>(row, col); } template<int LoadMode> - typename ArrayType::PacketReturnType packetByOuterInner(Index outer, Index inner) const + typename ArrayType::PacketReturnType packet(Index index) const { - return m_array.template packetByOuterInner<LoadMode>(outer, inner); + // eigen_internal_assert(index >= 0 && index < size()); + return m_array.template packet<LoadMode>(index); } template<int StoreMode> - void writePacket(Index index, const typename ArrayType::PacketScalar& x) + void writePacket(Index row, Index col, const typename ArrayType::PacketScalar& x) { - // eigen_internal_assert(index >= 0 && index < size()); - m_array.const_cast_derived().template writePacket<StoreMode>(index, x); + m_array.const_cast_derived().template writePacket<StoreMode>(row, col, x); } template<int StoreMode> - void writePacketByOuterInner(Index outer, Index inner, const typename ArrayType::PacketScalar& x) + void writePacket(Index index, const typename ArrayType::PacketScalar& x) { - m_array.const_cast_derived().template writePacketByOuterInner<StoreMode>(outer, inner, x); + // eigen_internal_assert(index >= 0 && index < size()); + m_array.const_cast_derived().template writePacket<StoreMode>(index, x); } protected: @@ -315,13 +292,6 @@ struct evaluator_impl<CwiseUnaryOp<UnaryOp, ArgType> > return m_unaryOp.functor().packetOp(m_argImpl.template packet<LoadMode>(row, col)); } - template<int LoadMode> - typename UnaryOpType::PacketScalar packetByOuterInner(Index outer, Index inner) const - { - return packet<LoadMode>(m_argImpl.rowIndexByOuterInner(outer, inner), - m_argImpl.colIndexByOuterInner(outer, inner)); - } - protected: const UnaryOpType& m_unaryOp; typename evaluator<ArgType>::type m_argImpl; @@ -362,13 +332,6 @@ struct evaluator_impl<CwiseBinaryOp<BinaryOp, Lhs, Rhs> > m_rhsImpl.template packet<LoadMode>(row, col)); } - template<int LoadMode> - typename BinaryOpType::PacketScalar packetByOuterInner(Index outer, Index inner) const - { - return packet<LoadMode>(m_lhsImpl.rowIndexByOuterInner(outer, inner), - m_lhsImpl.colIndexByOuterInner(outer, inner)); - } - protected: const BinaryOpType& m_binaryOp; typename evaluator<Lhs>::type m_lhsImpl; |