10#ifndef EIGEN_PARTIALREDUX_H
11#define EIGEN_PARTIALREDUX_H
42template<
typename Func,
typename Evaluator>
43struct packetwise_redux_traits
46 OuterSize = int(Evaluator::IsRowMajor) ? Evaluator::RowsAtCompileTime : Evaluator::ColsAtCompileTime,
48 : OuterSize * Evaluator::CoeffReadCost + (OuterSize-1) * functor_traits<Func>::Cost,
49 Unrolling = Cost <= EIGEN_UNROLLING_LIMIT ? CompleteUnrolling : NoUnrolling
55template<
typename PacketType,
typename Func>
57PacketType packetwise_redux_empty_value(
const Func& ) {
return pset1<PacketType>(0); }
60template<
typename PacketType,
typename Scalar>
62PacketType packetwise_redux_empty_value(
const scalar_product_op<Scalar,Scalar>& ) {
return pset1<PacketType>(1); }
65template<
typename Func,
typename Evaluator,
66 int Unrolling = packetwise_redux_traits<Func, Evaluator>::Unrolling
68struct packetwise_redux_impl;
71template<
typename Func,
typename Evaluator>
72struct packetwise_redux_impl<Func, Evaluator, CompleteUnrolling>
74 typedef redux_novec_unroller<Func,Evaluator, 0, Evaluator::SizeAtCompileTime> Base;
75 typedef typename Evaluator::Scalar Scalar;
77 template<
typename PacketType>
78 EIGEN_DEVICE_FUNC
static EIGEN_STRONG_INLINE
79 PacketType run(
const Evaluator &eval,
const Func& func,
Index )
81 return redux_vec_unroller<Func, Evaluator, 0, packetwise_redux_traits<Func, Evaluator>::OuterSize>::template run<PacketType>(eval,func);
89template<
typename Func,
typename Evaluator,
int Start>
90struct redux_vec_unroller<Func, Evaluator, Start, 0>
92 template<
typename PacketType>
94 static EIGEN_STRONG_INLINE PacketType run(
const Evaluator &,
const Func& f)
96 return packetwise_redux_empty_value<PacketType>(f);
101template<
typename Func,
typename Evaluator>
102struct packetwise_redux_impl<Func, Evaluator, NoUnrolling>
104 typedef typename Evaluator::Scalar Scalar;
105 typedef typename redux_traits<Func, Evaluator>::PacketType PacketScalar;
107 template<
typename PacketType>
109 static PacketType run(
const Evaluator &eval,
const Func& func,
Index size)
112 return packetwise_redux_empty_value<PacketType>(func);
114 const Index size4 = (size-1)&(~3);
115 PacketType p = eval.template packetByOuterInner<Unaligned,PacketType>(0,0);
123 func.packetOp(eval.template packetByOuterInner<Unaligned,PacketType>(i+0,0),eval.template packetByOuterInner<Unaligned,PacketType>(i+1,0)),
124 func.packetOp(eval.template packetByOuterInner<Unaligned,PacketType>(i+2,0),eval.template packetByOuterInner<Unaligned,PacketType>(i+3,0))));
126 p = func.packetOp(p, eval.template packetByOuterInner<Unaligned,PacketType>(i,0));
131template<
typename ArgType,
typename MemberOp,
int Direction>
132struct evaluator<PartialReduxExpr<ArgType, MemberOp, Direction> >
133 : evaluator_base<PartialReduxExpr<ArgType, MemberOp, Direction> >
135 typedef PartialReduxExpr<ArgType, MemberOp, Direction> XprType;
136 typedef typename internal::nested_eval<ArgType,1>::type ArgTypeNested;
137 typedef typename internal::add_const_on_value_type<ArgTypeNested>::type ConstArgTypeNested;
138 typedef typename internal::remove_all<ArgTypeNested>::type ArgTypeNestedCleaned;
139 typedef typename ArgType::Scalar InputScalar;
140 typedef typename XprType::Scalar Scalar;
142 TraversalSize = Direction==int(
Vertical) ? int(ArgType::RowsAtCompileTime) : int(ArgType::ColsAtCompileTime)
144 typedef typename MemberOp::template Cost<int(TraversalSize)> CostOpType;
147 : TraversalSize==0 ? 1
148 : int(TraversalSize) * int(evaluator<ArgType>::CoeffReadCost) + int(CostOpType::value),
150 _ArgFlags = evaluator<ArgType>::Flags,
153 && bool(MemberOp::Vectorizable)
155 && (TraversalSize!=0),
158 | (evaluator<ArgType>::Flags&(HereditaryBits&(~
RowMajorBit)))
165 EIGEN_DEVICE_FUNC
explicit evaluator(
const XprType xpr)
166 : m_arg(xpr.nestedExpression()), m_functor(xpr.functor())
168 EIGEN_INTERNAL_CHECK_COST_VALUE(TraversalSize==
Dynamic ?
HugeCost : (TraversalSize==0 ? 1 :
int(CostOpType::value)));
169 EIGEN_INTERNAL_CHECK_COST_VALUE(CoeffReadCost);
172 typedef typename XprType::CoeffReturnType CoeffReturnType;
174 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
177 return coeff(Direction==
Vertical ? j : i);
180 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
181 const Scalar coeff(
Index index)
const
183 return m_functor(m_arg.template subVector<
DirectionType(Direction)>(index));
186 template<
int LoadMode,
typename PacketType>
187 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
190 return packet<LoadMode,PacketType>(Direction==
Vertical ? j : i);
193 template<
int LoadMode,
typename PacketType>
194 EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC
195 PacketType packet(
Index idx)
const
197 enum { PacketSize = internal::unpacket_traits<PacketType>::size };
198 typedef Block<
const ArgTypeNestedCleaned,
199 Direction==
Vertical ? int(ArgType::RowsAtCompileTime) : int(PacketSize),
200 Direction==
Vertical ? int(PacketSize) : int(ArgType::ColsAtCompileTime),
203 PanelType panel(m_arg,
214 return internal::pset1<PacketType>(coeff(idx));
216 typedef typename internal::redux_evaluator<PanelType> PanelEvaluator;
217 PanelEvaluator panel_eval(panel);
218 typedef typename MemberOp::BinaryOp BinaryOp;
219 PacketType p = internal::packetwise_redux_impl<BinaryOp,PanelEvaluator>::template run<PacketType>(panel_eval,m_functor.binaryFunc(),m_arg.outerSize());
224 ConstArgTypeNested m_arg;
225 const MemberOp m_functor;
DirectionType
Definition: Constants.h:261
@ Vertical
Definition: Constants.h:264
const unsigned int PacketAccessBit
Definition: Constants.h:94
const unsigned int LinearAccessBit
Definition: Constants.h:130
const unsigned int RowMajorBit
Definition: Constants.h:66
Namespace containing all symbols from the Eigen library.
Definition: Core:141
const int HugeCost
Definition: Constants.h:44
EIGEN_DEFAULT_DENSE_INDEX_TYPE Index
The Index type as used for the API.
Definition: Meta.h:74
const int Dynamic
Definition: Constants.h:22