packetmath.cpp File Reference

Classes

struct  pcast_array< SrcPacket, TgtPacket, 1, TgtCoeffRatio >
 
struct  pcast_array< SrcPacket, TgtPacket, 2, 1 >
 
struct  pcast_array< SrcPacket, TgtPacket, 4, 1 >
 
struct  pcast_array< SrcPacket, TgtPacket, 8, 1 >
 
struct  test_cast_helper< SrcPacket, TgtPacket, SrcCoeffRatio, TgtCoeffRatio, false >
 
struct  test_cast_helper< SrcPacket, TgtPacket, SrcCoeffRatio, TgtCoeffRatio, true >
 
struct  test_cast< SrcPacket, TgtPacket >
 
struct  test_cast_runner< SrcPacket, TgtScalar, TgtPacket, true, false >
 
struct  test_cast_runner< SrcPacket, TgtScalar, TgtPacket, true, true >
 
struct  test_cast_runner< SrcPacket, TgtScalar, TgtPacket, false, false >
 
struct  packetmath_pcast_ops_runner< Scalar, Packet, EnableIf >
 
struct  packetmath_pcast_ops_runner< Scalar, Packet, std::enable_if_t< NumTraits< Scalar >::IsComplex > >
 
struct  packetmath_boolean_mask_ops_notcomplex_test< Scalar, Packet, EnableIf >
 
struct  packetmath_boolean_mask_ops_notcomplex_test< Scalar, Packet, std::enable_if_t< internal::packet_traits< Scalar >::HasCmp &&!internal::is_same< Scalar, bool >::value > >
 
struct  packetmath_minus_zero_add_test< Scalar, Packet, EnableIf >
 
struct  packetmath_minus_zero_add_test< Scalar, Packet, std::enable_if_t<!NumTraits< Scalar >::IsInteger > >
 
struct  eigen_optimization_barrier_test< Packet, EnableIf >
 
struct  eigen_optimization_barrier_test< Packet, std::enable_if_t<!NumTraits< Packet >::IsComplex &&!internal::is_same< Packet, Eigen::half >::value &&!internal::is_same< Packet, Eigen::bfloat16 >::value > >
 
struct  negate_test_impl< Scalar, Packet, HasNegate >
 
struct  negate_test_impl< Scalar, Packet, false >
 
struct  exp_complex_test_impl< Scalar, Packet, HasExp >
 
struct  exp_complex_test_impl< Scalar, Packet, false >
 
struct  Eigen::test::runall< Scalar, PacketType, false, false >
 
struct  Eigen::test::runall< Scalar, PacketType, false, true >
 
struct  Eigen::test::runall< Scalar, PacketType, true, false >
 

Namespaces

 Eigen
 Namespace containing all symbols from the Eigen library.
 
 Eigen::test
 

Macros

#define CREATE_FUNCTOR(Name, Func)
 
#define CAST_CHECK_CWISE1_IF(COND, REFOP, POP, SCALAR, REFTYPE)
 

Functions

template<typename T >
T REF_ADD (const T &a, const T &b)
 
template<typename T >
T REF_SUB (const T &a, const T &b)
 
template<typename T >
T REF_MUL (const T &a, const T &b)
 
template<typename T >
T REF_MADD (const T &a, const T &b, const T &c)
 
template<typename T >
T REF_MSUB (const T &a, const T &b, const T &c)
 
template<typename T >
T REF_NMADD (const T &a, const T &b, const T &c)
 
template<typename T >
T REF_NMSUB (const T &a, const T &b, const T &c)
 
template<typename T >
T REF_DIV (const T &a, const T &b)
 
template<typename T >
T REF_RECIPROCAL (const T &a)
 
template<typename T >
T REF_ABS_DIFF (const T &a, const T &b)
 
template<>
bool REF_ADD (const bool &a, const bool &b)
 
template<>
bool REF_SUB (const bool &a, const bool &b)
 
template<>
bool REF_MUL (const bool &a, const bool &b)
 
template<>
bool REF_MADD (const bool &a, const bool &b, const bool &c)
 
template<typename T >
T REF_FREXP (const T &x, T &exp)
 
template<typename T >
T REF_LDEXP (const T &x, const T &exp)
 
template<typename Scalar , typename Packet >
void packetmath_boolean_mask_ops ()
 
template<typename Scalar , typename Packet >
void packetmath_boolean_mask_ops_real ()
 
template<typename Scalar , typename Packet >
void negate_test (Scalar *data1, Scalar *data2, Scalar *ref, int size)
 
template<typename Scalar , typename Packet >
void nmsub_test (Scalar *data1, Scalar *data2, Scalar *ref, int size)
 
template<typename Scalar , typename Packet >
void packetmath ()
 
template<typename Scalar >
Scalar log2 (Scalar x)
 
 CREATE_FUNCTOR (psqrt_functor, internal::psqrt)
 
 CREATE_FUNCTOR (prsqrt_functor, internal::prsqrt)
 
template<bool Cond, typename Scalar , typename Packet , typename RefFunctorT , typename FunctorT >
void packetmath_test_IEEE_corner_cases (const RefFunctorT &ref_fun, const FunctorT &fun)
 
template<typename Scalar , typename Packet >
void packetmath_real ()
 
template<typename Scalar >
Scalar propagate_nan_max (const Scalar &a, const Scalar &b)
 
template<typename Scalar >
Scalar propagate_nan_min (const Scalar &a, const Scalar &b)
 
template<typename Scalar >
Scalar propagate_number_max (const Scalar &a, const Scalar &b)
 
template<typename Scalar >
Scalar propagate_number_min (const Scalar &a, const Scalar &b)
 
template<typename Scalar , typename Packet >
void packetmath_notcomplex ()
 
template<typename Scalar , typename Packet , bool ConjLhs, bool ConjRhs>
void test_conj_helper (Scalar *data1, Scalar *data2, Scalar *ref, Scalar *pval)
 
template<typename Scalar , typename Packet >
void exp_complex_test (Scalar *data1, Scalar *data2, Scalar *ref, int size)
 
template<typename Scalar , typename Packet >
void packetmath_complex ()
 
template<typename Scalar , typename Packet >
void packetmath_scatter_gather ()
 
 EIGEN_DECLARE_TEST (packetmath)
 

Macro Definition Documentation

◆ CAST_CHECK_CWISE1_IF

#define CAST_CHECK_CWISE1_IF (   COND,
  REFOP,
  POP,
  SCALAR,
  REFTYPE 
)
Value:
if (COND) { \
test::packet_helper<COND, Packet> h; \
for (int i = 0; i < PacketSize; ++i) ref[i] = SCALAR(REFOP(static_cast<REFTYPE>(data1[i]))); \
h.store(data2, POP(h.load(data1))); \
VERIFY(test::areApprox(ref, data2, PacketSize) && #POP); \
}
int i
Definition: BiCGSTAB_step_by_step.cpp:9
bool areApprox(const Scalar *a, const Scalar *b, int size)
Definition: packetmath_test_shared.h:71

◆ CREATE_FUNCTOR

#define CREATE_FUNCTOR (   Name,
  Func 
)
Value:
struct Name { \
template <typename T> \
T operator()(const T& val) const { \
return Func(val); \
} \
}
val
Definition: calibrate.py:119

Function Documentation

◆ CREATE_FUNCTOR() [1/2]

CREATE_FUNCTOR ( prsqrt_functor  ,
internal::prsqrt   
)

◆ CREATE_FUNCTOR() [2/2]

CREATE_FUNCTOR ( psqrt_functor  ,
internal::psqrt   
)

◆ EIGEN_DECLARE_TEST()

EIGEN_DECLARE_TEST ( packetmath  )
1731  {
1732  g_first_pass = true;
1733  for (int i = 0; i < g_repeat; i++) {
1744  CALL_SUBTEST_11(test::runner<std::complex<float>>::run());
1745  CALL_SUBTEST_12(test::runner<std::complex<double>>::run());
1749  g_first_pass = false;
1750  }
1751 }
static int g_repeat
Definition: main.h:191
void packetmath()
Definition: packetmath.cpp:463
bool g_first_pass
Definition: packetmath_test_shared.h:19
#define CALL_SUBTEST_6(FUNC)
Definition: split_test_helper.h:34
#define CALL_SUBTEST_3(FUNC)
Definition: split_test_helper.h:16
#define CALL_SUBTEST_1(FUNC)
Definition: split_test_helper.h:4
#define CALL_SUBTEST_13(FUNC)
Definition: split_test_helper.h:76
#define CALL_SUBTEST_14(FUNC)
Definition: split_test_helper.h:82
#define CALL_SUBTEST_8(FUNC)
Definition: split_test_helper.h:46
#define CALL_SUBTEST_5(FUNC)
Definition: split_test_helper.h:28
#define CALL_SUBTEST_11(FUNC)
Definition: split_test_helper.h:64
#define CALL_SUBTEST_12(FUNC)
Definition: split_test_helper.h:70
#define CALL_SUBTEST_2(FUNC)
Definition: split_test_helper.h:10
#define CALL_SUBTEST_7(FUNC)
Definition: split_test_helper.h:40
#define CALL_SUBTEST_15(FUNC)
Definition: split_test_helper.h:88
#define CALL_SUBTEST_4(FUNC)
Definition: split_test_helper.h:22
#define CALL_SUBTEST_9(FUNC)
Definition: split_test_helper.h:52
#define CALL_SUBTEST_10(FUNC)
Definition: split_test_helper.h:58
void run(const string &dir_name, LinearSolver *linear_solver_pt, const unsigned nel_1d, bool mess_up_order)
Definition: two_d_poisson_compare_solvers.cc:317

References CALL_SUBTEST_1, CALL_SUBTEST_10, CALL_SUBTEST_11, CALL_SUBTEST_12, CALL_SUBTEST_13, CALL_SUBTEST_14, CALL_SUBTEST_15, CALL_SUBTEST_2, CALL_SUBTEST_3, CALL_SUBTEST_4, CALL_SUBTEST_5, CALL_SUBTEST_6, CALL_SUBTEST_7, CALL_SUBTEST_8, CALL_SUBTEST_9, g_first_pass, Eigen::g_repeat, i, packetmath(), and run().

◆ exp_complex_test()

template<typename Scalar , typename Packet >
void exp_complex_test ( Scalar data1,
Scalar data2,
Scalar ref,
int  size 
)
1509  {
1511 }
Scalar Scalar int size
Definition: benchVecAdd.cpp:17
static void run(Scalar *data1, Scalar *data2, Scalar *ref, int size)
Definition: packetmath.cpp:1452

References exp_complex_test_impl< Scalar, Packet, HasExp >::run(), and size.

◆ log2()

template<typename Scalar >
Scalar log2 ( Scalar  x)
754  {
755  return Scalar(EIGEN_LOG2E) * std::log(x);
756 }
#define EIGEN_LOG2E
Definition: MathFunctions.h:17
SCALAR Scalar
Definition: bench_gemm.cpp:45
EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC bfloat16 log(const bfloat16 &a)
Definition: BFloat16.h:618
list x
Definition: plotDoE.py:28

References EIGEN_LOG2E, Eigen::bfloat16_impl::log(), and plotDoE::x.

Referenced by array_complex(), array_real(), bench(), calc_overflow_threshold(), packetmath_real(), Eigen::internal::default_digits_impl< T, false, false >::run(), and PSD::setDistributionPhiNormal().

◆ negate_test()

template<typename Scalar , typename Packet >
void negate_test ( Scalar data1,
Scalar data2,
Scalar ref,
int  size 
)
453  {
455 }
static void run_negate(Scalar *data1, Scalar *data2, Scalar *ref, int PacketSize)
Definition: packetmath.cpp:438

References negate_test_impl< Scalar, Packet, HasNegate >::run_negate(), and size.

◆ nmsub_test()

template<typename Scalar , typename Packet >
void nmsub_test ( Scalar data1,
Scalar data2,
Scalar ref,
int  size 
)
458  {
460 }
static void run_nmsub(Scalar *data1, Scalar *data2, Scalar *ref, int PacketSize)
Definition: packetmath.cpp:441

References negate_test_impl< Scalar, Packet, HasNegate >::run_nmsub(), and size.

◆ packetmath()

