mirror of
https://gitlab.com/libeigen/eigen.git
synced 2025-04-20 16:49:38 +08:00
Update vectorization_logic tests for all platforms.
This commit is contained in:
parent
c9ff739af1
commit
27d8f29be3
@ -39,11 +39,15 @@ bool test_assign(const Dst&, const Src&, int traversal, int unrolling)
|
|||||||
{
|
{
|
||||||
EIGEN_STATIC_ASSERT_SAME_MATRIX_SIZE(Dst,Src);
|
EIGEN_STATIC_ASSERT_SAME_MATRIX_SIZE(Dst,Src);
|
||||||
typedef internal::copy_using_evaluator_traits<internal::evaluator<Dst>,internal::evaluator<Src>, internal::assign_op<typename Dst::Scalar,typename Src::Scalar> > traits;
|
typedef internal::copy_using_evaluator_traits<internal::evaluator<Dst>,internal::evaluator<Src>, internal::assign_op<typename Dst::Scalar,typename Src::Scalar> > traits;
|
||||||
bool res = traits::Traversal==traversal;
|
// If traversal or unrolling are negative, ignore.
|
||||||
if(unrolling==InnerUnrolling+CompleteUnrolling)
|
bool res = traversal > -1 ? traits::Traversal==traversal : true;
|
||||||
|
if (unrolling > -1) {
|
||||||
|
if(unrolling==InnerUnrolling+CompleteUnrolling) {
|
||||||
res = res && (int(traits::Unrolling)==InnerUnrolling || int(traits::Unrolling)==CompleteUnrolling);
|
res = res && (int(traits::Unrolling)==InnerUnrolling || int(traits::Unrolling)==CompleteUnrolling);
|
||||||
else
|
} else {
|
||||||
res = res && int(traits::Unrolling)==unrolling;
|
res = res && int(traits::Unrolling)==unrolling;
|
||||||
|
}
|
||||||
|
}
|
||||||
if(!res)
|
if(!res)
|
||||||
{
|
{
|
||||||
std::cerr << "Src: " << demangle_flags(Src::Flags) << std::endl;
|
std::cerr << "Src: " << demangle_flags(Src::Flags) << std::endl;
|
||||||
@ -178,21 +182,15 @@ struct vectorization_logic
|
|||||||
typedef Matrix<Scalar,3,1,ColMajor> Vector3;
|
typedef Matrix<Scalar,3,1,ColMajor> Vector3;
|
||||||
VERIFY(test_assign(Matrix33c().row(2),Matrix33c().row(1)+Matrix33c().row(1),
|
VERIFY(test_assign(Matrix33c().row(2),Matrix33c().row(1)+Matrix33c().row(1),
|
||||||
LinearTraversal,CompleteUnrolling));
|
LinearTraversal,CompleteUnrolling));
|
||||||
VERIFY(test_assign(Vector3(),Vector3()+Vector3(),
|
// Vectorization depends on too many factors - ignore.
|
||||||
sizeof(Scalar)==16 ? InnerVectorizedTraversal : (EIGEN_UNALIGNED_VECTORIZE ? LinearVectorizedTraversal : LinearTraversal), CompleteUnrolling));
|
VERIFY(test_assign(Vector3(),Vector3()+Vector3(), -1, CompleteUnrolling));
|
||||||
VERIFY(test_assign(Matrix33c().col(0),Matrix33c().col(1)+Matrix33c().col(1),
|
|
||||||
EIGEN_UNALIGNED_VECTORIZE ? (sizeof(Scalar)==16 ? InnerVectorizedTraversal : LinearVectorizedTraversal)
|
|
||||||
: (sizeof(Scalar)==16 ? SliceVectorizedTraversal : LinearTraversal),
|
|
||||||
((!EIGEN_UNALIGNED_VECTORIZE) && (sizeof(Scalar)==16)) ? NoUnrolling : CompleteUnrolling));
|
|
||||||
|
|
||||||
VERIFY(test_assign(Matrix3(),Matrix3().cwiseProduct(Matrix3()),
|
VERIFY(test_assign(Matrix3(),Matrix3().cwiseProduct(Matrix3()),
|
||||||
LinearVectorizedTraversal,CompleteUnrolling));
|
LinearVectorizedTraversal,CompleteUnrolling));
|
||||||
|
|
||||||
|
// Vectorization depends on too many factors - ignore.
|
||||||
VERIFY(test_assign(Matrix<Scalar,17,17>(),Matrix<Scalar,17,17>()+Matrix<Scalar,17,17>(),
|
VERIFY(test_assign(Matrix<Scalar,17,17>(),Matrix<Scalar,17,17>()+Matrix<Scalar,17,17>(),
|
||||||
sizeof(Scalar)==16 ? InnerVectorizedTraversal :
|
-1, NoUnrolling));
|
||||||
EIGEN_UNALIGNED_VECTORIZE ? LinearVectorizedTraversal :
|
|
||||||
LinearTraversal,
|
|
||||||
NoUnrolling));
|
|
||||||
|
|
||||||
VERIFY(test_assign(Matrix11(), Matrix11()+Matrix11(),InnerVectorizedTraversal,CompleteUnrolling));
|
VERIFY(test_assign(Matrix11(), Matrix11()+Matrix11(),InnerVectorizedTraversal,CompleteUnrolling));
|
||||||
|
|
||||||
@ -277,12 +275,20 @@ struct vectorization_logic_half
|
|||||||
};
|
};
|
||||||
static void run()
|
static void run()
|
||||||
{
|
{
|
||||||
|
// Some half-packets have a byte size < EIGEN_MIN_ALIGN_BYTES (e.g. Packet2f),
|
||||||
|
// which causes many of these tests to fail since they don't vectorize if
|
||||||
|
// EIGEN_UNALIGNED_VECTORIZE is 0 (the matrix is assumed unaligned).
|
||||||
|
// Adjust the matrix sizes to account for these alignment issues.
|
||||||
|
constexpr int PacketBytes = sizeof(Scalar)*PacketSize;
|
||||||
|
constexpr int MinVSize = EIGEN_UNALIGNED_VECTORIZE ? PacketSize
|
||||||
|
: PacketBytes >= EIGEN_MIN_ALIGN_BYTES ? PacketSize
|
||||||
|
: (EIGEN_MIN_ALIGN_BYTES + sizeof(Scalar) - 1) / sizeof(Scalar);
|
||||||
|
|
||||||
typedef Matrix<Scalar,PacketSize,1> Vector1;
|
typedef Matrix<Scalar,MinVSize,1> Vector1;
|
||||||
typedef Matrix<Scalar,PacketSize,PacketSize> Matrix11;
|
typedef Matrix<Scalar,MinVSize,MinVSize> Matrix11;
|
||||||
typedef Matrix<Scalar,5*PacketSize,7,ColMajor> Matrix57;
|
typedef Matrix<Scalar,5*MinVSize,7,ColMajor> Matrix57;
|
||||||
typedef Matrix<Scalar,3*PacketSize,5,ColMajor> Matrix35;
|
typedef Matrix<Scalar,3*MinVSize,5,ColMajor> Matrix35;
|
||||||
typedef Matrix<Scalar,5*PacketSize,7,DontAlign|ColMajor> Matrix57u;
|
typedef Matrix<Scalar,5*MinVSize,7,DontAlign|ColMajor> Matrix57u;
|
||||||
|
|
||||||
typedef Matrix<Scalar,
|
typedef Matrix<Scalar,
|
||||||
(PacketSize==16 ? 8 : PacketSize==8 ? 4 : PacketSize==4 ? 2 : PacketSize==2 ? 1 : /*PacketSize==1 ?*/ 1),
|
(PacketSize==16 ? 8 : PacketSize==8 ? 4 : PacketSize==4 ? 2 : PacketSize==2 ? 1 : /*PacketSize==1 ?*/ 1),
|
||||||
@ -296,8 +302,8 @@ struct vectorization_logic_half
|
|||||||
|
|
||||||
// this type is made such that it can only be vectorized when viewed as a linear 1D vector
|
// this type is made such that it can only be vectorized when viewed as a linear 1D vector
|
||||||
typedef Matrix<Scalar,
|
typedef Matrix<Scalar,
|
||||||
(PacketSize==16 ? 4 : PacketSize==8 ? 4 : PacketSize==4 ? 6 : PacketSize==2 ? ((Matrix11::Flags&RowMajorBit)?2:3) : /*PacketSize==1 ?*/ 1),
|
(MinVSize==16 ? 4 : MinVSize==8 ? 4 : MinVSize==4 ? 6 : MinVSize==2 ? ((Matrix11::Flags&RowMajorBit)?2:3) : /*PacketSize==1 ?*/ 1),
|
||||||
(PacketSize==16 ? 12 : PacketSize==8 ? 6 : PacketSize==4 ? 2 : PacketSize==2 ? ((Matrix11::Flags&RowMajorBit)?3:2) : /*PacketSize==1 ?*/ 3)
|
(MinVSize==16 ? 12 : MinVSize==8 ? 6 : MinVSize==4 ? 2 : MinVSize==2 ? ((Matrix11::Flags&RowMajorBit)?3:2) : /*PacketSize==1 ?*/ 3)
|
||||||
> Matrix3;
|
> Matrix3;
|
||||||
|
|
||||||
#if !EIGEN_GCC_AND_ARCH_DOESNT_WANT_STACK_ALIGNMENT
|
#if !EIGEN_GCC_AND_ARCH_DOESNT_WANT_STACK_ALIGNMENT
|
||||||
@ -305,11 +311,11 @@ struct vectorization_logic_half
|
|||||||
InnerVectorizedTraversal,CompleteUnrolling));
|
InnerVectorizedTraversal,CompleteUnrolling));
|
||||||
VERIFY(test_assign(Vector1(),Vector1()+Vector1(),
|
VERIFY(test_assign(Vector1(),Vector1()+Vector1(),
|
||||||
InnerVectorizedTraversal,CompleteUnrolling));
|
InnerVectorizedTraversal,CompleteUnrolling));
|
||||||
VERIFY(test_assign(Vector1(),Vector1().template segment<PacketSize>(0).derived(),
|
VERIFY(test_assign(Vector1(),Vector1().template segment<MinVSize>(0).derived(),
|
||||||
EIGEN_UNALIGNED_VECTORIZE ? InnerVectorizedTraversal : LinearVectorizedTraversal,CompleteUnrolling));
|
EIGEN_UNALIGNED_VECTORIZE ? InnerVectorizedTraversal : LinearVectorizedTraversal,CompleteUnrolling));
|
||||||
VERIFY(test_assign(Vector1(),Scalar(2.1)*Vector1()-Vector1(),
|
VERIFY(test_assign(Vector1(),Scalar(2.1)*Vector1()-Vector1(),
|
||||||
InnerVectorizedTraversal,CompleteUnrolling));
|
InnerVectorizedTraversal,CompleteUnrolling));
|
||||||
VERIFY(test_assign(Vector1(),(Scalar(2.1)*Vector1().template segment<PacketSize>(0)-Vector1().template segment<PacketSize>(0)).derived(),
|
VERIFY(test_assign(Vector1(),(Scalar(2.1)*Vector1().template segment<MinVSize>(0)-Vector1().template segment<MinVSize>(0)).derived(),
|
||||||
EIGEN_UNALIGNED_VECTORIZE ? InnerVectorizedTraversal : LinearVectorizedTraversal,CompleteUnrolling));
|
EIGEN_UNALIGNED_VECTORIZE ? InnerVectorizedTraversal : LinearVectorizedTraversal,CompleteUnrolling));
|
||||||
VERIFY(test_assign(Vector1(),Vector1().cwiseProduct(Vector1()),
|
VERIFY(test_assign(Vector1(),Vector1().cwiseProduct(Vector1()),
|
||||||
InnerVectorizedTraversal,CompleteUnrolling));
|
InnerVectorizedTraversal,CompleteUnrolling));
|
||||||
@ -331,20 +337,16 @@ struct vectorization_logic_half
|
|||||||
typedef Matrix<Scalar,3,3,ColMajor> Matrix33c;
|
typedef Matrix<Scalar,3,3,ColMajor> Matrix33c;
|
||||||
VERIFY(test_assign(Matrix33c().row(2),Matrix33c().row(1)+Matrix33c().row(1),
|
VERIFY(test_assign(Matrix33c().row(2),Matrix33c().row(1)+Matrix33c().row(1),
|
||||||
LinearTraversal,CompleteUnrolling));
|
LinearTraversal,CompleteUnrolling));
|
||||||
VERIFY(test_assign(Matrix33c().col(0),Matrix33c().col(1)+Matrix33c().col(1),
|
|
||||||
EIGEN_UNALIGNED_VECTORIZE ? (sizeof(Scalar)==16 ? InnerVectorizedTraversal : LinearVectorizedTraversal)
|
|
||||||
: (sizeof(Scalar)==16 ? SliceVectorizedTraversal : LinearTraversal),
|
|
||||||
((!EIGEN_UNALIGNED_VECTORIZE) && (sizeof(Scalar)==16)) ? NoUnrolling : CompleteUnrolling));
|
|
||||||
|
|
||||||
|
// Unrolling depends on read costs and unroll limits, which vary - ignore.
|
||||||
VERIFY(test_assign(Matrix3(),Matrix3().cwiseQuotient(Matrix3()),
|
VERIFY(test_assign(Matrix3(),Matrix3().cwiseQuotient(Matrix3()),
|
||||||
PacketTraits::HasDiv ? LinearVectorizedTraversal : LinearTraversal,
|
PacketTraits::HasDiv ? LinearVectorizedTraversal : LinearTraversal, -1));
|
||||||
PacketTraits::HasDiv ? CompleteUnrolling : NoUnrolling));
|
|
||||||
|
|
||||||
VERIFY(test_assign(Matrix<Scalar,17,17>(),Matrix<Scalar,17,17>()+Matrix<Scalar,17,17>(),
|
VERIFY(test_assign(Matrix<Scalar,17,17>(),Matrix<Scalar,17,17>()+Matrix<Scalar,17,17>(),
|
||||||
sizeof(Scalar)==16 ? InnerVectorizedTraversal : (EIGEN_UNALIGNED_VECTORIZE ? LinearVectorizedTraversal : LinearTraversal),
|
sizeof(Scalar)==16 ? InnerVectorizedTraversal : (EIGEN_UNALIGNED_VECTORIZE ? LinearVectorizedTraversal : LinearTraversal),
|
||||||
NoUnrolling));
|
NoUnrolling));
|
||||||
|
|
||||||
VERIFY(test_assign(Matrix11(),Matrix<Scalar,17,17>().template block<PacketSize,PacketSize>(2,3)+Matrix<Scalar,17,17>().template block<PacketSize,PacketSize>(8,4),
|
VERIFY(test_assign(Matrix11(),Matrix<Scalar,17,17>().template block<MinVSize,MinVSize>(2,3)+Matrix<Scalar,17,17>().template block<MinVSize,MinVSize>(8,4),
|
||||||
EIGEN_UNALIGNED_VECTORIZE ? InnerVectorizedTraversal : DefaultTraversal,InnerUnrolling+CompleteUnrolling));
|
EIGEN_UNALIGNED_VECTORIZE ? InnerVectorizedTraversal : DefaultTraversal,InnerUnrolling+CompleteUnrolling));
|
||||||
|
|
||||||
|
|
||||||
@ -358,7 +360,7 @@ struct vectorization_logic_half
|
|||||||
VERIFY(test_redux(Vector1(),
|
VERIFY(test_redux(Vector1(),
|
||||||
LinearVectorizedTraversal,CompleteUnrolling));
|
LinearVectorizedTraversal,CompleteUnrolling));
|
||||||
|
|
||||||
VERIFY(test_redux(Matrix<Scalar,PacketSize,3>(),
|
VERIFY(test_redux(Matrix<Scalar,MinVSize,3>(),
|
||||||
LinearVectorizedTraversal,CompleteUnrolling));
|
LinearVectorizedTraversal,CompleteUnrolling));
|
||||||
|
|
||||||
VERIFY(test_redux(Matrix3(),
|
VERIFY(test_redux(Matrix3(),
|
||||||
@ -381,7 +383,7 @@ struct vectorization_logic_half
|
|||||||
Matrix<Scalar, internal::plain_enum_max(2, PacketSize), internal::plain_enum_max(2, PacketSize)> >(
|
Matrix<Scalar, internal::plain_enum_max(2, PacketSize), internal::plain_enum_max(2, PacketSize)> >(
|
||||||
DefaultTraversal, PacketSize > 4 ? InnerUnrolling : CompleteUnrolling)));
|
DefaultTraversal, PacketSize > 4 ? InnerUnrolling : CompleteUnrolling)));
|
||||||
|
|
||||||
VERIFY((test_assign(Matrix57(), Matrix<Scalar, 5 * PacketSize, 3>() * Matrix<Scalar, 3, 7>(),
|
VERIFY((test_assign(Matrix57(), Matrix<Scalar, 5 * MinVSize, 3>() * Matrix<Scalar, 3, 7>(),
|
||||||
InnerVectorizedTraversal, InnerUnrolling + CompleteUnrolling)));
|
InnerVectorizedTraversal, InnerUnrolling + CompleteUnrolling)));
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user