Eigen::internal::unary_pow Namespace Reference

Classes

struct  exponent_helper
 
struct  exponent_helper< ScalarExponent, true >
 
struct  reciprocate
 
struct  reciprocate< Packet, ScalarExponent, false >
 

Functions

template<typename Packet , typename ScalarExponent >
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet int_pow (const Packet &x, const ScalarExponent &exponent)
 
template<typename Packet >
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet gen_pow (const Packet &x, const typename unpacket_traits< Packet >::type &exponent)
 
template<typename Packet , typename ScalarExponent >
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet handle_nonint_nonint_errors (const Packet &x, const Packet &powx, const ScalarExponent &exponent)
 
template<typename Packet , typename ScalarExponent , std::enable_if_t< NumTraits< typename unpacket_traits< Packet >::type >::IsSigned, bool > = true>
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet handle_negative_exponent (const Packet &x, const ScalarExponent &exponent)
 

Function Documentation

◆ gen_pow()

template<typename Packet >
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet Eigen::internal::unary_pow::gen_pow ( const Packet x,
const typename unpacket_traits< Packet >::type &  exponent 
)
2215  {
2216  const Packet exponent_packet = pset1<Packet>(exponent);
2217  return generic_pow_impl(x, exponent_packet);
2218 }
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet generic_pow_impl(const Packet &x, const Packet &y)
Definition: GenericPacketMathFunctions.h:1987
list x
Definition: plotDoE.py:28

References Eigen::internal::generic_pow_impl(), and plotDoE::x.

Referenced by Eigen::internal::unary_pow_impl< Packet, ScalarExponent, false, false, ExponentIsSigned >::run().

◆ handle_negative_exponent()

template<typename Packet , typename ScalarExponent , std::enable_if_t< NumTraits< typename unpacket_traits< Packet >::type >::IsSigned, bool > = true>
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet Eigen::internal::unary_pow::handle_negative_exponent ( const Packet x,
const ScalarExponent &  exponent 
)
2271  {
2272  using Scalar = typename unpacket_traits<Packet>::type;
2273 
2274  // signed integer base, signed integer exponent case
2275 
2276  // This routine handles negative exponents.
2277  // The return value is either 0, 1, or -1.
2278 
2279  const Scalar pos_zero = Scalar(0);
2280  const Scalar all_ones = ptrue<Scalar>(Scalar());
2281  const Scalar pos_one = Scalar(1);
2282 
2283  const Packet cst_pos_one = pset1<Packet>(pos_one);
2284 
2285  const bool exponent_is_odd = exponent % ScalarExponent(2) != ScalarExponent(0);
2286 
2287  const Packet exp_is_odd = pset1<Packet>(exponent_is_odd ? all_ones : pos_zero);
2288 
2289  const Packet abs_x = pabs(x);
2290  const Packet abs_x_is_one = pcmp_eq(abs_x, cst_pos_one);
2291 
2292  Packet result = pselect(exp_is_odd, x, abs_x);
2293  result = pand(abs_x_is_one, result);
2294  return result;
2295 }
SCALAR Scalar
Definition: bench_gemm.cpp:45
EIGEN_STRONG_INLINE Packet4f pabs(const Packet4f &a)
Definition: AltiVec/PacketMath.h:1936
EIGEN_STRONG_INLINE Packet2cf pcmp_eq(const Packet2cf &a, const Packet2cf &b)
Definition: AltiVec/Complex.h:353
EIGEN_STRONG_INLINE Packet8h pand(const Packet8h &a, const Packet8h &b)
Definition: AVX/PacketMath.h:2319
EIGEN_STRONG_INLINE Packet4f pselect(const Packet4f &mask, const Packet4f &a, const Packet4f &b)
Definition: AltiVec/PacketMath.h:1474
type
Definition: compute_granudrum_aor.py:141

References Eigen::internal::pabs(), Eigen::internal::pand(), Eigen::internal::pcmp_eq(), Eigen::internal::pselect(), and plotDoE::x.

Referenced by Eigen::internal::unary_pow_impl< Packet, ScalarExponent, true, true, true >::run().

◆ handle_nonint_nonint_errors()

