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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -362,11 +362,7 @@ template <typename Scalar, typename Exponent>
struct functor_traits<scalar_pow_op<Scalar, Exponent>> {
enum {
Cost = 5 * NumTraits<Scalar>::MulCost,
PacketAccess = (!NumTraits<Scalar>::IsComplex && !NumTraits<Scalar>::IsInteger && packet_traits<Scalar>::HasExp &&
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)
PacketAccess = (!NumTraits<Scalar>::IsComplex && !NumTraits<Scalar>::IsInteger && packet_traits<Scalar>::HasPow)
};
};