template<typename Scalar , typename Packet >
void packetmath ( )
463  {
464  typedef internal::packet_traits<Scalar> PacketTraits;
465  const int PacketSize = internal::unpacket_traits<Packet>::size;
466  typedef typename NumTraits<Scalar>::Real RealScalar;
467 
468  if (g_first_pass)
469  std::cerr << "=== Testing packet of type '" << typeid(Packet).name() << "' and scalar type '"
470  << typeid(Scalar).name() << "' and size '" << PacketSize << "' ===\n";
471 
472  const int max_size = PacketSize > 4 ? PacketSize : 4;
473  const int size = PacketSize * max_size;
474  EIGEN_ALIGN_MAX Scalar data1[size];
475  EIGEN_ALIGN_MAX Scalar data2[size];
476  EIGEN_ALIGN_MAX Scalar data3[size];
478  RealScalar refvalue = RealScalar(0);
479 
482 
483  for (int i = 0; i < size; ++i) {
484  data1[i] = internal::random<Scalar>() / RealScalar(PacketSize);
485  data2[i] = internal::random<Scalar>() / RealScalar(PacketSize);
486  refvalue = (std::max)(refvalue, numext::abs(data1[i]));
487  }
488 
489  internal::pstore(data2, internal::pload<Packet>(data1));
490  VERIFY(test::areApprox(data1, data2, PacketSize) && "aligned load/store");
491 
492  for (int offset = 0; offset < PacketSize; ++offset) {
493  internal::pstore(data2, internal::ploadu<Packet>(data1 + offset));
494  VERIFY(test::areApprox(data1 + offset, data2, PacketSize) && "internal::ploadu");
495  }
496 
497  for (int offset = 0; offset < PacketSize; ++offset) {
498  internal::pstoreu(data2 + offset, internal::pload<Packet>(data1));
499  VERIFY(test::areApprox(data1, data2 + offset, PacketSize) && "internal::pstoreu");
500  }
501 
502  for (int M = 0; M < PacketSize; ++M) {
503  for (int N = 0; N <= PacketSize; ++N) {
504  for (int j = 0; j < size; ++j) {
505  data1[j] = internal::random<Scalar>() / RealScalar(PacketSize);
506  data2[j] = internal::random<Scalar>() / RealScalar(PacketSize);
507  refvalue = (std::max)(refvalue, numext::abs(data1[j]));
508  }
509 
510  if (M == 0) {
511  internal::pstore_partial(data2, internal::pload_partial<Packet>(data1, N), N);
512  VERIFY(test::areApprox(data1, data2, N) && "aligned loadN/storeN");
513 
514  for (int offset = 0; offset < PacketSize; ++offset) {
515  internal::pstore_partial(data2, internal::ploadu_partial<Packet>(data1 + offset, N), N);
516  VERIFY(test::areApprox(data1 + offset, data2, N) && "internal::ploadu_partial");
517  }
518 
519  for (int offset = 0; offset < PacketSize; ++offset) {
520  internal::pstoreu_partial(data2 + offset, internal::pload_partial<Packet>(data1, N), N);
521  VERIFY(test::areApprox(data1, data2 + offset, N) && "internal::pstoreu_partial");
522  }
523  }
524 
525  if (N + M > PacketSize) continue; // Don't read or write past end of Packet
526 
527  internal::pstore_partial(data2, internal::pload_partial<Packet>(data1, N, M), N, M);
528  VERIFY(test::areApprox(data1, data2, N) && "aligned offset loadN/storeN");
529  }
530  }
531 
532  if (internal::unpacket_traits<Packet>::masked_load_available) {
533  test::packet_helper<internal::unpacket_traits<Packet>::masked_load_available, Packet> h;
534  unsigned long long max_umask = (0x1ull << PacketSize);
535 
536  for (int offset = 0; offset < PacketSize; ++offset) {
537  for (unsigned long long umask = 0; umask < max_umask; ++umask) {
538  h.store(data2, h.load(data1 + offset, umask));
539  for (int k = 0; k < PacketSize; ++k) data3[k] = ((umask & (0x1ull << k)) >> k) ? data1[k + offset] : Scalar(0);
540  VERIFY(test::areApprox(data3, data2, PacketSize) && "internal::ploadu masked");
541  }
542  }
543  }
544 
545  if (internal::unpacket_traits<Packet>::masked_store_available) {
546  test::packet_helper<internal::unpacket_traits<Packet>::masked_store_available, Packet> h;
547  unsigned long long max_umask = (0x1ull << PacketSize);
548 
549  for (int offset = 0; offset < PacketSize; ++offset) {
550  for (unsigned long long umask = 0; umask < max_umask; ++umask) {
551  internal::pstore(data2, internal::pset1<Packet>(Scalar(0)));
552  h.store(data2, h.loadu(data1 + offset), umask);
553  for (int k = 0; k < PacketSize; ++k) data3[k] = ((umask & (0x1ull << k)) >> k) ? data1[k + offset] : Scalar(0);
554  VERIFY(test::areApprox(data3, data2, PacketSize) && "internal::pstoreu masked");
555  }
556  }
557  }
558 
559  VERIFY((!PacketTraits::Vectorizable) || PacketTraits::HasAdd);
560  VERIFY((!PacketTraits::Vectorizable) || PacketTraits::HasSub);
561  VERIFY((!PacketTraits::Vectorizable) || PacketTraits::HasMul);
562 
563  CHECK_CWISE2_IF(PacketTraits::HasAdd, REF_ADD, internal::padd);
564  CHECK_CWISE2_IF(PacketTraits::HasSub, REF_SUB, internal::psub);
565  CHECK_CWISE2_IF(PacketTraits::HasMul, REF_MUL, internal::pmul);
566  CHECK_CWISE2_IF(PacketTraits::HasDiv, REF_DIV, internal::pdiv);
567 
568  negate_test<Scalar, Packet>(data1, data2, ref, PacketSize);
569  CHECK_CWISE1_IF(PacketTraits::HasReciprocal, REF_RECIPROCAL, internal::preciprocal);
571  CHECK_CWISE1_IF(PacketTraits::HasSign, numext::sign, internal::psign);
572 
573  for (int offset = 0; offset < 3; ++offset) {
574  for (int i = 0; i < PacketSize; ++i) ref[i] = data1[offset];
575  internal::pstore(data2, internal::pset1<Packet>(data1[offset]));
576  VERIFY(test::areApprox(ref, data2, PacketSize) && "internal::pset1");
577  }
578 
579  {
580  for (int i = 0; i < PacketSize * 4; ++i) ref[i] = data1[i / PacketSize];
581  Packet A0, A1, A2, A3;
582  internal::pbroadcast4<Packet>(data1, A0, A1, A2, A3);
583  internal::pstore(data2 + 0 * PacketSize, A0);
584  internal::pstore(data2 + 1 * PacketSize, A1);
585  internal::pstore(data2 + 2 * PacketSize, A2);
586  internal::pstore(data2 + 3 * PacketSize, A3);
587  VERIFY(test::areApprox(ref, data2, 4 * PacketSize) && "internal::pbroadcast4");
588  }
589 
590  {
591  for (int i = 0; i < PacketSize * 2; ++i) ref[i] = data1[i / PacketSize];
592  Packet A0, A1;
593  internal::pbroadcast2<Packet>(data1, A0, A1);
594  internal::pstore(data2 + 0 * PacketSize, A0);
595  internal::pstore(data2 + 1 * PacketSize, A1);
596  VERIFY(test::areApprox(ref, data2, 2 * PacketSize) && "internal::pbroadcast2");
597  }
598 
599  VERIFY(internal::isApprox(data1[0], internal::pfirst(internal::pload<Packet>(data1))) && "internal::pfirst");
600 
601  if (PacketSize > 1) {
602  // apply different offsets to check that ploaddup is robust to unaligned inputs
603  for (int offset = 0; offset < 4; ++offset) {
604  for (int i = 0; i < PacketSize / 2; ++i) ref[2 * i + 0] = ref[2 * i + 1] = data1[offset + i];
605  internal::pstore(data2, internal::ploaddup<Packet>(data1 + offset));
606  VERIFY(test::areApprox(ref, data2, PacketSize) && "ploaddup");
607  }
608  }
609 
610  if (PacketSize > 2) {
611  // apply different offsets to check that ploadquad is robust to unaligned inputs
612  for (int offset = 0; offset < 4; ++offset) {
613  for (int i = 0; i < PacketSize / 4; ++i)
614  ref[4 * i + 0] = ref[4 * i + 1] = ref[4 * i + 2] = ref[4 * i + 3] = data1[offset + i];
615  internal::pstore(data2, internal::ploadquad<Packet>(data1 + offset));
616  VERIFY(test::areApprox(ref, data2, PacketSize) && "ploadquad");
617  }
618  }
619 
620  ref[0] = Scalar(0);
621  for (int i = 0; i < PacketSize; ++i) ref[0] += data1[i];
622  VERIFY(test::isApproxAbs(ref[0], internal::predux(internal::pload<Packet>(data1)), refvalue) && "internal::predux");
623 
624  if (!internal::is_same<Packet, typename internal::unpacket_traits<Packet>::half>::value) {
625  int HalfPacketSize = PacketSize > 4 ? PacketSize / 2 : PacketSize;
626  for (int i = 0; i < HalfPacketSize; ++i) ref[i] = Scalar(0);
627  for (int i = 0; i < PacketSize; ++i) ref[i % HalfPacketSize] += data1[i];
628  internal::pstore(data2, internal::predux_half_dowto4(internal::pload<Packet>(data1)));
629  VERIFY(test::areApprox(ref, data2, HalfPacketSize) && "internal::predux_half_dowto4");
630  }
631 
632  // Avoid overflows.
635  Scalar limit =
636  static_cast<Scalar>(std::pow(static_cast<double>(numext::real(NumTraits<Scalar>::highest())),
637  1.0 / static_cast<double>(Eigen::internal::unpacket_traits<Packet>::size)));
638  for (int i = 0; i < PacketSize; ++i) {
639  data1[i] = internal::random<Scalar>(-limit, limit);
640  }
641  }
642  ref[0] = Scalar(1);
643  for (int i = 0; i < PacketSize; ++i) ref[0] = REF_MUL(ref[0], data1[i]);
644  VERIFY(internal::isApprox(ref[0], internal::predux_mul(internal::pload<Packet>(data1))) && "internal::predux_mul");
645 
646  for (int i = 0; i < PacketSize; ++i) ref[i] = data1[PacketSize - i - 1];
647  internal::pstore(data2, internal::preverse(internal::pload<Packet>(data1)));
648  VERIFY(test::areApprox(ref, data2, PacketSize) && "internal::preverse");
649 
650  internal::PacketBlock<Packet> kernel;
651  for (int i = 0; i < PacketSize; ++i) {
652  kernel.packet[i] = internal::pload<Packet>(data1 + i * PacketSize);
653  }
654  ptranspose(kernel);
655  for (int i = 0; i < PacketSize; ++i) {
656  internal::pstore(data2, kernel.packet[i]);
657  for (int j = 0; j < PacketSize; ++j) {
658  VERIFY(test::isApproxAbs(data2[j], data1[i + j * PacketSize], refvalue) && "ptranspose");
659  }
660  }
661 
662  // GeneralBlockPanelKernel also checks PacketBlock<Packet,(PacketSize%4)==0?4:PacketSize>;
663  if (PacketSize > 4 && PacketSize % 4 == 0) {
664  internal::PacketBlock<Packet, PacketSize % 4 == 0 ? 4 : PacketSize> kernel2;
665  for (int i = 0; i < 4; ++i) {
666  kernel2.packet[i] = internal::pload<Packet>(data1 + i * PacketSize);
667  }
668  ptranspose(kernel2);
669  int data_counter = 0;
670  for (int i = 0; i < PacketSize; ++i) {
671  for (int j = 0; j < 4; ++j) {
672  data2[data_counter++] = data1[j * PacketSize + i];
673  }
674  }
675  for (int i = 0; i < 4; ++i) {
676  internal::pstore(data3, kernel2.packet[i]);
677  for (int j = 0; j < PacketSize; ++j) {
678  VERIFY(test::isApproxAbs(data3[j], data2[i * PacketSize + j], refvalue) && "ptranspose");
679  }
680  }
681  }
682 
683  if (PacketTraits::HasBlend) {
684  Packet thenPacket = internal::pload<Packet>(data1);
685  Packet elsePacket = internal::pload<Packet>(data2);
686  EIGEN_ALIGN_MAX internal::Selector<PacketSize> selector;
687  for (int i = 0; i < PacketSize; ++i) {
688  selector.select[i] = i;
689  }
690 
691  Packet blend = internal::pblend(selector, thenPacket, elsePacket);
692  EIGEN_ALIGN_MAX Scalar result[size];
693  internal::pstore(result, blend);
694  for (int i = 0; i < PacketSize; ++i) {
695  VERIFY(test::isApproxAbs(result[i], (selector.select[i] ? data1[i] : data2[i]), refvalue));
696  }
697  }
698 
699  {
700  for (int i = 0; i < PacketSize; ++i) {
701  // "if" mask
702  // Note: it's UB to load 0xFF directly into a `bool`.
703  uint8_t v =
704  internal::random<bool>() ? (std::is_same<Scalar, bool>::value ? static_cast<uint8_t>(true) : 0xff) : 0;
705  // Avoid strict aliasing violation by using memset.
706  memset(static_cast<void*>(data1 + i), v, sizeof(Scalar));
707  // "then" packet
708  data1[i + PacketSize] = internal::random<Scalar>();
709  // "else" packet
710  data1[i + 2 * PacketSize] = internal::random<Scalar>();
711  }
713  }
714 
715  for (int i = 0; i < size; ++i) {
716  data1[i] = internal::random<Scalar>();
717  }
722 
723  packetmath_boolean_mask_ops<Scalar, Packet>();
726 
727  for (int i = 0; i < size; ++i) {
728  data1[i] = numext::abs(internal::random<Scalar>());
729  }
730  CHECK_CWISE1_IF(PacketTraits::HasSqrt, numext::sqrt, internal::psqrt);
731  CHECK_CWISE1_IF(PacketTraits::HasRsqrt, numext::rsqrt, internal::prsqrt);
734  nmsub_test<Scalar, Packet>(data1, data2, ref, PacketSize);
735  }
736 
737  // For pmsub, pnmadd, the values can cancel each other to become near zero,
738  // which can lead to very flaky tests. Here we ensure the signs are such that
739  // they do not cancel.
740  for (int i = 0; i < PacketSize; ++i) {
741  data1[i] = numext::abs(internal::random<Scalar>());
742  data1[i + PacketSize] = numext::abs(internal::random<Scalar>());
743  data1[i + 2 * PacketSize] = Scalar(0) - numext::abs(internal::random<Scalar>());
744  }
748  }
749 }
AnnoyingScalar abs(const AnnoyingScalar &x)
Definition: AnnoyingScalar.h:135
AnnoyingScalar conj(const AnnoyingScalar &x)
Definition: AnnoyingScalar.h:133
AnnoyingScalar sqrt(const AnnoyingScalar &x)
Definition: AnnoyingScalar.h:134
Array< int, Dynamic, 1 > v
Definition: Array_initializer_list_vector_cxx11.cpp:1
#define EIGEN_ALIGN_MAX
Definition: ConfigureVectorization.h:146
EIGEN_ALWAYS_INLINE Packet2cf padd(Packet2cf &a, std::complex< float > &b)
Definition: MatrixVectorProduct.h:1277
Matrix< RealScalar, Dynamic, Dynamic > M
Definition: bench_gemm.cpp:50
NumTraits< Scalar >::Real RealScalar
Definition: bench_gemm.cpp:46
internal::packet_traits< Scalar >::type Packet
Definition: benchmark-blocking-sizes.cpp:54
The matrix class, also used for vectors and row-vectors.
Definition: Eigen/Eigen/src/Core/Matrix.h:186
@ N
Definition: constructor.cpp:22
float real
Definition: datatypes.h:10
#define max(a, b)
Definition: datatypes.h:23
char char char int int * k
Definition: level2_impl.h:374
#define VERIFY(a)
Definition: main.h:362
EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC bfloat16 pow(const bfloat16 &a, const bfloat16 &b)
Definition: BFloat16.h:625
EIGEN_STRONG_INLINE Packet2cf pconj(const Packet2cf &a)
Definition: AltiVec/Complex.h:268
EIGEN_DEVICE_FUNC void pstore_partial(Scalar *to, const Packet &from, const Index n, const Index offset=0)
Definition: GenericPacketMath.h:899
EIGEN_STRONG_INLINE Packet8f pzero(const Packet8f &)
Definition: AVX/PacketMath.h:774
EIGEN_STRONG_INLINE void ptranspose(PacketBlock< Packet2cf, 2 > &kernel)
Definition: AltiVec/Complex.h:339
EIGEN_DEVICE_FUNC Packet pdiv(const Packet &a, const Packet &b)
Definition: GenericPacketMath.h:368
EIGEN_STRONG_INLINE Packet4i pblend(const Selector< 4 > &ifPacket, const Packet4i &thenPacket, const Packet4i &elsePacket)
Definition: AltiVec/PacketMath.h:3075
EIGEN_STRONG_INLINE Packet8h por(const Packet8h &a, const Packet8h &b)
Definition: AVX/PacketMath.h:2309
EIGEN_STRONG_INLINE Packet2cf preverse(const Packet2cf &a)
Definition: AltiVec/Complex.h:303
EIGEN_STRONG_INLINE Packet4f pmadd(const Packet4f &a, const Packet4f &b, const Packet4f &c)
Definition: AltiVec/PacketMath.h:1218
EIGEN_STRONG_INLINE Packet4cf pmul(const Packet4cf &a, const Packet4cf &b)
Definition: AVX/Complex.h:88
EIGEN_DEVICE_FUNC Packet preciprocal(const Packet &a)
Definition: GenericPacketMath.h:1433
EIGEN_DEVICE_FUNC bool isApprox(const Scalar &x, const Scalar &y, const typename NumTraits< Scalar >::Real &precision=NumTraits< Scalar >::dummy_precision())
Definition: MathFunctions.h:1923
EIGEN_DEVICE_FUNC void pstoreu_partial(Scalar *to, const Packet &from, const Index n, const Index offset=0)
Definition: GenericPacketMath.h:917
EIGEN_STRONG_INLINE bfloat16 pfirst(const Packet8bf &a)
Definition: AltiVec/PacketMath.h:2418
EIGEN_DEVICE_FUNC void pstore(Scalar *to, const Packet &from)
Definition: GenericPacketMath.h:891
EIGEN_DEVICE_FUNC unpacket_traits< Packet >::type predux(const Packet &a)
Definition: GenericPacketMath.h:1232
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet4c predux_half_dowto4(const Packet8c &a)
Definition: NEON/PacketMath.h:3635
EIGEN_STRONG_INLINE Packet4f psqrt(const Packet4f &a)
Definition: LSX/PacketMath.h:2176
EIGEN_STRONG_INLINE Packet4f pmsub(const Packet4f &a, const Packet4f &b, const Packet4f &c)
Definition: LSX/PacketMath.h:819
EIGEN_DEVICE_FUNC void pstoreu(Scalar *to, const Packet &from)
Definition: GenericPacketMath.h:911
EIGEN_STRONG_INLINE Packet8h pand(const Packet8h &a, const Packet8h &b)
Definition: AVX/PacketMath.h:2319
EIGEN_STRONG_INLINE Packet8h pxor(const Packet8h &a, const Packet8h &b)
Definition: AVX/PacketMath.h:2315
EIGEN_STRONG_INLINE Packet4f pnmadd(const Packet4f &a, const Packet4f &b, const Packet4f &c)
Definition: LSX/PacketMath.h:827
EIGEN_STRONG_INLINE Packet4f pselect(const Packet4f &mask, const Packet4f &a, const Packet4f &b)
Definition: AltiVec/PacketMath.h:1474
EIGEN_DEVICE_FUNC Packet psub(const Packet &a, const Packet &b)
Definition: GenericPacketMath.h:337
EIGEN_STRONG_INLINE Packet4f prsqrt(const Packet4f &a)
Definition: LSX/PacketMath.h:2528
EIGEN_DEVICE_FUNC Packet psign(const Packet &a)
Definition: GenericPacketMath.h:1189
EIGEN_DEVICE_FUNC unpacket_traits< Packet >::type predux_mul(const Packet &a)
Definition: GenericPacketMath.h:1238
std::uint8_t uint8_t
Definition: Meta.h:36
EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE T rsqrt(const T &x)
Definition: MathFunctions.h:1327
EIGEN_DONT_INLINE bool isApproxAbs(const Scalar &a, const Scalar &b, const typename NumTraits< Scalar >::Real &refvalue)
Definition: packetmath_test_shared.h:47
squared absolute value
Definition: GlobalFunctions.h:87
double blend(const Vector< double > &x, const Vector< double > &x_c)
Blend function, centred at x_c.
Definition: navier_stokes/navier_stokes_with_singularity/driven_cavity.cc:208
T sign(T x)
Definition: cxx11_tensor_builtins_sycl.cpp:172
string name
Definition: plotDoE.py:33
T REF_SUB(const T &a, const T &b)
Definition: packetmath.cpp:20
T REF_MUL(const T &a, const T &b)
Definition: packetmath.cpp:24
T REF_RECIPROCAL(const T &a)
Definition: packetmath.cpp:48
T REF_MSUB(const T &a, const T &b, const T &c)
Definition: packetmath.cpp:32
T REF_ADD(const T &a, const T &b)
Definition: packetmath.cpp:16
T REF_NMADD(const T &a, const T &b, const T &c)
Definition: packetmath.cpp:36
T REF_MADD(const T &a, const T &b, const T &c)
Definition: packetmath.cpp:28
T REF_DIV(const T &a, const T &b)
Definition: packetmath.cpp:44
#define CHECK_CWISE1_IF(COND, REFOP, POP)
Definition: packetmath_test_shared.h:217
#define CHECK_CWISE3_IF(COND, REFOP, POP)
Definition: packetmath_test_shared.h:253
#define CHECK_CWISE2_IF(COND, REFOP, POP)
Definition: packetmath_test_shared.h:233
#define CHECK_CWISE1(REFOP, POP)
Definition: packetmath_test_shared.h:111
Holds information about the various numeric (i.e. scalar) types allowed by Eigen.
Definition: NumTraits.h:217
Definition: GenericPacketMath.h:134
static void run()
Definition: packetmath.cpp:420
static void run()
Definition: packetmath.cpp:394
static void run()
Definition: packetmath.cpp:254
std::ptrdiff_t j
Definition: tut_arithmetic_redux_minmax.cpp:2
Definition: ZVector/PacketMath.h:50

