10 #ifndef EIGEN_MATH_FUNCTIONS_FP16_AVX512_H 11 #define EIGEN_MATH_FUNCTIONS_FP16_AVX512_H 14 #include "../../InternalHeaderCheck.h" 19 EIGEN_STRONG_INLINE Packet32h combine2Packet16h(
const Packet16h& a,
const Packet16h& b) {
20 __m512i result = _mm512_castsi256_si512(_mm256_castph_si256(a));
21 result = _mm512_inserti64x4(result, _mm256_castph_si256(b), 1);
22 return _mm512_castsi512_ph(result);
25 EIGEN_STRONG_INLINE
void extract2Packet16h(
const Packet32h& x, Packet16h& a, Packet16h& b) {
26 a = _mm256_castsi256_ph(_mm512_castsi512_si256(_mm512_castph_si512(x)));
27 b = _mm256_castsi256_ph(_mm512_extracti64x4_epi64(_mm512_castph_si512(x), 1));
30 #define _EIGEN_GENERATE_FP16_MATH_FUNCTION(func) \ 32 EIGEN_STRONG_INLINE Packet8h func<Packet8h>(const Packet8h& a) { \ 33 return float2half(func(half2float(a))); \ 37 EIGEN_STRONG_INLINE Packet16h func<Packet16h>(const Packet16h& a) { \ 38 return float2half(func(half2float(a))); \ 42 EIGEN_STRONG_INLINE Packet32h func<Packet32h>(const Packet32h& a) { \ 45 extract2Packet16h(a, low, high); \ 46 return combine2Packet16h(func(low), func(high)); \ 49 _EIGEN_GENERATE_FP16_MATH_FUNCTION(psin)
50 _EIGEN_GENERATE_FP16_MATH_FUNCTION(pcos)
51 _EIGEN_GENERATE_FP16_MATH_FUNCTION(plog)
52 _EIGEN_GENERATE_FP16_MATH_FUNCTION(plog2)
53 _EIGEN_GENERATE_FP16_MATH_FUNCTION(plog1p)
54 _EIGEN_GENERATE_FP16_MATH_FUNCTION(pexp)
55 _EIGEN_GENERATE_FP16_MATH_FUNCTION(pexpm1)
56 _EIGEN_GENERATE_FP16_MATH_FUNCTION(pexp2)
57 _EIGEN_GENERATE_FP16_MATH_FUNCTION(ptanh)
58 #undef _EIGEN_GENERATE_FP16_MATH_FUNCTION 62 EIGEN_STRONG_INLINE Packet32h pfrexp<Packet32h>(
const Packet32h& a, Packet32h& exponent) {
63 return pfrexp_generic(a, exponent);
68 EIGEN_STRONG_INLINE Packet32h pldexp<Packet32h>(
const Packet32h& a,
const Packet32h& exponent) {
69 return pldexp_generic(a, exponent);
75 #endif // EIGEN_MATH_FUNCTIONS_FP16_AVX512_H Namespace containing all symbols from the Eigen library.
Definition: B01_Experimental.dox:1