diff options
author | Jakub Lichman <jlichman@tachyum.com> | 2021-04-25 20:58:56 +0000 |
---|---|---|
committer | Jakub Lichman <jlichman@tachyum.com> | 2021-04-25 20:58:56 +0000 |
commit | d87648a6bea315645b893c3815ca8c6bb00ec5d2 (patch) | |
tree | 3be9249376756ef06f19e4a5b48aa8c567b623ee | |
parent | 1115f5462ecaa84d3c60479f7e23a530a1a415d2 (diff) |
Tests added and AVX512 bug fixed for pcmp_lt_or_nan
-rw-r--r-- | Eigen/src/Core/arch/AVX512/PacketMath.h | 4 | ||||
-rw-r--r-- | test/packetmath.cpp | 32 |
2 files changed, 34 insertions, 2 deletions
diff --git a/Eigen/src/Core/arch/AVX512/PacketMath.h b/Eigen/src/Core/arch/AVX512/PacketMath.h index 7d3362f48..59bbef0d1 100644 --- a/Eigen/src/Core/arch/AVX512/PacketMath.h +++ b/Eigen/src/Core/arch/AVX512/PacketMath.h @@ -487,7 +487,7 @@ template<> EIGEN_STRONG_INLINE Packet16f pcmp_lt(const Packet16f& a, const Packe } template<> EIGEN_STRONG_INLINE Packet16f pcmp_lt_or_nan(const Packet16f& a, const Packet16f& b) { - __mmask16 mask = _mm512_cmp_ps_mask(a, b, _CMP_NGT_UQ); + __mmask16 mask = _mm512_cmp_ps_mask(a, b, _CMP_NGE_UQ); return _mm512_castsi512_ps( _mm512_mask_set1_epi32(_mm512_set1_epi32(0), mask, 0xffffffffu)); } @@ -518,7 +518,7 @@ EIGEN_STRONG_INLINE Packet8d pcmp_lt(const Packet8d& a, const Packet8d& b) { } template <> EIGEN_STRONG_INLINE Packet8d pcmp_lt_or_nan(const Packet8d& a, const Packet8d& b) { - __mmask8 mask = _mm512_cmp_pd_mask(a, b, _CMP_NGT_UQ); + __mmask8 mask = _mm512_cmp_pd_mask(a, b, _CMP_NGE_UQ); return _mm512_castsi512_pd( _mm512_mask_set1_epi64(_mm512_set1_epi64(0), mask, 0xffffffffffffffffu)); } diff --git a/test/packetmath.cpp b/test/packetmath.cpp index 79e91c819..0bb511d5a 100644 --- a/test/packetmath.cpp +++ b/test/packetmath.cpp @@ -280,6 +280,36 @@ void packetmath_boolean_mask_ops() { } template <typename Scalar, typename Packet> +void packetmath_boolean_mask_ops_real() { + const int PacketSize = internal::unpacket_traits<Packet>::size; + const int size = 2 * PacketSize; + EIGEN_ALIGN_MAX Scalar data1[size]; + EIGEN_ALIGN_MAX Scalar data2[size]; + EIGEN_ALIGN_MAX Scalar ref[size]; + + for (int i = 0; i < PacketSize; ++i) { + data1[i] = internal::random<Scalar>(); + data1[i + PacketSize] = internal::random<bool>() ? data1[i] : Scalar(0); + } + + CHECK_CWISE2_IF(true, internal::pcmp_lt_or_nan, internal::pcmp_lt_or_nan); + + //Test (-0) <=/< (0) for signed operations + for (int i = 0; i < PacketSize; ++i) { + data1[i] = Scalar(-0.0); + data1[i + PacketSize] = internal::random<bool>() ? data1[i] : Scalar(0); + } + CHECK_CWISE2_IF(true, internal::pcmp_lt_or_nan, internal::pcmp_lt_or_nan); + + //Test NaN + for (int i = 0; i < PacketSize; ++i) { + data1[i] = NumTraits<Scalar>::quiet_NaN(); + data1[i + PacketSize] = internal::random<bool>() ? data1[i] : Scalar(0); + } + CHECK_CWISE2_IF(true, internal::pcmp_lt_or_nan, internal::pcmp_lt_or_nan); +} + +template <typename Scalar, typename Packet> void packetmath_boolean_mask_ops_notcomplex() { const int PacketSize = internal::unpacket_traits<Packet>::size; const int size = 2 * PacketSize; @@ -609,6 +639,8 @@ void packetmath_real() { CHECK_CWISE1_EXACT_IF(PacketTraits::HasCeil, numext::ceil, internal::pceil); CHECK_CWISE1_EXACT_IF(PacketTraits::HasFloor, numext::floor, internal::pfloor); CHECK_CWISE1_EXACT_IF(PacketTraits::HasRint, numext::rint, internal::print); + + packetmath_boolean_mask_ops_real<Scalar,Packet>(); // Rounding edge cases. if (PacketTraits::HasRound || PacketTraits::HasCeil || PacketTraits::HasFloor || PacketTraits::HasRint) { |