References abs(), Eigen::test::areApprox(), Global_Parameters::blend(), CHECK_CWISE1, CHECK_CWISE1_IF, CHECK_CWISE2_IF, CHECK_CWISE3_IF, conj(), EIGEN_ALIGN_MAX, g_first_pass, i, Eigen::internal::isApprox(), Eigen::test::isApproxAbs(), j, k, max, N, plotDoE::name, padd(), Eigen::internal::pand(), Eigen::internal::pblend(), Eigen::internal::pconj(), Eigen::internal::pdiv(), Eigen::internal::pfirst(), Eigen::internal::pmadd(), Eigen::internal::pmsub(), Eigen::internal::pmul(), Eigen::internal::pnmadd(), Eigen::internal::por(), Eigen::bfloat16_impl::pow(), Eigen::internal::preciprocal(), Eigen::internal::predux(), Eigen::internal::predux_half_dowto4(), Eigen::internal::predux_mul(), Eigen::internal::preverse(), Eigen::internal::prsqrt(), Eigen::internal::pselect(), Eigen::internal::psign(), Eigen::internal::psqrt(), Eigen::internal::pstore(), Eigen::internal::pstore_partial(), Eigen::internal::pstoreu(), Eigen::internal::pstoreu_partial(), Eigen::internal::psub(), Eigen::internal::ptranspose(), Eigen::internal::pxor(), Eigen::internal::pzero(), REF_ADD(), REF_DIV(), REF_MADD(), REF_MSUB(), REF_MUL(), REF_NMADD(), REF_RECIPROCAL(), REF_SUB(), Eigen::numext::rsqrt(), packetmath_pcast_ops_runner< Scalar, Packet, EnableIf >::run(), packetmath_minus_zero_add_test< Scalar, Packet, EnableIf >::run(), eigen_optimization_barrier_test< Packet, EnableIf >::run(), SYCL::sign(), size, sqrt(), v, Eigen::value, and VERIFY.

Referenced by EIGEN_DECLARE_TEST().

◆ packetmath_boolean_mask_ops()

template<typename Scalar , typename Packet >
void packetmath_boolean_mask_ops ( )
285  {
286  using RealScalar = typename NumTraits<Scalar>::Real;
287  const int PacketSize = internal::unpacket_traits<Packet>::size;
288  const int size = 2 * PacketSize;
289  EIGEN_ALIGN_MAX Scalar data1[size];
290  EIGEN_ALIGN_MAX Scalar data2[size];
292 
293  for (int i = 0; i < size; ++i) {
294  data1[i] = internal::random<Scalar>();
295  }
298  for (int i = 0; i < PacketSize; ++i) {
299  data1[i] = Scalar(RealScalar(i));
300  data1[i + PacketSize] = internal::random<bool>() ? data1[i] : Scalar(0);
301  }
302 
304 
305  // Test (-0) == (0) for signed operations
306  for (int i = 0; i < PacketSize; ++i) {
307  data1[i] = Scalar(-0.0);
308  data1[i + PacketSize] = internal::random<bool>() ? data1[i] : Scalar(0);
309  }
311 
312  // Test NaN
313  for (int i = 0; i < PacketSize; ++i) {
314  data1[i] = NumTraits<Scalar>::quiet_NaN();
315  data1[i + PacketSize] = internal::random<bool>() ? data1[i] : Scalar(0);
316  }
318 }
EIGEN_STRONG_INLINE Packet8h ptrue(const Packet8h &a)
Definition: AVX/PacketMath.h:2263
EIGEN_STRONG_INLINE Packet8h pandnot(const Packet8h &a, const Packet8h &b)
Definition: AVX/PacketMath.h:2323
EIGEN_STRONG_INLINE Packet2cf pcmp_eq(const Packet2cf &a, const Packet2cf &b)
Definition: AltiVec/Complex.h:353

