diff --git a/test/vectorization_logic.cpp b/test/vectorization_logic.cpp index 01b9862fb..a6441abbf 100644 --- a/test/vectorization_logic.cpp +++ b/test/vectorization_logic.cpp @@ -39,11 +39,15 @@ bool test_assign(const Dst&, const Src&, int traversal, int unrolling) { EIGEN_STATIC_ASSERT_SAME_MATRIX_SIZE(Dst,Src); typedef internal::copy_using_evaluator_traits,internal::evaluator, internal::assign_op > traits; - bool res = traits::Traversal==traversal; - if(unrolling==InnerUnrolling+CompleteUnrolling) - res = res && (int(traits::Unrolling)==InnerUnrolling || int(traits::Unrolling)==CompleteUnrolling); - else - res = res && int(traits::Unrolling)==unrolling; + // If traversal or unrolling are negative, ignore. + 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); + } else { + res = res && int(traits::Unrolling)==unrolling; + } + } if(!res) { std::cerr << "Src: " << demangle_flags(Src::Flags) << std::endl; @@ -178,21 +182,15 @@ struct vectorization_logic typedef Matrix Vector3; VERIFY(test_assign(Matrix33c().row(2),Matrix33c().row(1)+Matrix33c().row(1), LinearTraversal,CompleteUnrolling)); - VERIFY(test_assign(Vector3(),Vector3()+Vector3(), - sizeof(Scalar)==16 ? InnerVectorizedTraversal : (EIGEN_UNALIGNED_VECTORIZE ? LinearVectorizedTraversal : 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)); + // Vectorization depends on too many factors - ignore. + VERIFY(test_assign(Vector3(),Vector3()+Vector3(), -1, CompleteUnrolling)); VERIFY(test_assign(Matrix3(),Matrix3().cwiseProduct(Matrix3()), LinearVectorizedTraversal,CompleteUnrolling)); + // Vectorization depends on too many factors - ignore. VERIFY(test_assign(Matrix(),Matrix()+Matrix(), - sizeof(Scalar)==16 ? InnerVectorizedTraversal : - EIGEN_UNALIGNED_VECTORIZE ? LinearVectorizedTraversal : - LinearTraversal, - NoUnrolling)); + -1, NoUnrolling)); VERIFY(test_assign(Matrix11(), Matrix11()+Matrix11(),InnerVectorizedTraversal,CompleteUnrolling)); @@ -277,12 +275,20 @@ struct vectorization_logic_half }; 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 Vector1; - typedef Matrix Matrix11; - typedef Matrix Matrix57; - typedef Matrix Matrix35; - typedef Matrix Matrix57u; + typedef Matrix Vector1; + typedef Matrix Matrix11; + typedef Matrix Matrix57; + typedef Matrix Matrix35; + typedef Matrix Matrix57u; typedef Matrix Matrix3; - #if !EIGEN_GCC_AND_ARCH_DOESNT_WANT_STACK_ALIGNMENT +#if !EIGEN_GCC_AND_ARCH_DOESNT_WANT_STACK_ALIGNMENT VERIFY(test_assign(Vector1(),Vector1(), InnerVectorizedTraversal,CompleteUnrolling)); VERIFY(test_assign(Vector1(),Vector1()+Vector1(), InnerVectorizedTraversal,CompleteUnrolling)); - VERIFY(test_assign(Vector1(),Vector1().template segment(0).derived(), + VERIFY(test_assign(Vector1(),Vector1().template segment(0).derived(), EIGEN_UNALIGNED_VECTORIZE ? InnerVectorizedTraversal : LinearVectorizedTraversal,CompleteUnrolling)); VERIFY(test_assign(Vector1(),Scalar(2.1)*Vector1()-Vector1(), InnerVectorizedTraversal,CompleteUnrolling)); - VERIFY(test_assign(Vector1(),(Scalar(2.1)*Vector1().template segment(0)-Vector1().template segment(0)).derived(), + VERIFY(test_assign(Vector1(),(Scalar(2.1)*Vector1().template segment(0)-Vector1().template segment(0)).derived(), EIGEN_UNALIGNED_VECTORIZE ? InnerVectorizedTraversal : LinearVectorizedTraversal,CompleteUnrolling)); VERIFY(test_assign(Vector1(),Vector1().cwiseProduct(Vector1()), InnerVectorizedTraversal,CompleteUnrolling)); @@ -331,20 +337,16 @@ struct vectorization_logic_half typedef Matrix Matrix33c; VERIFY(test_assign(Matrix33c().row(2),Matrix33c().row(1)+Matrix33c().row(1), 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()), - PacketTraits::HasDiv ? LinearVectorizedTraversal : LinearTraversal, - PacketTraits::HasDiv ? CompleteUnrolling : NoUnrolling)); + PacketTraits::HasDiv ? LinearVectorizedTraversal : LinearTraversal, -1)); VERIFY(test_assign(Matrix(),Matrix()+Matrix(), sizeof(Scalar)==16 ? InnerVectorizedTraversal : (EIGEN_UNALIGNED_VECTORIZE ? LinearVectorizedTraversal : LinearTraversal), NoUnrolling)); - VERIFY(test_assign(Matrix11(),Matrix().template block(2,3)+Matrix().template block(8,4), + VERIFY(test_assign(Matrix11(),Matrix().template block(2,3)+Matrix().template block(8,4), EIGEN_UNALIGNED_VECTORIZE ? InnerVectorizedTraversal : DefaultTraversal,InnerUnrolling+CompleteUnrolling)); @@ -358,7 +360,7 @@ struct vectorization_logic_half VERIFY(test_redux(Vector1(), LinearVectorizedTraversal,CompleteUnrolling)); - VERIFY(test_redux(Matrix(), + VERIFY(test_redux(Matrix(), LinearVectorizedTraversal,CompleteUnrolling)); VERIFY(test_redux(Matrix3(), @@ -381,7 +383,7 @@ struct vectorization_logic_half Matrix >( DefaultTraversal, PacketSize > 4 ? InnerUnrolling : CompleteUnrolling))); - VERIFY((test_assign(Matrix57(), Matrix() * Matrix(), + VERIFY((test_assign(Matrix57(), Matrix() * Matrix(), InnerVectorizedTraversal, InnerUnrolling + CompleteUnrolling))); #endif }