aboutsummaryrefslogtreecommitdiffhomepage
path: root/Eigen/src/Core/Redux.h
diff options
context:
space:
mode:
authorGravatar Gael Guennebaud <g.gael@free.fr>2018-10-09 23:30:41 +0200
committerGravatar Gael Guennebaud <g.gael@free.fr>2018-10-09 23:30:41 +0200
commitbfa2a81a50d39be1b2dea29aa9ba738ee6ed9b94 (patch)
tree6434dd7b8fb74dc5929017915889baa3c69ce34b /Eigen/src/Core/Redux.h
parentc0c3be26ed0093a03316219783992b2bc9f8a226 (diff)
Make redux_vec_unroller more flexible regarding packet-type
Diffstat (limited to 'Eigen/src/Core/Redux.h')
-rw-r--r--Eigen/src/Core/Redux.h48
1 files changed, 23 insertions, 25 deletions
diff --git a/Eigen/src/Core/Redux.h b/Eigen/src/Core/Redux.h
index 0aee855df..720b6030c 100644
--- a/Eigen/src/Core/Redux.h
+++ b/Eigen/src/Core/Redux.h
@@ -145,38 +145,36 @@ struct redux_novec_unroller<Func, Evaluator, Start, 0>
template<typename Func, typename Evaluator, int Start, int Length>
struct redux_vec_unroller
{
- enum {
- PacketSize = redux_traits<Func, Evaluator>::PacketSize,
- HalfLength = Length/2
- };
-
- typedef typename Evaluator::Scalar Scalar;
- typedef typename redux_traits<Func, Evaluator>::PacketType PacketScalar;
-
- static EIGEN_STRONG_INLINE PacketScalar run(const Evaluator &eval, const Func& func)
+ template<typename PacketType>
+ EIGEN_DEVICE_FUNC
+ static EIGEN_STRONG_INLINE PacketType run(const Evaluator &eval, const Func& func)
{
+ enum {
+ PacketSize = unpacket_traits<PacketType>::size,
+ HalfLength = Length/2
+ };
+
return func.packetOp(
- redux_vec_unroller<Func, Evaluator, Start, HalfLength>::run(eval,func),
- redux_vec_unroller<Func, Evaluator, Start+HalfLength, Length-HalfLength>::run(eval,func) );
+ redux_vec_unroller<Func, Evaluator, Start, HalfLength>::template run<PacketType>(eval,func),
+ redux_vec_unroller<Func, Evaluator, Start+HalfLength, Length-HalfLength>::template run<PacketType>(eval,func) );
}
};
template<typename Func, typename Evaluator, int Start>
struct redux_vec_unroller<Func, Evaluator, Start, 1>
{
- enum {
- index = Start * redux_traits<Func, Evaluator>::PacketSize,
- outer = index / int(Evaluator::InnerSizeAtCompileTime),
- inner = index % int(Evaluator::InnerSizeAtCompileTime),
- alignment = Evaluator::Alignment
- };
-
- typedef typename Evaluator::Scalar Scalar;
- typedef typename redux_traits<Func, Evaluator>::PacketType PacketScalar;
-
- static EIGEN_STRONG_INLINE PacketScalar run(const Evaluator &eval, const Func&)
+ template<typename PacketType>
+ EIGEN_DEVICE_FUNC
+ static EIGEN_STRONG_INLINE PacketType run(const Evaluator &eval, const Func&)
{
- return eval.template packetByOuterInner<alignment,PacketScalar>(outer, inner);
+ enum {
+ PacketSize = unpacket_traits<PacketType>::size,
+ index = Start * PacketSize,
+ outer = index / int(Evaluator::InnerSizeAtCompileTime),
+ inner = index % int(Evaluator::InnerSizeAtCompileTime),
+ alignment = Evaluator::Alignment
+ };
+ return eval.template packetByOuterInner<alignment,PacketType>(outer, inner);
}
};
@@ -329,7 +327,7 @@ struct redux_impl<Func, Evaluator, LinearVectorizedTraversal, CompleteUnrolling>
{
typedef typename Evaluator::Scalar Scalar;
- typedef typename redux_traits<Func, Evaluator>::PacketType PacketScalar;
+ typedef typename redux_traits<Func, Evaluator>::PacketType PacketType;
enum {
PacketSize = redux_traits<Func, Evaluator>::PacketSize,
Size = Evaluator::SizeAtCompileTime,
@@ -343,7 +341,7 @@ struct redux_impl<Func, Evaluator, LinearVectorizedTraversal, CompleteUnrolling>
EIGEN_ONLY_USED_FOR_DEBUG(xpr)
eigen_assert(xpr.rows()>0 && xpr.cols()>0 && "you are using an empty matrix");
if (VectorizedSize > 0) {
- Scalar res = func.predux(redux_vec_unroller<Func, Evaluator, 0, Size / PacketSize>::run(eval,func));
+ Scalar res = func.predux(redux_vec_unroller<Func, Evaluator, 0, Size / PacketSize>::template run<PacketType>(eval,func));
if (VectorizedSize != Size)
res = func(res,redux_novec_unroller<Func, Evaluator, VectorizedSize, Size-VectorizedSize>::run(eval,func));
return res;