References CHECK_CWISE1, CHECK_CWISE2_IF, EIGEN_ALIGN_MAX, i, Eigen::internal::pandnot(), Eigen::internal::pcmp_eq(), Eigen::internal::ptrue(), and size.

◆ packetmath_boolean_mask_ops_real()

template<typename Scalar , typename Packet >
void packetmath_boolean_mask_ops_real ( )
321  {
322  const int PacketSize = internal::unpacket_traits<Packet>::size;
323  const int size = 2 * PacketSize;
324  EIGEN_ALIGN_MAX Scalar data1[size];
325  EIGEN_ALIGN_MAX Scalar data2[size];
327 
328  for (int i = 0; i < PacketSize; ++i) {
329  data1[i] = internal::random<Scalar>();
330  data1[i + PacketSize] = internal::random<bool>() ? data1[i] : Scalar(0);
331  }
332 
334 
335  // Test (-0) <=/< (0) for signed operations
336  for (int i = 0; i < PacketSize; ++i) {
337  data1[i] = Scalar(-0.0);
338  data1[i + PacketSize] = internal::random<bool>() ? data1[i] : Scalar(0);
339  }
341 
342  // Test NaN
343  for (int i = 0; i < PacketSize; ++i) {
344  data1[i] = NumTraits<Scalar>::quiet_NaN();
345  data1[i + PacketSize] = internal::random<bool>() ? data1[i] : Scalar(0);
346  }
348 }
EIGEN_STRONG_INLINE Packet4f pcmp_lt_or_nan(const Packet4f &a, const Packet4f &b)
Definition: AltiVec/PacketMath.h:1329

References CHECK_CWISE2_IF, EIGEN_ALIGN_MAX, i, Eigen::internal::pcmp_lt_or_nan(), and size.

◆ packetmath_complex()

template<typename Scalar , typename Packet >
void packetmath_complex ( )
1514  {
1515  typedef internal::packet_traits<Scalar> PacketTraits;
1516  typedef typename Scalar::value_type RealScalar;
1517  const int PacketSize = internal::unpacket_traits<Packet>::size;
1518 
1519  const int size = PacketSize * 4;
1520  EIGEN_ALIGN_MAX Scalar data1[PacketSize * 4];
1521  EIGEN_ALIGN_MAX Scalar data2[PacketSize * 4];
1522  EIGEN_ALIGN_MAX Scalar ref[PacketSize * 4];
1523  EIGEN_ALIGN_MAX Scalar pval[PacketSize * 4];
1524  EIGEN_ALIGN_MAX RealScalar realdata[PacketSize * 4];
1525  EIGEN_ALIGN_MAX RealScalar realref[PacketSize * 4];
1526 
1527  for (int i = 0; i < size; ++i) {
1528  data1[i] = internal::random<Scalar>() * Scalar(1e2);
1529  data2[i] = internal::random<Scalar>() * Scalar(1e2);
1530  }
1531 
1532  test_conj_helper<Scalar, Packet, false, false>(data1, data2, ref, pval);
1533  test_conj_helper<Scalar, Packet, false, true>(data1, data2, ref, pval);
1534  test_conj_helper<Scalar, Packet, true, false>(data1, data2, ref, pval);
1535  test_conj_helper<Scalar, Packet, true, true>(data1, data2, ref, pval);
1536 
1537  // Test pcplxflip.
1538  {
1539  for (int i = 0; i < PacketSize; ++i) ref[i] = Scalar(std::imag(data1[i]), std::real(data1[i]));
1540  internal::pstore(pval, internal::pcplxflip(internal::pload<Packet>(data1)));
1541  VERIFY(test::areApprox(ref, pval, PacketSize) && "pcplxflip");
1542  }
1543 
1544  if (PacketTraits::HasSqrt) {
1545  for (int i = 0; i < size; ++i) {
1546  data1[i] = Scalar(internal::random<RealScalar>(), internal::random<RealScalar>());
1547  }
1549  CHECK_CWISE1_IF(PacketTraits::HasSign, numext::sign, internal::psign);
1550 
1551  // Test misc. corner cases.
1552  const RealScalar zero = RealScalar(0);
1553  const RealScalar one = RealScalar(1);
1554  const RealScalar inf = std::numeric_limits<RealScalar>::infinity();
1555  const RealScalar nan = std::numeric_limits<RealScalar>::quiet_NaN();
1556  data1[0] = Scalar(zero, zero);
1557  data1[1] = Scalar(-zero, zero);
1558  data1[2] = Scalar(one, zero);
1559  data1[3] = Scalar(zero, one);
1561  data1[0] = Scalar(-one, zero);
1562  data1[1] = Scalar(zero, -one);
1563  data1[2] = Scalar(one, one);
1564  data1[3] = Scalar(-one, -one);
1566  data1[0] = Scalar(inf, zero);
1567  data1[1] = Scalar(zero, inf);
1568  data1[2] = Scalar(-inf, zero);
1569  data1[3] = Scalar(zero, -inf);
1571  data1[0] = Scalar(inf, inf);
1572  data1[1] = Scalar(-inf, inf);
1573  data1[2] = Scalar(inf, -inf);
1574  data1[3] = Scalar(-inf, -inf);
1576  data1[0] = Scalar(nan, zero);
1577  data1[1] = Scalar(zero, nan);
1578  data1[2] = Scalar(nan, one);
1579  data1[3] = Scalar(one, nan);
1581  data1[0] = Scalar(nan, nan);
1582  data1[1] = Scalar(inf, nan);
1583  data1[2] = Scalar(nan, inf);
1584  data1[3] = Scalar(-inf, nan);
1586  }
1587  if (PacketTraits::HasLog) {
1588  for (int i = 0; i < size; ++i) {
1589  data1[i] = Scalar(internal::random<RealScalar>(), internal::random<RealScalar>());
1590  }
1592 
1593  // Test misc. corner cases.
1594  const RealScalar zero = RealScalar(0);
1595  const RealScalar one = RealScalar(1);
1596  const RealScalar inf = std::numeric_limits<RealScalar>::infinity();
1597  const RealScalar nan = std::numeric_limits<RealScalar>::quiet_NaN();
1598  for (RealScalar x : {zero, one, inf}) {
1599  for (RealScalar y : {zero, one, inf}) {
1600  data1[0] = Scalar(x, y);
1601  data1[1] = Scalar(-x, y);
1602  data1[2] = Scalar(x, -y);
1603  data1[3] = Scalar(-x, -y);
1605  }
1606  }
1607  // Set reference results to nan.
1608  // Some architectures don't handle IEEE edge cases correctly
1609  ref[0] = Scalar(nan, nan);
1610  ref[1] = Scalar(nan, nan);
1611  ref[2] = Scalar(nan, nan);
1612  ref[3] = Scalar(nan, nan);
1613  for (RealScalar x : {zero, one}) {
1614  data1[0] = Scalar(x, nan);
1615  data1[1] = Scalar(-x, nan);
1616  data1[2] = Scalar(nan, x);
1617  data1[3] = Scalar(nan, -x);
1618  for (int j = 0; j < size; j += PacketSize)
1619  internal::pstore(data2 + j, internal::plog(internal::pload<Packet>(data1 + j)));
1620  VERIFY(test::areApprox(ref, data2, 4));
1621  }
1622  data1[0] = Scalar(inf, nan);
1623  data1[1] = Scalar(-inf, nan);
1624  data1[2] = Scalar(nan, inf);
1625  data1[3] = Scalar(nan, -inf);
1627  }
1628  exp_complex_test<Scalar, Packet>(data1, data2, ref, size);
1629 }
AnnoyingScalar imag(const AnnoyingScalar &)
Definition: AnnoyingScalar.h:132
Scalar * y
Definition: level1_cplx_impl.h:128
EIGEN_DECLARE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS Packet plog(const Packet &a)
Definition: GenericPacketMath.h:1103
EIGEN_STRONG_INLINE Packet2cf pcplxflip(const Packet2cf &x)
Definition: LSX/Complex.h:218
const Mdouble inf
Definition: GeneralDefine.h:23
#define CHECK_CWISE1_N(REFOP, POP, N)
Definition: packetmath_test_shared.h:121
#define CHECK_CWISE1_IM1ULP_N(REFOP, POP, N)
Definition: packetmath_test_shared.h:133
EIGEN_DONT_INLINE Scalar zero()
Definition: svd_common.h:232

References Eigen::test::areApprox(), CHECK_CWISE1_IF, CHECK_CWISE1_IM1ULP_N, CHECK_CWISE1_N, EIGEN_ALIGN_MAX, i, imag(), constants::inf, j, Eigen::bfloat16_impl::log(), Eigen::internal::pcplxflip(), Eigen::internal::plog(), Eigen::internal::psign(), Eigen::internal::psqrt(), Eigen::internal::pstore(), SYCL::sign(), size, sqrt(), VERIFY, plotDoE::x, y, and zero().

◆ packetmath_notcomplex()

