From a3b300f1af7b2bb646c9e64162630ac164802ec8 Mon Sep 17 00:00:00 2001 From: Antonio Sanchez Date: Mon, 23 Nov 2020 16:11:01 -0800 Subject: Implement missing AVX half ops. Minimal implementation of AVX `Eigen::half` ops to bring in line with `bfloat16`. Allows `packetmath_13` to pass. Also adjusted `bfloat16` packet traits to match the supported set of ops (e.g. Bessel is not actually implemented). --- test/packetmath.cpp | 27 ++++++++++++--------------- 1 file changed, 12 insertions(+), 15 deletions(-) (limited to 'test') diff --git a/test/packetmath.cpp b/test/packetmath.cpp index ae21dda5c..d52f997dc 100644 --- a/test/packetmath.cpp +++ b/test/packetmath.cpp @@ -556,7 +556,7 @@ void packetmath_real() { VERIFY((numext::isnan)(data2[0])); // TODO(rmlarsen): Re-enable for bfloat16. if (!internal::is_same::value) { - VERIFY_IS_EQUAL(std::exp(small), data2[1]); + VERIFY_IS_APPROX(std::exp(small), data2[1]); } data1[0] = -small; @@ -564,21 +564,21 @@ void packetmath_real() { h.store(data2, internal::pexp(h.load(data1))); // TODO(rmlarsen): Re-enable for bfloat16. if (!internal::is_same::value) { - VERIFY_IS_EQUAL(std::exp(-small), data2[0]); + VERIFY_IS_APPROX(std::exp(-small), data2[0]); } VERIFY_IS_EQUAL(std::exp(Scalar(0)), data2[1]); data1[0] = (std::numeric_limits::min)(); data1[1] = -(std::numeric_limits::min)(); h.store(data2, internal::pexp(h.load(data1))); - VERIFY_IS_EQUAL(std::exp((std::numeric_limits::min)()), data2[0]); - VERIFY_IS_EQUAL(std::exp(-(std::numeric_limits::min)()), data2[1]); + VERIFY_IS_APPROX(std::exp((std::numeric_limits::min)()), data2[0]); + VERIFY_IS_APPROX(std::exp(-(std::numeric_limits::min)()), data2[1]); data1[0] = std::numeric_limits::denorm_min(); data1[1] = -std::numeric_limits::denorm_min(); h.store(data2, internal::pexp(h.load(data1))); - VERIFY_IS_EQUAL(std::exp(std::numeric_limits::denorm_min()), data2[0]); - VERIFY_IS_EQUAL(std::exp(-std::numeric_limits::denorm_min()), data2[1]); + VERIFY_IS_APPROX(std::exp(std::numeric_limits::denorm_min()), data2[0]); + VERIFY_IS_APPROX(std::exp(-std::numeric_limits::denorm_min()), data2[1]); } if (PacketTraits::HasTanh) { @@ -618,7 +618,7 @@ void packetmath_real() { test::packet_helper h; h.store(data2, internal::plog(h.load(data1))); VERIFY((numext::isnan)(data2[0])); - VERIFY_IS_EQUAL(std::log(std::numeric_limits::epsilon()), data2[1]); + VERIFY_IS_APPROX(std::log(std::numeric_limits::epsilon()), data2[1]); data1[0] = -std::numeric_limits::epsilon(); data1[1] = Scalar(0); @@ -629,7 +629,7 @@ void packetmath_real() { data1[0] = (std::numeric_limits::min)(); data1[1] = -(std::numeric_limits::min)(); h.store(data2, internal::plog(h.load(data1))); - VERIFY_IS_EQUAL(std::log((std::numeric_limits::min)()), data2[0]); + VERIFY_IS_APPROX(std::log((std::numeric_limits::min)()), data2[0]); VERIFY((numext::isnan)(data2[1])); // Note: 32-bit arm always flushes denorms to zero. @@ -672,8 +672,10 @@ void packetmath_real() { VERIFY((numext::isnan)(data2[0])); VERIFY((numext::isnan)(data2[1])); } - // TODO(rmlarsen): Re-enable for bfloat16. - if (PacketTraits::HasCos && !internal::is_same::value) { + // TODO(rmlarsen): Re-enable for half and bfloat16. + if (PacketTraits::HasCos + && !internal::is_same::value + && !internal::is_same::value) { test::packet_helper h; for (Scalar k = Scalar(1); k < Scalar(10000) / std::numeric_limits::epsilon(); k *= Scalar(2)) { for (int k1 = 0; k1 <= 1; ++k1) { @@ -1074,12 +1076,7 @@ EIGEN_DECLARE_TEST(packetmath) { CALL_SUBTEST_10(test::runner::run()); CALL_SUBTEST_11(test::runner >::run()); CALL_SUBTEST_12(test::runner >::run()); -#if defined(EIGEN_VECTORIZE_AVX) - // AVX half packets not fully implemented. - CALL_SUBTEST_13((packetmath::type>())); -#else CALL_SUBTEST_13(test::runner::run()); -#endif CALL_SUBTEST_14((packetmath::type>())); CALL_SUBTEST_15(test::runner::run()); g_first_pass = false; -- cgit v1.2.3