mirror of
https://gitlab.com/libeigen/eigen.git
synced 2025-04-19 16:19:37 +08:00
Improve slice-vectorization logic for redux (significant speed-up for reduxion of blocks)
This commit is contained in:
parent
3ec2985914
commit
b00e48a867
@ -32,14 +32,20 @@ public:
|
|||||||
PacketSize = unpacket_traits<PacketType>::size,
|
PacketSize = unpacket_traits<PacketType>::size,
|
||||||
InnerMaxSize = int(Evaluator::IsRowMajor)
|
InnerMaxSize = int(Evaluator::IsRowMajor)
|
||||||
? Evaluator::MaxColsAtCompileTime
|
? Evaluator::MaxColsAtCompileTime
|
||||||
: Evaluator::MaxRowsAtCompileTime
|
: Evaluator::MaxRowsAtCompileTime,
|
||||||
|
OuterMaxSize = int(Evaluator::IsRowMajor)
|
||||||
|
? Evaluator::MaxRowsAtCompileTime
|
||||||
|
: Evaluator::MaxColsAtCompileTime,
|
||||||
|
SliceVectorizedWork = int(InnerMaxSize)==Dynamic ? Dynamic
|
||||||
|
: int(OuterMaxSize)==Dynamic ? (int(InnerMaxSize)>=int(PacketSize) ? Dynamic : 0)
|
||||||
|
: (int(InnerMaxSize)/int(PacketSize)) * int(OuterMaxSize)
|
||||||
};
|
};
|
||||||
|
|
||||||
enum {
|
enum {
|
||||||
MightVectorize = (int(Evaluator::Flags)&ActualPacketAccessBit)
|
MightVectorize = (int(Evaluator::Flags)&ActualPacketAccessBit)
|
||||||
&& (functor_traits<Func>::PacketAccess),
|
&& (functor_traits<Func>::PacketAccess),
|
||||||
MayLinearVectorize = bool(MightVectorize) && (int(Evaluator::Flags)&LinearAccessBit),
|
MayLinearVectorize = bool(MightVectorize) && (int(Evaluator::Flags)&LinearAccessBit),
|
||||||
MaySliceVectorize = bool(MightVectorize) && int(InnerMaxSize)>=3*PacketSize
|
MaySliceVectorize = bool(MightVectorize) && (int(SliceVectorizedWork)==Dynamic || int(SliceVectorizedWork)>=3)
|
||||||
};
|
};
|
||||||
|
|
||||||
public:
|
public:
|
||||||
@ -69,12 +75,15 @@ public:
|
|||||||
EIGEN_DEBUG_VAR(Evaluator::Flags)
|
EIGEN_DEBUG_VAR(Evaluator::Flags)
|
||||||
std::cerr.unsetf(std::ios::hex);
|
std::cerr.unsetf(std::ios::hex);
|
||||||
EIGEN_DEBUG_VAR(InnerMaxSize)
|
EIGEN_DEBUG_VAR(InnerMaxSize)
|
||||||
|
EIGEN_DEBUG_VAR(OuterMaxSize)
|
||||||
|
EIGEN_DEBUG_VAR(SliceVectorizedWork)
|
||||||
EIGEN_DEBUG_VAR(PacketSize)
|
EIGEN_DEBUG_VAR(PacketSize)
|
||||||
EIGEN_DEBUG_VAR(MightVectorize)
|
EIGEN_DEBUG_VAR(MightVectorize)
|
||||||
EIGEN_DEBUG_VAR(MayLinearVectorize)
|
EIGEN_DEBUG_VAR(MayLinearVectorize)
|
||||||
EIGEN_DEBUG_VAR(MaySliceVectorize)
|
EIGEN_DEBUG_VAR(MaySliceVectorize)
|
||||||
EIGEN_DEBUG_VAR(Traversal)
|
EIGEN_DEBUG_VAR(Traversal)
|
||||||
EIGEN_DEBUG_VAR(UnrollingLimit)
|
EIGEN_DEBUG_VAR(UnrollingLimit)
|
||||||
|
|
||||||
EIGEN_DEBUG_VAR(Unrolling)
|
EIGEN_DEBUG_VAR(Unrolling)
|
||||||
std::cerr << std::endl;
|
std::cerr << std::endl;
|
||||||
}
|
}
|
||||||
|
@ -230,8 +230,13 @@ struct vectorization_logic
|
|||||||
VERIFY(test_redux(Matrix44(),
|
VERIFY(test_redux(Matrix44(),
|
||||||
LinearVectorizedTraversal,NoUnrolling));
|
LinearVectorizedTraversal,NoUnrolling));
|
||||||
|
|
||||||
|
if(PacketSize>1) {
|
||||||
VERIFY(test_redux(Matrix44().template block<(Matrix1::Flags&RowMajorBit)?4:PacketSize,(Matrix1::Flags&RowMajorBit)?PacketSize:4>(1,2),
|
VERIFY(test_redux(Matrix44().template block<(Matrix1::Flags&RowMajorBit)?4:PacketSize,(Matrix1::Flags&RowMajorBit)?PacketSize:4>(1,2),
|
||||||
|
SliceVectorizedTraversal,CompleteUnrolling));
|
||||||
|
|
||||||
|
VERIFY(test_redux(Matrix44().template block<(Matrix1::Flags&RowMajorBit)?2:PacketSize,(Matrix1::Flags&RowMajorBit)?PacketSize:2>(1,2),
|
||||||
DefaultTraversal,CompleteUnrolling));
|
DefaultTraversal,CompleteUnrolling));
|
||||||
|
}
|
||||||
|
|
||||||
VERIFY(test_redux(Matrix44c().template block<2*PacketSize,1>(1,2),
|
VERIFY(test_redux(Matrix44c().template block<2*PacketSize,1>(1,2),
|
||||||
LinearVectorizedTraversal,CompleteUnrolling));
|
LinearVectorizedTraversal,CompleteUnrolling));
|
||||||
@ -375,8 +380,13 @@ struct vectorization_logic_half
|
|||||||
VERIFY(test_redux(Matrix35(),
|
VERIFY(test_redux(Matrix35(),
|
||||||
LinearVectorizedTraversal,CompleteUnrolling));
|
LinearVectorizedTraversal,CompleteUnrolling));
|
||||||
|
|
||||||
VERIFY(test_redux(Matrix57().template block<PacketSize,3>(1,0),
|
VERIFY(test_redux(Matrix57().template block<PacketSize==1?2:PacketSize,3>(1,0),
|
||||||
|
SliceVectorizedTraversal,CompleteUnrolling));
|
||||||
|
|
||||||
|
if(PacketSize>1) {
|
||||||
|
VERIFY(test_redux(Matrix57().template block<PacketSize,2>(1,0),
|
||||||
DefaultTraversal,CompleteUnrolling));
|
DefaultTraversal,CompleteUnrolling));
|
||||||
|
}
|
||||||
|
|
||||||
VERIFY((test_assign<
|
VERIFY((test_assign<
|
||||||
Map<Matrix<Scalar,EIGEN_PLAIN_ENUM_MAX(2,PacketSize),EIGEN_PLAIN_ENUM_MAX(2,PacketSize)>, AlignedMax, InnerStride<3*PacketSize> >,
|
Map<Matrix<Scalar,EIGEN_PLAIN_ENUM_MAX(2,PacketSize),EIGEN_PLAIN_ENUM_MAX(2,PacketSize)>, AlignedMax, InnerStride<3*PacketSize> >,
|
||||||
|
Loading…
x
Reference in New Issue
Block a user