template<typename Scalar , typename Packet >
void packetmath_notcomplex ( )
1244  {
1245  typedef internal::packet_traits<Scalar> PacketTraits;
1246  const int PacketSize = internal::unpacket_traits<Packet>::size;
1247 
1248  EIGEN_ALIGN_MAX Scalar data1[PacketSize * 4];
1249  EIGEN_ALIGN_MAX Scalar data2[PacketSize * 4];
1250  EIGEN_ALIGN_MAX Scalar ref[PacketSize * 4];
1251 
1252  Array<Scalar, Dynamic, 1>::Map(data1, PacketSize * 4).setRandom();
1253 
1254  VERIFY((!PacketTraits::Vectorizable) || PacketTraits::HasMin);
1255  VERIFY((!PacketTraits::Vectorizable) || PacketTraits::HasMax);
1256 
1257  CHECK_CWISE2_IF(PacketTraits::HasMin, (std::min), internal::pmin);
1258  CHECK_CWISE2_IF(PacketTraits::HasMax, (std::max), internal::pmax);
1259 
1260  CHECK_CWISE2_IF(PacketTraits::HasMin, propagate_number_min, internal::pmin<PropagateNumbers>);
1261  CHECK_CWISE2_IF(PacketTraits::HasMax, propagate_number_max, internal::pmax<PropagateNumbers>);
1263  // Vectorized versions may give a different result in the case of signed int overflow,
1264  // which is undefined behavior (e.g. NEON).
1265  // Also note that unsigned integers with size < sizeof(int) may be implicitly converted to a signed
1266  // int, which can also trigger UB.
1268  for (int i = 0; i < 2 * PacketSize; ++i) {
1269  data1[i] = data1[i] / Scalar(2);
1270  }
1271  }
1272  CHECK_CWISE2_IF(PacketTraits::HasAbsDiff, REF_ABS_DIFF, internal::pabsdiff);
1273 
1274  ref[0] = data1[0];
1275  for (int i = 0; i < PacketSize; ++i) ref[0] = internal::pmin(ref[0], data1[i]);
1276  VERIFY(internal::isApprox(ref[0], internal::predux_min(internal::pload<Packet>(data1))) && "internal::predux_min");
1277  ref[0] = data1[0];
1278  for (int i = 0; i < PacketSize; ++i) ref[0] = internal::pmax(ref[0], data1[i]);
1279  VERIFY(internal::isApprox(ref[0], internal::predux_max(internal::pload<Packet>(data1))) && "internal::predux_max");
1280 
1281  for (int i = 0; i < PacketSize; ++i) ref[i] = data1[0] + Scalar(i);
1282  internal::pstore(data2, internal::plset<Packet>(data1[0]));
1283  VERIFY(test::areApprox(ref, data2, PacketSize) && "internal::plset");
1284 
1285  {
1286  unsigned char* data1_bits = reinterpret_cast<unsigned char*>(data1);
1287  // predux_all - not needed yet
1288  // for (unsigned int i=0; i<PacketSize*sizeof(Scalar); ++i) data1_bits[i] = 0xff;
1289  // VERIFY(internal::predux_all(internal::pload<Packet>(data1)) && "internal::predux_all(1111)");
1290  // for(int k=0; k<PacketSize; ++k)
1291  // {
1292  // for (unsigned int i=0; i<sizeof(Scalar); ++i) data1_bits[k*sizeof(Scalar)+i] = 0x0;
1293  // VERIFY( (!internal::predux_all(internal::pload<Packet>(data1))) && "internal::predux_all(0101)");
1294  // for (unsigned int i=0; i<sizeof(Scalar); ++i) data1_bits[k*sizeof(Scalar)+i] = 0xff;
1295  // }
1296 
1297  // predux_any
1298  for (unsigned int i = 0; i < PacketSize * sizeof(Scalar); ++i) data1_bits[i] = 0x0;
1299  VERIFY((!internal::predux_any(internal::pload<Packet>(data1))) && "internal::predux_any(0000)");
1300  for (int k = 0; k < PacketSize; ++k) {
1301  for (unsigned int i = 0; i < sizeof(Scalar); ++i) data1_bits[k * sizeof(Scalar) + i] = 0xff;
1302  VERIFY(internal::predux_any(internal::pload<Packet>(data1)) && "internal::predux_any(0101)");
1303  for (unsigned int i = 0; i < sizeof(Scalar); ++i) data1_bits[k * sizeof(Scalar) + i] = 0x00;
1304  }
1305  }
1306 
1307  // Test NaN propagation.
1309  // Test reductions with no NaNs.
1310  ref[0] = data1[0];
1311  for (int i = 0; i < PacketSize; ++i) ref[0] = internal::pmin<PropagateNumbers>(ref[0], data1[i]);
1312  VERIFY(internal::isApprox(ref[0], internal::predux_min<PropagateNumbers>(internal::pload<Packet>(data1))) &&
1313  "internal::predux_min<PropagateNumbers>");
1314  ref[0] = data1[0];
1315  for (int i = 0; i < PacketSize; ++i) ref[0] = internal::pmin<PropagateNaN>(ref[0], data1[i]);
1316  VERIFY(internal::isApprox(ref[0], internal::predux_min<PropagateNaN>(internal::pload<Packet>(data1))) &&
1317  "internal::predux_min<PropagateNaN>");
1318  ref[0] = data1[0];
1319  for (int i = 0; i < PacketSize; ++i) ref[0] = internal::pmax<PropagateNumbers>(ref[0], data1[i]);
1320  VERIFY(internal::isApprox(ref[0], internal::predux_max<PropagateNumbers>(internal::pload<Packet>(data1))) &&
1321  "internal::predux_max<PropagateNumbers>");
1322  ref[0] = data1[0];
1323  for (int i = 0; i < PacketSize; ++i) ref[0] = internal::pmax<PropagateNaN>(ref[0], data1[i]);
1324  VERIFY(internal::isApprox(ref[0], internal::predux_max<PropagateNaN>(internal::pload<Packet>(data1))) &&
1325  "internal::predux_max<PropagateNumbers>");
1326  // A single NaN.
1327  const size_t index = std::numeric_limits<size_t>::quiet_NaN() % PacketSize;
1328  data1[index] = NumTraits<Scalar>::quiet_NaN();
1329  VERIFY(PacketSize == 1 || !(numext::isnan)(internal::predux_min<PropagateNumbers>(internal::pload<Packet>(data1))));
1330  VERIFY((numext::isnan)(internal::predux_min<PropagateNaN>(internal::pload<Packet>(data1))));
1331  VERIFY(PacketSize == 1 || !(numext::isnan)(internal::predux_max<PropagateNumbers>(internal::pload<Packet>(data1))));
1332  VERIFY((numext::isnan)(internal::predux_max<PropagateNaN>(internal::pload<Packet>(data1))));
1333  // All NaNs.
1334  for (int i = 0; i < 4 * PacketSize; ++i) data1[i] = NumTraits<Scalar>::quiet_NaN();
1335  VERIFY((numext::isnan)(internal::predux_min<PropagateNumbers>(internal::pload<Packet>(data1))));
1336  VERIFY((numext::isnan)(internal::predux_min<PropagateNaN>(internal::pload<Packet>(data1))));
1337  VERIFY((numext::isnan)(internal::predux_max<PropagateNumbers>(internal::pload<Packet>(data1))));
1338  VERIFY((numext::isnan)(internal::predux_max<PropagateNaN>(internal::pload<Packet>(data1))));
1339 
1340  // Test NaN propagation for coefficient-wise min and max.
1341  for (int i = 0; i < PacketSize; ++i) {
1342  data1[i] = internal::random<bool>() ? NumTraits<Scalar>::quiet_NaN() : Scalar(0);
1343  data1[i + PacketSize] = internal::random<bool>() ? NumTraits<Scalar>::quiet_NaN() : Scalar(0);
1344  }
1345  // Note: NaN propagation is implementation defined for pmin/pmax, so we do not test it here.
1346  CHECK_CWISE2_IF(PacketTraits::HasMin, propagate_number_min, (internal::pmin<PropagateNumbers>));
1347  CHECK_CWISE2_IF(PacketTraits::HasMax, propagate_number_max, internal::pmax<PropagateNumbers>);
1348  CHECK_CWISE2_IF(PacketTraits::HasMin, propagate_nan_min, (internal::pmin<PropagateNaN>));
1349  CHECK_CWISE2_IF(PacketTraits::HasMax, propagate_nan_max, internal::pmax<PropagateNaN>);
1350  }
1351 
1353 }
General-purpose arrays with easy API for coefficient-wise operations.
Definition: Array.h:48
Derived & setRandom(Index size)
Definition: Random.h:147
#define min(a, b)
Definition: datatypes.h:22
#define isnan(X)
Definition: main.h:109
EIGEN_STRONG_INLINE bool predux_any(const Packet4f &x)
Definition: AltiVec/PacketMath.h:2751
EIGEN_DEVICE_FUNC unpacket_traits< Packet >::type predux_max(const Packet &a)
Definition: GenericPacketMath.h:1258
EIGEN_DEVICE_FUNC Packet pmax(const Packet &a, const Packet &b)
Definition: GenericPacketMath.h:663
EIGEN_DEVICE_FUNC unpacket_traits< Packet >::type predux_min(const Packet &a)
Definition: GenericPacketMath.h:1245
EIGEN_DEVICE_FUNC Packet pmin(const Packet &a, const Packet &b)
Definition: GenericPacketMath.h:649
EIGEN_DEVICE_FUNC Packet pabsdiff(const Packet &a, const Packet &b)
Definition: GenericPacketMath.h:746
EIGEN_STRONG_INLINE Packet4f pabs(const Packet4f &a)
Definition: AltiVec/PacketMath.h:1936
Scalar propagate_number_min(const Scalar &a, const Scalar &b)
Definition: packetmath.cpp:1237
T REF_ABS_DIFF(const T &a, const T &b)
Definition: packetmath.cpp:52
Scalar propagate_nan_min(const Scalar &a, const Scalar &b)
Definition: packetmath.cpp:1223
Scalar propagate_nan_max(const Scalar &a, const Scalar &b)
Definition: packetmath.cpp:1216
Scalar propagate_number_max(const Scalar &a, const Scalar &b)
Definition: packetmath.cpp:1230
static void run()
Definition: packetmath.cpp:352

References abs(), Eigen::test::areApprox(), CHECK_CWISE1, CHECK_CWISE2_IF, EIGEN_ALIGN_MAX, i, Eigen::internal::isApprox(), isnan, k, max, min, Eigen::internal::pabs(), Eigen::internal::pabsdiff(), Eigen::internal::pmax(), Eigen::internal::pmin(), Eigen::internal::predux_any(), Eigen::internal::predux_max(), Eigen::internal::predux_min(), propagate_nan_max(), propagate_nan_min(), propagate_number_max(), propagate_number_min(), Eigen::internal::pstore(), REF_ABS_DIFF(), packetmath_boolean_mask_ops_notcomplex_test< Scalar, Packet, EnableIf >::run(), Eigen::PlainObjectBase< Derived >::setRandom(), size, and VERIFY.

◆ packetmath_real()

