mirror of
https://gitlab.com/libeigen/eigen.git
synced 2026-04-10 11:34:33 +08:00
Special function implementations for half/bfloat16 packets.
Current implementations fail to consider half-float packets, only half-float scalars. Added specializations for packets on AVX, AVX512 and NEON. Added tests to `special_packetmath`. The current `special_functions` tests would fail for half and bfloat16 due to lack of precision. The NEON tests also fail with precision issues and due to different handling of `sqrt(inf)`, so special functions bessel, ndtri have been disabled. Tested with AVX, AVX512.
This commit is contained in:
@@ -348,7 +348,7 @@ EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE T generic_fast_erf_float(const T& a_x) {
|
||||
template <typename T>
|
||||
struct erf_impl {
|
||||
EIGEN_DEVICE_FUNC
|
||||
static EIGEN_STRONG_INLINE T run(const T x) {
|
||||
static EIGEN_STRONG_INLINE T run(const T& x) {
|
||||
return generic_fast_erf_float(x);
|
||||
}
|
||||
};
|
||||
@@ -490,7 +490,8 @@ struct erfc_impl<double> {
|
||||
template<typename T>
|
||||
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE T flipsign(
|
||||
const T& should_flipsign, const T& x) {
|
||||
const T sign_mask = pset1<T>(-0.0);
|
||||
typedef typename unpacket_traits<T>::type Scalar;
|
||||
const T sign_mask = pset1<T>(Scalar(-0.0));
|
||||
T sign_bit = pand<T>(should_flipsign, sign_mask);
|
||||
return pxor<T>(sign_bit, x);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user