Explicitly use the packet trait HasPow to control whether Pow is vectorized.

This commit is contained in:
Rasmus Munk Larsen 2025-07-18 21:51:42 +00:00
parent efe5b6979d
commit 97c7cc6200
8 changed files with 15 additions and 5 deletions

View File

@ -118,6 +118,7 @@ struct packet_traits<float> : default_packet_traits {
HasLog1p = 1, HasLog1p = 1,
HasExpm1 = 1, HasExpm1 = 1,
HasExp = 1, HasExp = 1,
HasPow = 1,
HasNdtri = 1, HasNdtri = 1,
HasBessel = 1, HasBessel = 1,
HasSqrt = 1, HasSqrt = 1,
@ -149,6 +150,7 @@ struct packet_traits<double> : default_packet_traits {
HasErf = 1, HasErf = 1,
HasErfc = 1, HasErfc = 1,
HasExp = 1, HasExp = 1,
HasPow = 1,
HasSqrt = 1, HasSqrt = 1,
HasRsqrt = 1, HasRsqrt = 1,
HasCbrt = 1, HasCbrt = 1,

View File

@ -135,6 +135,7 @@ struct packet_traits<float> : default_packet_traits {
HasNdtri = 1, HasNdtri = 1,
HasBessel = 1, HasBessel = 1,
HasExp = 1, HasExp = 1,
HasPow = 1,
HasReciprocal = EIGEN_FAST_MATH, HasReciprocal = EIGEN_FAST_MATH,
HasTanh = EIGEN_FAST_MATH, HasTanh = EIGEN_FAST_MATH,
HasErf = EIGEN_FAST_MATH, HasErf = EIGEN_FAST_MATH,
@ -159,6 +160,7 @@ struct packet_traits<double> : default_packet_traits {
HasCos = EIGEN_FAST_MATH, HasCos = EIGEN_FAST_MATH,
HasLog = 1, HasLog = 1,
HasExp = 1, HasExp = 1,
HasPow = 1,
HasATan = 1, HasATan = 1,
HasTanh = EIGEN_FAST_MATH, HasTanh = EIGEN_FAST_MATH,
HasErf = EIGEN_FAST_MATH, HasErf = EIGEN_FAST_MATH,

View File

@ -185,6 +185,8 @@ struct packet_traits<float> : default_packet_traits {
HasLog = 1, HasLog = 1,
HasExp = 1, HasExp = 1,
#ifdef EIGEN_VECTORIZE_VSX #ifdef EIGEN_VECTORIZE_VSX
HasCmp = 1,
HasPow = 1,
HasSqrt = 1, HasSqrt = 1,
HasCbrt = 1, HasCbrt = 1,
#if !EIGEN_COMP_CLANG #if !EIGEN_COMP_CLANG
@ -3175,6 +3177,7 @@ struct packet_traits<double> : default_packet_traits {
HasATanh = 1, HasATanh = 1,
HasATan = 0, HasATan = 0,
HasLog = 0, HasLog = 0,
HasCmp = 1,
HasExp = 1, HasExp = 1,
HasSqrt = 1, HasSqrt = 1,
HasCbrt = 1, HasCbrt = 1,

View File

@ -205,6 +205,7 @@ struct packet_traits<float> : default_packet_traits {
HasATanh = 1, HasATanh = 1,
HasLog = 1, HasLog = 1,
HasExp = 1, HasExp = 1,
HasPow = 1,
HasSqrt = 1, HasSqrt = 1,
HasRsqrt = 1, HasRsqrt = 1,
HasCbrt = 1, HasCbrt = 1,
@ -5060,6 +5061,7 @@ struct packet_traits<double> : default_packet_traits {
#if EIGEN_ARCH_ARM64 && !EIGEN_APPLE_DOUBLE_NEON_BUG #if EIGEN_ARCH_ARM64 && !EIGEN_APPLE_DOUBLE_NEON_BUG
HasExp = 1, HasExp = 1,
HasLog = 1, HasLog = 1,
HasPow = 1,
HasATan = 1, HasATan = 1,
HasATanh = 1, HasATanh = 1,
#endif #endif

View File

@ -192,6 +192,7 @@ struct packet_traits<float> : default_packet_traits {
HasExpm1 = 1, HasExpm1 = 1,
HasNdtri = 1, HasNdtri = 1,
HasExp = 1, HasExp = 1,
HasPow = 1,
HasBessel = 1, HasBessel = 1,
HasSqrt = 1, HasSqrt = 1,
HasRsqrt = 1, HasRsqrt = 1,
@ -221,6 +222,7 @@ struct packet_traits<double> : default_packet_traits {
HasErf = EIGEN_FAST_MATH, HasErf = EIGEN_FAST_MATH,
HasErfc = EIGEN_FAST_MATH, HasErfc = EIGEN_FAST_MATH,
HasExp = 1, HasExp = 1,
HasPow = 1,
HasSqrt = 1, HasSqrt = 1,
HasRsqrt = 1, HasRsqrt = 1,
HasCbrt = 1, HasCbrt = 1,

View File

@ -354,10 +354,12 @@ struct packet_traits<float> : default_packet_traits {
HasDiv = 1, HasDiv = 1,
HasCmp = 1,
HasSin = EIGEN_FAST_MATH, HasSin = EIGEN_FAST_MATH,
HasCos = EIGEN_FAST_MATH, HasCos = EIGEN_FAST_MATH,
HasLog = 1, HasLog = 1,
HasExp = 1, HasExp = 1,
HasPow = 1,
HasSqrt = 1, HasSqrt = 1,
HasTanh = EIGEN_FAST_MATH, HasTanh = EIGEN_FAST_MATH,
HasErf = EIGEN_FAST_MATH, HasErf = EIGEN_FAST_MATH,

View File

@ -180,6 +180,7 @@ struct packet_traits<float> : default_packet_traits {
AlignedOnScalar = 1, AlignedOnScalar = 1,
size = 4, size = 4,
HasCmp = 1,
HasAdd = 1, HasAdd = 1,
HasSub = 1, HasSub = 1,
HasMul = 1, HasMul = 1,

View File

@ -362,11 +362,7 @@ template <typename Scalar, typename Exponent>
struct functor_traits<scalar_pow_op<Scalar, Exponent>> { struct functor_traits<scalar_pow_op<Scalar, Exponent>> {
enum { enum {
Cost = 5 * NumTraits<Scalar>::MulCost, Cost = 5 * NumTraits<Scalar>::MulCost,
PacketAccess = (!NumTraits<Scalar>::IsComplex && !NumTraits<Scalar>::IsInteger && packet_traits<Scalar>::HasExp && PacketAccess = (!NumTraits<Scalar>::IsComplex && !NumTraits<Scalar>::IsInteger && packet_traits<Scalar>::HasPow)
packet_traits<Scalar>::HasLog && packet_traits<Scalar>::HasRound && packet_traits<Scalar>::HasCmp &&
// Temporarily disable packet access for half/bfloat16 until
// accuracy is improved.
!is_same<Scalar, half>::value && !is_same<Scalar, bfloat16>::value)
}; };
}; };