template<typename Scalar , typename Packet >
void packetmath_real ( )
836  {
837  typedef internal::packet_traits<Scalar> PacketTraits;
838  const int PacketSize = internal::unpacket_traits<Packet>::size;
839 
840  const int size = PacketSize * 4;
841  EIGEN_ALIGN_MAX Scalar data1[PacketSize * 4] = {};
842  EIGEN_ALIGN_MAX Scalar data2[PacketSize * 4] = {};
843  EIGEN_ALIGN_MAX Scalar ref[PacketSize * 4] = {};
844 
845  // Negate with -0.
846  if (PacketTraits::HasNegate) {
847  test::packet_helper<PacketTraits::HasNegate, Packet> h;
848  data1[0] = Scalar{-0};
849  h.store(data2, internal::pnegate(h.load(data1)));
851  Bits bits = numext::bit_cast<Bits>(data2[0]);
852  VERIFY_IS_EQUAL(bits, static_cast<Bits>(Bits(1) << (sizeof(Scalar) * CHAR_BIT - 1)));
853  }
854 
855  for (int i = 0; i < size; ++i) {
856  data1[i] = Scalar(internal::random<double>(0, 1) * std::pow(10., internal::random<double>(-6, 6)));
857  data2[i] = Scalar(internal::random<double>(0, 1) * std::pow(10., internal::random<double>(-6, 6)));
858  }
859 
860  if (internal::random<float>(0, 1) < 0.1f) data1[internal::random<int>(0, PacketSize)] = Scalar(0);
861 
862  CHECK_CWISE1_IF(PacketTraits::HasLog, std::log, internal::plog);
863  CHECK_CWISE1_IF(PacketTraits::HasLog, log2, internal::plog2);
864  CHECK_CWISE1_IF(PacketTraits::HasRsqrt, numext::rsqrt, internal::prsqrt);
865 
866  for (int i = 0; i < size; ++i) {
867  data1[i] = Scalar(internal::random<double>(-1, 1) * std::pow(10., internal::random<double>(-3, 3)));
868  data2[i] = Scalar(internal::random<double>(-1, 1) * std::pow(10., internal::random<double>(-3, 3)));
869  }
870  CHECK_CWISE1_IF(PacketTraits::HasSin, std::sin, internal::psin);
871  CHECK_CWISE1_IF(PacketTraits::HasCos, std::cos, internal::pcos);
872  CHECK_CWISE1_IF(PacketTraits::HasTan, std::tan, internal::ptan);
873 
874  CHECK_CWISE1_EXACT_IF(PacketTraits::HasRound, numext::round, internal::pround);
875  CHECK_CWISE1_EXACT_IF(PacketTraits::HasRound, numext::ceil, internal::pceil);
876  CHECK_CWISE1_EXACT_IF(PacketTraits::HasRound, numext::floor, internal::pfloor);
877  CHECK_CWISE1_EXACT_IF(PacketTraits::HasRound, numext::rint, internal::print);
878  CHECK_CWISE1_EXACT_IF(PacketTraits::HasRound, numext::trunc, internal::ptrunc);
879  CHECK_CWISE1_IF(PacketTraits::HasSign, numext::sign, internal::psign);
880 
881  packetmath_boolean_mask_ops_real<Scalar, Packet>();
882 
883  // Rounding edge cases.
884  if (PacketTraits::HasRound) {
885  typedef typename internal::make_integer<Scalar>::type IntType;
886  // Start with values that cannot fit inside an integer, work down to less than one.
887  Scalar val =
889  std::vector<Scalar> values;
890  while (val > Scalar(0.25)) {
891  // Cover both even and odd, positive and negative cases.
892  values.push_back(val);
893  values.push_back(val + Scalar(0.3));
894  values.push_back(val + Scalar(0.5));
895  values.push_back(val + Scalar(0.8));
896  values.push_back(val + Scalar(1));
897  values.push_back(val + Scalar(1.3));
898  values.push_back(val + Scalar(1.5));
899  values.push_back(val + Scalar(1.8));
900  values.push_back(-val);
901  values.push_back(-val - Scalar(0.3));
902  values.push_back(-val - Scalar(0.5));
903  values.push_back(-val - Scalar(0.8));
904  values.push_back(-val - Scalar(1));
905  values.push_back(-val - Scalar(1.3));
906  values.push_back(-val - Scalar(1.5));
907  values.push_back(-val - Scalar(1.8));
908  values.push_back(Scalar(-1.5) + val); // Bug 1785.
909  val = val / Scalar(2);
910  }
911  values.push_back(NumTraits<Scalar>::infinity());
912  values.push_back(-NumTraits<Scalar>::infinity());
913  values.push_back(NumTraits<Scalar>::quiet_NaN());
914 
915  for (size_t k = 0; k < values.size(); ++k) {
916  data1[0] = values[k];
917  CHECK_CWISE1_EXACT_IF(PacketTraits::HasRound, numext::round, internal::pround);
918  CHECK_CWISE1_EXACT_IF(PacketTraits::HasRound, numext::ceil, internal::pceil);
919  CHECK_CWISE1_EXACT_IF(PacketTraits::HasRound, numext::floor, internal::pfloor);
920  CHECK_CWISE1_EXACT_IF(PacketTraits::HasRound, numext::rint, internal::print);
921  CHECK_CWISE1_EXACT_IF(PacketTraits::HasRound, numext::trunc, internal::ptrunc);
922  }
923  }
924 
925  for (int i = 0; i < size; ++i) {
926  data1[i] = Scalar(internal::random<double>(-1, 1));
927  data2[i] = Scalar(internal::random<double>(-1, 1));
928  }
929  CHECK_CWISE1_IF(PacketTraits::HasASin, std::asin, internal::pasin);
930  CHECK_CWISE1_IF(PacketTraits::HasACos, std::acos, internal::pacos);
931  CHECK_CWISE1_IF(PacketTraits::HasATan, std::atan, internal::patan);
932  CHECK_CWISE1_IF(PacketTraits::HasATanh, std::atanh, internal::patanh);
933 
934  for (int i = 0; i < size; ++i) {
935  data1[i] = Scalar(internal::random<double>(-87, 88));
936  data2[i] = Scalar(internal::random<double>(-87, 88));
937  data1[0] = -NumTraits<Scalar>::infinity();
938  }
939  CHECK_CWISE1_IF(PacketTraits::HasExp, std::exp, internal::pexp);
940  CHECK_CWISE1_IF(PacketTraits::HasExp, std::exp2, internal::pexp2);
941 
942  CHECK_CWISE1_BYREF1_IF(PacketTraits::HasExp, REF_FREXP, internal::pfrexp);
943  if (PacketTraits::HasExp) {
944 // Check denormals:
945 #if !EIGEN_ARCH_ARM
946  for (int j = 0; j < 3; ++j) {
947  data1[0] = Scalar(std::ldexp(1, NumTraits<Scalar>::min_exponent() - j));
948  CHECK_CWISE1_BYREF1_IF(PacketTraits::HasExp, REF_FREXP, internal::pfrexp);
949  data1[0] = -data1[0];
950  CHECK_CWISE1_BYREF1_IF(PacketTraits::HasExp, REF_FREXP, internal::pfrexp);
951  }
952 #endif
953 
954  // zero
955  data1[0] = Scalar(0);
956  CHECK_CWISE1_BYREF1_IF(PacketTraits::HasExp, REF_FREXP, internal::pfrexp);
957 
958  // inf and NaN only compare output fraction, not exponent.
959  test::packet_helper<PacketTraits::HasExp, Packet> h;
960  Packet pout;
961  Scalar sout;
963  for (int i = 0; i < 3; ++i) {
964  data1[0] = special[i];
965  ref[0] = Scalar(REF_FREXP(data1[0], ref[PacketSize]));
966  h.store(data2, internal::pfrexp(h.load(data1), h.forward_reference(pout, sout)));
967  VERIFY(test::areApprox(ref, data2, 1) && "internal::pfrexp");
968  }
969  }
970 
971  for (int i = 0; i < PacketSize; ++i) {
972  data1[i] = Scalar(internal::random<double>(-1, 1));
973  data2[i] = Scalar(internal::random<double>(-1, 1));
974  }
975  for (int i = 0; i < PacketSize; ++i) {
976  data1[i + PacketSize] = Scalar(internal::random<int>(-4, 4));
977  data2[i + PacketSize] = Scalar(internal::random<double>(-4, 4));
978  }
979  CHECK_CWISE2_IF(PacketTraits::HasExp, REF_LDEXP, internal::pldexp);
980  if (PacketTraits::HasExp) {
981  data1[0] = Scalar(-1);
982  // underflow to zero
983  data1[PacketSize] = Scalar(NumTraits<Scalar>::min_exponent() - 55);
984  CHECK_CWISE2_IF(PacketTraits::HasExp, REF_LDEXP, internal::pldexp);
985  // overflow to inf
986  data1[PacketSize] = Scalar(NumTraits<Scalar>::max_exponent() + 10);
987  CHECK_CWISE2_IF(PacketTraits::HasExp, REF_LDEXP, internal::pldexp);
988  // NaN stays NaN
989  data1[0] = NumTraits<Scalar>::quiet_NaN();
990  CHECK_CWISE2_IF(PacketTraits::HasExp, REF_LDEXP, internal::pldexp);
991  VERIFY((numext::isnan)(data2[0]));
992  // inf stays inf
993  data1[0] = NumTraits<Scalar>::infinity();
994  data1[PacketSize] = Scalar(NumTraits<Scalar>::min_exponent() - 10);
995  CHECK_CWISE2_IF(PacketTraits::HasExp, REF_LDEXP, internal::pldexp);
996  // zero stays zero
997  data1[0] = Scalar(0);
998  data1[PacketSize] = Scalar(NumTraits<Scalar>::max_exponent() + 10);
999  CHECK_CWISE2_IF(PacketTraits::HasExp, REF_LDEXP, internal::pldexp);
1000  // Small number big exponent.
1001  data1[0] = Scalar(std::ldexp(Scalar(1.0), NumTraits<Scalar>::min_exponent() - 1));
1003  CHECK_CWISE2_IF(PacketTraits::HasExp, REF_LDEXP, internal::pldexp);
1004  // Big number small exponent.
1005  data1[0] = Scalar(std::ldexp(Scalar(1.0), NumTraits<Scalar>::max_exponent() - 1));
1007  CHECK_CWISE2_IF(PacketTraits::HasExp, REF_LDEXP, internal::pldexp);
1008  }
1009 
1010  for (int i = 0; i < size; ++i) {
1011  data1[i] = Scalar(internal::random<double>(-1, 1) * std::pow(10., internal::random<double>(-6, 6)));
1012  data2[i] = Scalar(internal::random<double>(-1, 1) * std::pow(10., internal::random<double>(-6, 6)));
1013  }
1014  data1[0] = Scalar(1e-20);
1015  CHECK_CWISE1_IF(PacketTraits::HasTanh, std::tanh, internal::ptanh);
1016  if (PacketTraits::HasExp && PacketSize >= 2) {
1017  const Scalar small = NumTraits<Scalar>::epsilon();
1018  data1[0] = NumTraits<Scalar>::quiet_NaN();
1019  data1[1] = small;
1020  test::packet_helper<PacketTraits::HasExp, Packet> h;
1021  h.store(data2, internal::pexp(h.load(data1)));
1022  VERIFY((numext::isnan)(data2[0]));
1023  // TODO(rmlarsen): Re-enable for bfloat16.
1025  VERIFY_IS_APPROX(std::exp(small), data2[1]);
1026  }
1027 
1028  data1[0] = -small;
1029  data1[1] = Scalar(0);
1030  h.store(data2, internal::pexp(h.load(data1)));
1031  // TODO(rmlarsen): Re-enable for bfloat16.
1033  VERIFY_IS_APPROX(std::exp(-small), data2[0]);
1034  }
1035  VERIFY_IS_EQUAL(std::exp(Scalar(0)), data2[1]);
1036 
1037  data1[0] = (std::numeric_limits<Scalar>::min)();
1038  data1[1] = -(std::numeric_limits<Scalar>::min)();
1039  h.store(data2, internal::pexp(h.load(data1)));
1042 
1043  data1[0] = std::numeric_limits<Scalar>::denorm_min();
1044  data1[1] = -std::numeric_limits<Scalar>::denorm_min();
1045  h.store(data2, internal::pexp(h.load(data1)));
1046  VERIFY_IS_APPROX(std::exp(std::numeric_limits<Scalar>::denorm_min()), data2[0]);
1047  VERIFY_IS_APPROX(std::exp(-std::numeric_limits<Scalar>::denorm_min()), data2[1]);
1048  }
1049 
1050  if (PacketTraits::HasTanh) {
1051  // NOTE this test migh fail with GCC prior to 6.3, see MathFunctionsImpl.h for details.
1052  data1[0] = NumTraits<Scalar>::quiet_NaN();
1053  test::packet_helper<internal::packet_traits<Scalar>::HasTanh, Packet> h;
1054  h.store(data2, internal::ptanh(h.load(data1)));
1055  VERIFY((numext::isnan)(data2[0]));
1056  }
1057 
1058  if (PacketTraits::HasExp) {
1059  internal::scalar_logistic_op<Scalar> logistic;
1060  for (int i = 0; i < size; ++i) {
1061  data1[i] = Scalar(internal::random<double>(-20, 20));
1062  }
1063 
1064  test::packet_helper<PacketTraits::HasExp, Packet> h;
1065  h.store(data2, logistic.packetOp(h.load(data1)));
1066  for (int i = 0; i < PacketSize; ++i) {
1067  VERIFY_IS_APPROX(data2[i], logistic(data1[i]));
1068  }
1069  }
1070 
1071 #if EIGEN_HAS_C99_MATH
1072  data1[0] = NumTraits<Scalar>::infinity();
1073  data1[1] = Scalar(-1);
1074  CHECK_CWISE1_IF(PacketTraits::HasLog1p, std::log1p, internal::plog1p);
1075  data1[0] = NumTraits<Scalar>::infinity();
1076  data1[1] = -NumTraits<Scalar>::infinity();
1077  CHECK_CWISE1_IF(PacketTraits::HasExpm1, std::expm1, internal::pexpm1);
1078 #endif
1079 
1080  if (PacketSize >= 2) {
1081  data1[0] = NumTraits<Scalar>::quiet_NaN();
1082  data1[1] = NumTraits<Scalar>::epsilon();
1083  if (PacketTraits::HasLog) {
1084  test::packet_helper<PacketTraits::HasLog, Packet> h;
1085  h.store(data2, internal::plog(h.load(data1)));
1086  VERIFY((numext::isnan)(data2[0]));
1087  // TODO(cantonios): Re-enable for bfloat16.
1089  VERIFY_IS_APPROX(std::log(data1[1]), data2[1]);
1090  }
1091 
1092  data1[0] = -NumTraits<Scalar>::epsilon();
1093  data1[1] = Scalar(0);
1094  h.store(data2, internal::plog(h.load(data1)));
1095  VERIFY((numext::isnan)(data2[0]));
1096  VERIFY_IS_EQUAL(std::log(Scalar(0)), data2[1]);
1097 
1098  data1[0] = (std::numeric_limits<Scalar>::min)();
1099  data1[1] = -(std::numeric_limits<Scalar>::min)();
1100  h.store(data2, internal::plog(h.load(data1)));
1101  // TODO(cantonios): Re-enable for bfloat16.
1104  }
1105  VERIFY((numext::isnan)(data2[1]));
1106 
1107  // Note: 32-bit arm always flushes denorms to zero.
1108 #if !EIGEN_ARCH_ARM
1109  if (std::numeric_limits<Scalar>::has_denorm == std::denorm_present) {
1110  data1[0] = std::numeric_limits<Scalar>::denorm_min();
1111  data1[1] = -std::numeric_limits<Scalar>::denorm_min();
1112  h.store(data2, internal::plog(h.load(data1)));
1113  // TODO(rmlarsen): Re-enable for bfloat16.
1115  VERIFY_IS_APPROX(std::log(std::numeric_limits<Scalar>::denorm_min()), data2[0]);
1116  }
1117  VERIFY((numext::isnan)(data2[1]));
1118  }
1119 #endif
1120 
1121  data1[0] = Scalar(-1.0f);
1122  h.store(data2, internal::plog(h.load(data1)));
1123  VERIFY((numext::isnan)(data2[0]));
1124 
1125  data1[0] = NumTraits<Scalar>::infinity();
1126  h.store(data2, internal::plog(h.load(data1)));
1127  VERIFY((numext::isinf)(data2[0]));
1128  }
1129  if (PacketTraits::HasLog1p) {
1130  test::packet_helper<PacketTraits::HasLog1p, Packet> h;
1131  data1[0] = Scalar(-2);
1132  data1[1] = -NumTraits<Scalar>::infinity();
1133  h.store(data2, internal::plog1p(h.load(data1)));
1134  VERIFY((numext::isnan)(data2[0]));
1135  VERIFY((numext::isnan)(data2[1]));
1136  }
1137 
1138  packetmath_test_IEEE_corner_cases<PacketTraits::HasSqrt, Scalar, Packet>(numext::sqrt<Scalar>, psqrt_functor());
1139  packetmath_test_IEEE_corner_cases<PacketTraits::HasRsqrt, Scalar, Packet>(numext::rsqrt<Scalar>, prsqrt_functor());
1140 
1141  // TODO(rmlarsen): Re-enable for half and bfloat16.
1142  if (PacketTraits::HasCos && !internal::is_same<Scalar, half>::value &&
1144  test::packet_helper<PacketTraits::HasCos, Packet> h;
1145  for (Scalar k = Scalar(1); k < Scalar(10000) / NumTraits<Scalar>::epsilon(); k *= Scalar(2)) {
1146  for (int k1 = 0; k1 <= 1; ++k1) {
1147  data1[0] = Scalar((2 * double(k) + k1) * double(EIGEN_PI) / 2 * internal::random<double>(0.8, 1.2));
1148  data1[1] = Scalar((2 * double(k) + 2 + k1) * double(EIGEN_PI) / 2 * internal::random<double>(0.8, 1.2));
1149  h.store(data2, internal::pcos(h.load(data1)));
1150  h.store(data2 + PacketSize, internal::psin(h.load(data1)));
1151  VERIFY(data2[0] <= Scalar(1.) && data2[0] >= Scalar(-1.));
1152  VERIFY(data2[1] <= Scalar(1.) && data2[1] >= Scalar(-1.));
1153  VERIFY(data2[PacketSize + 0] <= Scalar(1.) && data2[PacketSize + 0] >= Scalar(-1.));
1154  VERIFY(data2[PacketSize + 1] <= Scalar(1.) && data2[PacketSize + 1] >= Scalar(-1.));
1155 
1156  VERIFY_IS_APPROX(data2[0], std::cos(data1[0]));
1157  VERIFY_IS_APPROX(data2[1], std::cos(data1[1]));
1158  VERIFY_IS_APPROX(data2[PacketSize + 0], std::sin(data1[0]));
1159  VERIFY_IS_APPROX(data2[PacketSize + 1], std::sin(data1[1]));
1160 
1161  VERIFY_IS_APPROX(numext::abs2(data2[0]) + numext::abs2(data2[PacketSize + 0]), Scalar(1));
1162  VERIFY_IS_APPROX(numext::abs2(data2[1]) + numext::abs2(data2[PacketSize + 1]), Scalar(1));
1163  }
1164  }
1165 
1166  data1[0] = NumTraits<Scalar>::infinity();
1167  data1[1] = -NumTraits<Scalar>::infinity();
1168  h.store(data2, internal::psin(h.load(data1)));
1169  VERIFY((numext::isnan)(data2[0]));
1170  VERIFY((numext::isnan)(data2[1]));
1171 
1172  h.store(data2, internal::pcos(h.load(data1)));
1173  VERIFY((numext::isnan)(data2[0]));
1174  VERIFY((numext::isnan)(data2[1]));
1175 
1176  data1[0] = NumTraits<Scalar>::quiet_NaN();
1177  h.store(data2, internal::psin(h.load(data1)));
1178  VERIFY((numext::isnan)(data2[0]));
1179  h.store(data2, internal::pcos(h.load(data1)));
1180  VERIFY((numext::isnan)(data2[0]));
1181 
1182  data1[0] = -Scalar(0.);
1183  h.store(data2, internal::psin(h.load(data1)));
1184  VERIFY(test::biteq(data2[0], data1[0]));
1185  h.store(data2, internal::pcos(h.load(data1)));
1186  VERIFY_IS_EQUAL(data2[0], Scalar(1));
1187  }
1188  }
1189  if (PacketTraits::HasReciprocal && PacketSize >= 2) {
1190  test::packet_helper<PacketTraits::HasReciprocal, Packet> h;
1192  const Scalar zero = Scalar(0);
1193  data1[0] = zero;
1194  data1[1] = -zero;
1195  h.store(data2, internal::preciprocal(h.load(data1)));
1196  VERIFY_IS_EQUAL(data2[0], inf);
1197  VERIFY_IS_EQUAL(data2[1], -inf);
1198 
1199  data1[0] = inf;
1200  data1[1] = -inf;
1201  h.store(data2, internal::preciprocal(h.load(data1)));
1202  VERIFY_IS_EQUAL(data2[0], zero);
1203  VERIFY_IS_EQUAL(data2[1], -zero);
1204  }
1205 }
AnnoyingScalar cos(const AnnoyingScalar &x)
Definition: AnnoyingScalar.h:136
AnnoyingScalar acos(const AnnoyingScalar &x)
Definition: AnnoyingScalar.h:138
AnnoyingScalar sin(const AnnoyingScalar &x)
Definition: AnnoyingScalar.h:137
Array< double, 1, 3 > e(1./3., 0.5, 2.)
#define EIGEN_PI
Definition: MathFunctions.h:16
#define VERIFY_IS_APPROX(a, b)
Definition: integer_types.cpp:13
#define VERIFY_IS_EQUAL(a, b)
Definition: main.h:367
#define isinf(X)
Definition: main.h:110
EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC bfloat16 tanh(const bfloat16 &a)
Definition: BFloat16.h:639
EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC bfloat16 floor(const bfloat16 &a)
Definition: BFloat16.h:643
EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC bfloat16 atanh(const bfloat16 &a)
Definition: BFloat16.h:642
EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC bfloat16 ceil(const bfloat16 &a)
Definition: BFloat16.h:644
EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC bfloat16 trunc(const bfloat16 &a)
Definition: BFloat16.h:647
EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC bfloat16 rint(const bfloat16 &a)
Definition: BFloat16.h:645
EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC bfloat16 asin(const bfloat16 &a)
Definition: BFloat16.h:634
EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC bfloat16 atan(const bfloat16 &a)
Definition: BFloat16.h:636
EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC bfloat16 exp(const bfloat16 &a)
Definition: BFloat16.h:615
EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC bfloat16 expm1(const bfloat16 &a)
Definition: BFloat16.h:617
EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC bfloat16 round(const bfloat16 &a)
Definition: BFloat16.h:646
EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC bfloat16 tan(const bfloat16 &a)
Definition: BFloat16.h:633
EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC bfloat16 exp2(const bfloat16 &a)
Definition: BFloat16.h:616
EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC bfloat16 log1p(const bfloat16 &a)
Definition: BFloat16.h:619
EIGEN_DECLARE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS Packet pexpm1(const Packet &a)
Definition: GenericPacketMath.h:1097
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet ptrunc(const Packet &a)
Definition: GenericPacketMath.h:1178
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet print(const Packet &a)
Definition: GenericPacketMath.h:1166
EIGEN_DECLARE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS Packet plog2(const Packet &a)
Definition: GenericPacketMath.h:1123
EIGEN_DECLARE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS Packet pcos(const Packet &a)
Definition: GenericPacketMath.h:1022
EIGEN_DECLARE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS Packet psin(const Packet &a)
Definition: GenericPacketMath.h:1015
EIGEN_DECLARE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS Packet pacos(const Packet &a)
Definition: GenericPacketMath.h:1043
EIGEN_DECLARE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS Packet ptan(const Packet &a)
Definition: GenericPacketMath.h:1029
EIGEN_STRONG_INLINE Packet2cf pnegate(const Packet2cf &a)
Definition: AltiVec/Complex.h:264
EIGEN_DECLARE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS Packet ptanh(const Packet &a)
Definition: GenericPacketMath.h:1071
EIGEN_STRONG_INLINE Packet4f pceil(const Packet4f &a)
Definition: LSX/PacketMath.h:2546
EIGEN_DECLARE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS Packet pexp2(const Packet &a)
Definition: GenericPacketMath.h:1091
EIGEN_DECLARE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS Packet plog1p(const Packet &a)
Definition: GenericPacketMath.h:1110
EIGEN_STRONG_INLINE Packet8h pldexp(const Packet8h &a, const Packet8h &exponent)
Definition: arch/AVX/MathFunctions.h:80
EIGEN_DECLARE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS Packet pasin(const Packet &a)
Definition: GenericPacketMath.h:1036
EIGEN_STRONG_INLINE Packet4f pround(const Packet4f &a)
Definition: LSX/PacketMath.h:2555
EIGEN_STRONG_INLINE Packet8h pfrexp(const Packet8h &a, Packet8h &exponent)
Definition: arch/AVX/MathFunctions.h:72
EIGEN_STRONG_INLINE Packet4f pfloor(const Packet4f &a)
Definition: LSX/PacketMath.h:2537
EIGEN_DECLARE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS Packet patanh(const Packet &a)
Definition: GenericPacketMath.h:1078
EIGEN_DECLARE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS Packet patan(const Packet &a)
Definition: GenericPacketMath.h:1064
EIGEN_STRONG_INLINE Packet4f pexp(const Packet4f &_x)
Definition: LSX/PacketMath.h:2663
EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE T mini(const T &x, const T &y)
Definition: MathFunctions.h:920
EIGEN_DEVICE_FUNC bool abs2(bool x)
Definition: MathFunctions.h:1102
Map< const Array< unsigned char, sizeof(T), 1 > > bits(const T &x)
Definition: packetmath_test_shared.h:36
bool biteq(T a, T b)
Definition: packetmath_test_shared.h:41
type
Definition: compute_granudrum_aor.py:141
double epsilon
Definition: osc_ring_sarah_asymptotics.h:43
T REF_FREXP(const T &x, T &exp)
Definition: packetmath.cpp:75
T REF_LDEXP(const T &x, const T &exp)
Definition: packetmath.cpp:90
Scalar log2(Scalar x)
Definition: packetmath.cpp:754
#define CHECK_CWISE1_BYREF1_IF(COND, REFOP, POP)
Definition: packetmath_test_shared.h:242
#define CHECK_CWISE1_EXACT_IF(COND, REFOP, POP)
Definition: packetmath_test_shared.h:225