template<typename Packet , typename ScalarExponent >
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet Eigen::internal::unary_pow::handle_nonint_nonint_errors ( const Packet x,
const Packet powx,
const ScalarExponent &  exponent 
)
2222  {
2223  using Scalar = typename unpacket_traits<Packet>::type;
2224 
2225  // non-integer base and exponent case
2226 
2227  const Scalar pos_zero = Scalar(0);
2228  const Scalar all_ones = ptrue<Scalar>(Scalar());
2229  const Scalar pos_one = Scalar(1);
2230  const Scalar pos_inf = NumTraits<Scalar>::infinity();
2231 
2232  const Packet cst_pos_zero = pzero(x);
2233  const Packet cst_pos_one = pset1<Packet>(pos_one);
2234  const Packet cst_pos_inf = pset1<Packet>(pos_inf);
2235 
2236  const bool exponent_is_not_fin = !(numext::isfinite)(exponent);
2237  const bool exponent_is_neg = exponent < ScalarExponent(0);
2238  const bool exponent_is_pos = exponent > ScalarExponent(0);
2239 
2240  const Packet exp_is_not_fin = pset1<Packet>(exponent_is_not_fin ? all_ones : pos_zero);
2241  const Packet exp_is_neg = pset1<Packet>(exponent_is_neg ? all_ones : pos_zero);
2242  const Packet exp_is_pos = pset1<Packet>(exponent_is_pos ? all_ones : pos_zero);
2243  const Packet exp_is_inf = pand(exp_is_not_fin, por(exp_is_neg, exp_is_pos));
2244  const Packet exp_is_nan = pandnot(exp_is_not_fin, por(exp_is_neg, exp_is_pos));
2245 
2246  const Packet x_is_le_zero = pcmp_le(x, cst_pos_zero);
2247  const Packet x_is_ge_zero = pcmp_le(cst_pos_zero, x);
2248  const Packet x_is_zero = pand(x_is_le_zero, x_is_ge_zero);
2249 
2250  const Packet abs_x = pabs(x);
2251  const Packet abs_x_is_le_one = pcmp_le(abs_x, cst_pos_one);
2252  const Packet abs_x_is_ge_one = pcmp_le(cst_pos_one, abs_x);
2253  const Packet abs_x_is_inf = pcmp_eq(abs_x, cst_pos_inf);
2254  const Packet abs_x_is_one = pand(abs_x_is_le_one, abs_x_is_ge_one);
2255 
2256  Packet pow_is_inf_if_exp_is_neg = por(x_is_zero, pand(abs_x_is_le_one, exp_is_inf));
2257  Packet pow_is_inf_if_exp_is_pos = por(abs_x_is_inf, pand(abs_x_is_ge_one, exp_is_inf));
2258  Packet pow_is_one = pand(abs_x_is_one, por(exp_is_inf, x_is_ge_zero));
2259 
2260  Packet result = powx;
2261  result = por(x_is_le_zero, result);
2262  result = pselect(pow_is_inf_if_exp_is_neg, pand(cst_pos_inf, exp_is_neg), result);
2263  result = pselect(pow_is_inf_if_exp_is_pos, pand(cst_pos_inf, exp_is_pos), result);
2264  result = por(exp_is_nan, result);
2265  result = pselect(pow_is_one, cst_pos_one, result);
2266  return result;
2267 }
#define isfinite(X)
Definition: main.h:111
EIGEN_STRONG_INLINE Packet8f pzero(const Packet8f &)
Definition: AVX/PacketMath.h:774
EIGEN_STRONG_INLINE Packet4f pcmp_le(const Packet4f &a, const Packet4f &b)
Definition: AltiVec/PacketMath.h:1314
EIGEN_STRONG_INLINE Packet8h por(const Packet8h &a, const Packet8h &b)
Definition: AVX/PacketMath.h:2309
EIGEN_STRONG_INLINE Packet8h pandnot(const Packet8h &a, const Packet8h &b)
Definition: AVX/PacketMath.h:2323

References Eigen::numext::isfinite(), Eigen::internal::pabs(), Eigen::internal::pand(), Eigen::internal::pandnot(), Eigen::internal::pcmp_eq(), Eigen::internal::pcmp_le(), Eigen::internal::por(), Eigen::internal::pselect(), Eigen::internal::pzero(), and plotDoE::x.

Referenced by Eigen::internal::unary_pow_impl< Packet, ScalarExponent, false, false, ExponentIsSigned >::run().

◆ int_pow()

template<typename Packet , typename ScalarExponent >
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet Eigen::internal::unary_pow::int_pow ( const Packet x,
const ScalarExponent &  exponent 
)
2192  {
2193  using Scalar = typename unpacket_traits<Packet>::type;
2194  using ExponentHelper = exponent_helper<ScalarExponent>;
2195  using AbsExponentType = typename ExponentHelper::safe_abs_type;
2196  const Packet cst_pos_one = pset1<Packet>(Scalar(1));
2197  if (exponent == ScalarExponent(0)) return cst_pos_one;
2198 
2200  Packet y = cst_pos_one;
2201  AbsExponentType m = ExponentHelper::safe_abs(exponent);
2202 
2203  while (m > 1) {
2204  bool odd = ExponentHelper::is_odd(m);
2205  if (odd) y = pmul(y, result);
2206  result = pmul(result, result);
2207  m = ExponentHelper::floor_div_two(m);
2208  }
2209 
2210  return pmul(y, result);
2211 }
bool is_odd(const Exponent &exp)
Definition: array_cwise.cpp:252
Scalar * y
Definition: level1_cplx_impl.h:128
int * m
Definition: level2_cplx_impl.h:294
EIGEN_STRONG_INLINE Packet4cf pmul(const Packet4cf &a, const Packet4cf &b)
Definition: AVX/Complex.h:88
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 is_odd(), m, Eigen::internal::pmul(), Eigen::internal::unary_pow::reciprocate< Packet, ScalarExponent, ReciprocateIfExponentIsNegative >::run(), plotDoE::x, and Eigen::internal::y.

Referenced by Eigen::internal::unary_pow_impl< Packet, ScalarExponent, false, false, ExponentIsSigned >::run(), Eigen::internal::unary_pow_impl< Packet, ScalarExponent, false, true, ExponentIsSigned >::run(), Eigen::internal::unary_pow_impl< Packet, ScalarExponent, true, true, true >::run(), and Eigen::internal::unary_pow_impl< Packet, ScalarExponent, true, true, false >::run().