References Eigen::numext::abs2(), acos(), Eigen::test::areApprox(), Eigen::bfloat16_impl::asin(), Eigen::bfloat16_impl::atan(), Eigen::bfloat16_impl::atanh(), Eigen::test::biteq(), Eigen::test::bits(), Eigen::bfloat16_impl::ceil(), CHECK_CWISE1_BYREF1_IF, CHECK_CWISE1_EXACT_IF, CHECK_CWISE1_IF, CHECK_CWISE2_IF, cos(), e(), EIGEN_ALIGN_MAX, EIGEN_PI, oomph::SarahBL::epsilon, Eigen::bfloat16_impl::exp(), Eigen::bfloat16_impl::exp2(), Eigen::bfloat16_impl::expm1(), Eigen::bfloat16_impl::floor(), i, constants::inf, isinf, isnan, j, k, Eigen::bfloat16_impl::log(), Eigen::bfloat16_impl::log1p(), log2(), min, Eigen::numext::mini(), Eigen::internal::pacos(), Eigen::internal::pasin(), Eigen::internal::patan(), Eigen::internal::patanh(), Eigen::internal::pceil(), Eigen::internal::pcos(), Eigen::internal::pexp(), Eigen::internal::pexp2(), Eigen::internal::pexpm1(), Eigen::internal::pfloor(), Eigen::internal::pfrexp(), Eigen::internal::pldexp(), Eigen::internal::plog(), Eigen::internal::plog1p(), Eigen::internal::plog2(), Eigen::internal::pnegate(), Eigen::bfloat16_impl::pow(), Eigen::internal::preciprocal(), Eigen::internal::print(), Eigen::internal::pround(), Eigen::internal::prsqrt(), Eigen::internal::psign(), Eigen::internal::psin(), Eigen::internal::ptan(), Eigen::internal::ptanh(), Eigen::internal::ptrunc(), REF_FREXP(), REF_LDEXP(), Eigen::bfloat16_impl::rint(), Eigen::bfloat16_impl::round(), Eigen::numext::rsqrt(), SYCL::sign(), sin(), size, Eigen::bfloat16_impl::tan(), Eigen::bfloat16_impl::tanh(), Eigen::bfloat16_impl::trunc(), compute_granudrum_aor::type, calibrate::val, Eigen::value, VERIFY, VERIFY_IS_APPROX, VERIFY_IS_EQUAL, and zero().

◆ packetmath_scatter_gather()

template<typename Scalar , typename Packet >
void packetmath_scatter_gather ( )
1632  {
1633  typedef typename NumTraits<Scalar>::Real RealScalar;
1634  const int PacketSize = internal::unpacket_traits<Packet>::size;
1635  EIGEN_ALIGN_MAX Scalar data1[PacketSize];
1636  RealScalar refvalue = RealScalar(0);
1637  for (int i = 0; i < PacketSize; ++i) {
1638  data1[i] = internal::random<Scalar>() / RealScalar(PacketSize);
1639  }
1640 
1641  int stride = internal::random<int>(1, 20);
1642 
1643  // Buffer of zeros.
1644  EIGEN_ALIGN_MAX Scalar buffer[PacketSize * 20] = {};
1645 
1646  Packet packet = internal::pload<Packet>(data1);
1647  internal::pscatter<Scalar, Packet>(buffer, packet, stride);
1648 
1649  for (int i = 0; i < PacketSize * 20; ++i) {
1650  if ((i % stride) == 0 && i < stride * PacketSize) {
1651  VERIFY(test::isApproxAbs(buffer[i], data1[i / stride], refvalue) && "pscatter");
1652  } else {
1653  VERIFY(test::isApproxAbs(buffer[i], Scalar(0), refvalue) && "pscatter");
1654  }
1655  }
1656 
1657  for (int i = 0; i < PacketSize * 7; ++i) {
1658  buffer[i] = internal::random<Scalar>() / RealScalar(PacketSize);
1659  }
1660  packet = internal::pgather<Scalar, Packet>(buffer, 7);
1661  internal::pstore(data1, packet);
1662  for (int i = 0; i < PacketSize; ++i) {
1663  VERIFY(test::isApproxAbs(data1[i], buffer[i * 7], refvalue) && "pgather");
1664  }
1665 
1666  for (Index N = 0; N <= PacketSize; ++N) {
1667  for (Index i = 0; i < N; ++i) {
1668  data1[i] = internal::random<Scalar>() / RealScalar(PacketSize);
1669  }
1670 
1671  for (Index i = 0; i < N * 20; ++i) {
1672  buffer[i] = Scalar(0);
1673  }
1674 
1675  packet = internal::pload_partial<Packet>(data1, N);
1676  internal::pscatter_partial<Scalar, Packet>(buffer, packet, stride, N);
1677 
1678  for (Index i = 0; i < N * 20; ++i) {
1679  if ((i % stride) == 0 && i < stride * N) {
1680  VERIFY(test::isApproxAbs(buffer[i], data1[i / stride], refvalue) && "pscatter_partial");
1681  } else {
1682  VERIFY(test::isApproxAbs(buffer[i], Scalar(0), refvalue) && "pscatter_partial");
1683  }
1684  }
1685 
1686  for (Index i = 0; i < N * 7; ++i) {
1687  buffer[i] = internal::random<Scalar>() / RealScalar(PacketSize);
1688  }
1689  packet = internal::pgather_partial<Scalar, Packet>(buffer, 7, N);
1690  internal::pstore_partial(data1, packet, N);
1691  for (Index i = 0; i < N; ++i) {
1692  VERIFY(test::isApproxAbs(data1[i], buffer[i * 7], refvalue) && "pgather_partial");
1693  }
1694  }
1695 }
EIGEN_DEFAULT_DENSE_INDEX_TYPE Index
The Index type as used for the API.
Definition: Meta.h:83

References EIGEN_ALIGN_MAX, i, Eigen::test::isApproxAbs(), N, Eigen::internal::pstore(), Eigen::internal::pstore_partial(), size, and VERIFY.

◆ packetmath_test_IEEE_corner_cases()

template<bool Cond, typename Scalar , typename Packet , typename RefFunctorT , typename FunctorT >
void packetmath_test_IEEE_corner_cases ( const RefFunctorT &  ref_fun,
const FunctorT &  fun 
)
773  {
774  const int PacketSize = internal::unpacket_traits<Packet>::size;
775  const Scalar norm_min = (std::numeric_limits<Scalar>::min)();
776  const Scalar norm_max = (std::numeric_limits<Scalar>::max)();
777 
778  constexpr int size = PacketSize * 2;
779  EIGEN_ALIGN_MAX Scalar data1[size];
780  EIGEN_ALIGN_MAX Scalar data2[size];
782  for (int i = 0; i < size; ++i) {
783  data1[i] = data2[i] = ref[i] = Scalar(0);
784  }
785 
786  // Test for subnormals.
787  if (Cond && std::numeric_limits<Scalar>::has_denorm == std::denorm_present && !EIGEN_ARCH_ARM) {
788  for (int scale = 1; scale < 5; ++scale) {
789  // When EIGEN_FAST_MATH is 1 we relax the conditions slightly, and allow the function
790  // to return the same value for subnormals as the reference would return for zero with
791  // the same sign as the input.
792 #if EIGEN_FAST_MATH
793  data1[0] = Scalar(scale) * std::numeric_limits<Scalar>::denorm_min();
794  data1[1] = -data1[0];
795  test::packet_helper<Cond, Packet> h;
796  h.store(data2, fun(h.load(data1)));
797  for (int i = 0; i < PacketSize; ++i) {
798  const Scalar ref_zero = ref_fun(data1[i] < 0 ? -Scalar(0) : Scalar(0));
799  const Scalar ref_val = ref_fun(data1[i]);
800  VERIFY(((std::isnan)(data2[i]) && (std::isnan)(ref_val)) || data2[i] == ref_zero ||
801  verifyIsApprox(data2[i], ref_val));
802  }
803 #else
804  CHECK_CWISE1_IF(Cond, ref_fun, fun);
805 #endif
806  }
807  }
808 
809  // Test for smallest normalized floats.
810  data1[0] = norm_min;
811  data1[1] = -data1[0];
812  CHECK_CWISE1_IF(Cond, ref_fun, fun);
813 
814  // Test for largest floats.
815  data1[0] = norm_max;
816  data1[1] = -data1[0];
817  CHECK_CWISE1_IF(Cond, ref_fun, fun);
818 
819  // Test for zeros.
820  data1[0] = Scalar(0.0);
821  data1[1] = -data1[0];
822  CHECK_CWISE1_IF(Cond, ref_fun, fun);
823 
824  // Test for infinities.
825  data1[0] = NumTraits<Scalar>::infinity();
826  data1[1] = -data1[0];
827  CHECK_CWISE1_IF(Cond, ref_fun, fun);
828 
829  // Test for quiet NaNs.
830  data1[0] = std::numeric_limits<Scalar>::quiet_NaN();
831  data1[1] = -std::numeric_limits<Scalar>::quiet_NaN();
832  CHECK_CWISE1_IF(Cond, ref_fun, fun);
833 }
#define EIGEN_ARCH_ARM
Definition: Macros.h:336
bool verifyIsApprox(const Type1 &a, const Type2 &b)
Definition: main.h:609
Definition: TensorMeta.h:19

References CHECK_CWISE1_IF, EIGEN_ALIGN_MAX, EIGEN_ARCH_ARM, i, isnan, max, min, size, VERIFY, and Eigen::verifyIsApprox().

◆ propagate_nan_max()

template<typename Scalar >
Scalar propagate_nan_max ( const Scalar a,
const Scalar b 
)
1216  {
1217  if ((numext::isnan)(a)) return a;
1218  if ((numext::isnan)(b)) return b;
1219  return (numext::maxi)(a, b);
1220 }
Scalar * b
Definition: benchVecAdd.cpp:17
const Scalar * a
Definition: level2_cplx_impl.h:32
EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE T maxi(const T &x, const T &y)
Definition: MathFunctions.h:926

References a, b, isnan, and Eigen::numext::maxi().

Referenced by packetmath_notcomplex().

◆ propagate_nan_min()

template<typename Scalar >
Scalar propagate_nan_min ( const Scalar a,
const Scalar b 
)
1223  {
1224  if ((numext::isnan)(a)) return a;
1225  if ((numext::isnan)(b)) return b;
1226  return (numext::mini)(a, b);
1227 }

References a, b, isnan, and Eigen::numext::mini().

Referenced by packetmath_notcomplex().

◆ propagate_number_max()

template<typename Scalar >
Scalar propagate_number_max ( const Scalar a,
const Scalar b 
)
1230  {
1231  if ((numext::isnan)(a)) return b;
1232  if ((numext::isnan)(b)) return a;
1233  return (numext::maxi)(a, b);
1234 }

References a, b, isnan, and Eigen::numext::maxi().

Referenced by packetmath_notcomplex().

◆ propagate_number_min()

template<typename Scalar >
Scalar propagate_number_min ( const Scalar a,
const Scalar b 
)
1237  {
1238  if ((numext::isnan)(a)) return b;
1239  if ((numext::isnan)(b)) return a;
1240  return (numext::mini)(a, b);
1241 }

References a, b, isnan, and Eigen::numext::mini().

Referenced by packetmath_notcomplex().

◆ REF_ABS_DIFF()

template<typename T >
T REF_ABS_DIFF ( const T a,
const T b 
)
inline
52  {
53  return a > b ? a - b : b - a;
54 }

References a, and b.

Referenced by packetmath_notcomplex().

◆ REF_ADD() [1/2]

template<>
bool REF_ADD ( const bool a,
const bool b 
)
inline
58  {
59  return a || b;
60 }

References a, and b.

◆ REF_ADD() [2/2]

template<typename T >
T REF_ADD ( const T a,
const T b 
)
inline

◆ REF_DIV()

template<typename T >
T REF_DIV ( const T a,
const T b 
)
inline
44  {
45  return a / b;
46 }

References a, and b.

Referenced by packetmath().

◆ REF_FREXP()

template<typename T >
T REF_FREXP ( const T x,
T exp 
)
inline
75  {
76  int iexp = 0;
77  EIGEN_USING_STD(frexp)
78  const T out = static_cast<T>(frexp(x, &iexp));
79  exp = static_cast<T>(iexp);
80 
81  // The exponent value is unspecified if the input is inf or NaN, but MSVC
82  // seems to set it to 1. We need to set it back to zero for consistency.
83  if (!(numext::isfinite)(x)) {
84  exp = T(0);
85  }
86  return out;
87 }
Eigen::Triplet< double > T
Definition: EigenUnitTest.cpp:11
#define EIGEN_USING_STD(FUNC)
Definition: Macros.h:1090
#define isfinite(X)
Definition: main.h:111
std::ofstream out("Result.txt")

References EIGEN_USING_STD, Eigen::bfloat16_impl::exp(), isfinite, out(), and plotDoE::x.

Referenced by packetmath_real().

◆ REF_LDEXP()

template<typename T >
T REF_LDEXP ( const T x,
const T exp 
)
inline
90  {
91  EIGEN_USING_STD(ldexp)
92  return static_cast<T>(ldexp(x, static_cast<int>(exp)));
93 }

References EIGEN_USING_STD, Eigen::bfloat16_impl::exp(), and plotDoE::x.

Referenced by packetmath_real().

◆ REF_MADD() [1/2]

template<>
bool REF_MADD ( const bool a,
const bool b,
const bool c 
)
inline
70  {
71  return (a && b) || c;
72 }
int c
Definition: calibrate.py:100

References a, b, and calibrate::c.

◆ REF_MADD() [2/2]

template<typename T >
T REF_MADD ( const T a,
const T b,
const T c 
)
inline
28  {
29  return a * b + c;
30 }

References a, b, and calibrate::c.

Referenced by packetmath().

◆ REF_MSUB()

template<typename T >
T REF_MSUB ( const T a,
const T b,
const T c 
)
inline
32  {
33  return a * b - c;
34 }

References a, b, and calibrate::c.

Referenced by packetmath().

◆ REF_MUL() [1/2]

template<>
bool REF_MUL ( const bool a,
const bool b 
)
inline
66  {
67  return a && b;
68 }

References a, and b.

◆ REF_MUL() [2/2]

template<typename T >
T REF_MUL ( const T a,
const T b 
)
inline
24  {
25  return a * b;
26 }

References a, and b.

Referenced by packetmath().

◆ REF_NMADD()

template<typename T >
T REF_NMADD ( const T a,
const T b,
const T c 
)
inline
36  {
37  return c - a * b;
38 }

References a, b, and calibrate::c.

Referenced by packetmath().

◆ REF_NMSUB()

template<typename T >
T REF_NMSUB ( const T a,
const T b,
const T c 
)
inline
40  {
41  return test::negate(a * b + c);
42 }
T negate(const T &x)
Definition: packetmath_test_shared.h:26

References a, b, calibrate::c, and Eigen::test::negate().

Referenced by negate_test_impl< Scalar, Packet, HasNegate >::run_nmsub().

◆ REF_RECIPROCAL()

template<typename T >
T REF_RECIPROCAL ( const T a)
inline
48  {
49  return T(1) / a;
50 }

References a.

Referenced by packetmath().

◆ REF_SUB() [1/2]

template<>
bool REF_SUB ( const bool a,
const bool b 
)
inline
62  {
63  return a ^ b;
64 }

References a, and b.

◆ REF_SUB() [2/2]

template<typename T >
T REF_SUB ( const T a,
const T b 
)
inline
20  {
21  return a - b;
22 }

References a, and b.

Referenced by packetmath().

◆ test_conj_helper()

template<typename Scalar , typename Packet , bool ConjLhs, bool ConjRhs>
void test_conj_helper ( Scalar data1,
Scalar data2,
Scalar ref,
Scalar pval 
)
1356  {
1357  const int PacketSize = internal::unpacket_traits<Packet>::size;
1358 
1359  internal::conj_if<ConjLhs> cj0;
1360  internal::conj_if<ConjRhs> cj1;
1361  internal::conj_helper<Scalar, Scalar, ConjLhs, ConjRhs> cj;
1362  internal::conj_helper<Packet, Packet, ConjLhs, ConjRhs> pcj;
1363 
1364  for (int i = 0; i < PacketSize; ++i) {
1365  ref[i] = cj0(data1[i]) * cj1(data2[i]);
1366  VERIFY(internal::isApprox(ref[i], cj.pmul(data1[i], data2[i])) && "conj_helper pmul");
1367  }
1368  internal::pstore(pval, pcj.pmul(internal::pload<Packet>(data1), internal::pload<Packet>(data2)));
1369  VERIFY(test::areApprox(ref, pval, PacketSize) && "conj_helper pmul");
1370 
1371  for (int i = 0; i < PacketSize; ++i) {
1372  Scalar tmp = ref[i];
1373  ref[i] += cj0(data1[i]) * cj1(data2[i]);
1374  VERIFY(internal::isApprox(ref[i], cj.pmadd(data1[i], data2[i], tmp)) && "conj_helper pmadd");
1375  }
1377  pval, pcj.pmadd(internal::pload<Packet>(data1), internal::pload<Packet>(data2), internal::pload<Packet>(pval)));
1378  VERIFY(test::areApprox(ref, pval, PacketSize) && "conj_helper pmadd");
1379 }
Eigen::Matrix< Scalar, Dynamic, Dynamic, ColMajor > tmp
Definition: level3_impl.h:365

References Eigen::test::areApprox(), i, Eigen::internal::isApprox(), Eigen::internal::pstore(), size, tmp, and VERIFY.