12#ifndef EIGENRAND_RAND_UTILS_AVX512_H
13#define EIGENRAND_RAND_UTILS_AVX512_H
21 template<
typename Rng>
22 struct RawbitsMaker<Packet8i, Rng, Packet16i, Rand::RandomEngineType::packet>
24 EIGEN_STRONG_INLINE Packet8i rawbits(Rng& rng)
29 EIGEN_STRONG_INLINE Packet8i rawbits_34(Rng& rng)
34 EIGEN_STRONG_INLINE Packet8i rawbits_half(Rng& rng)
40 template<
typename Rng>
41 struct RawbitsMaker<Packet16i, Rng, Packet8i, Rand::RandomEngineType::packet>
43 EIGEN_STRONG_INLINE Packet16i rawbits(Rng& rng)
45 return _mm512_inserti64x4(_mm512_castsi256_si512(rng()), rng(), 1);
48 EIGEN_STRONG_INLINE Packet16i rawbits_34(Rng& rng)
50 return _mm512_inserti64x4(_mm512_castsi256_si512(rng()), rng(), 1);
53 EIGEN_STRONG_INLINE Packet8i rawbits_half(Rng& rng)
59 template<
typename Rng,
typename RngResult>
60 struct RawbitsMaker<Packet16i, Rng, RngResult, Rand::RandomEngineType::scalar_fullbit>
62 EIGEN_STRONG_INLINE Packet16i rawbits(Rng& rng)
64 if (
sizeof(
decltype(rng())) == 8)
66 return _mm512_set_epi64(rng(), rng(), rng(), rng(),
67 rng(), rng(), rng(), rng());
71 return _mm512_set_epi32(rng(), rng(), rng(), rng(),
72 rng(), rng(), rng(), rng(),
73 rng(), rng(), rng(), rng(),
74 rng(), rng(), rng(), rng());
78 EIGEN_STRONG_INLINE Packet16i rawbits_34(Rng& rng)
83 EIGEN_STRONG_INLINE Packet8i rawbits_half(Rng& rng)
85 if (
sizeof(
decltype(rng())) == 8)
87 return _mm256_set_epi64x(rng(), rng(), rng(), rng());
91 return _mm256_set_epi32(rng(), rng(), rng(), rng(),
92 rng(), rng(), rng(), rng());
97 template<
typename Rng>
98 struct RawbitsMaker<Packet16i, Rng, Packet16i, Rand::RandomEngineType::packet>
100 EIGEN_STRONG_INLINE Packet16i rawbits(Rng& rng)
105 EIGEN_STRONG_INLINE Packet16i rawbits_34(Rng& rng)
110 EIGEN_STRONG_INLINE Packet8i rawbits_half(Rng& rng)
116 template<
typename Rng>
117 struct UniformRealUtils<Packet16f, Rng> :
public RawbitsMaker<Packet16i, Rng>
119 EIGEN_STRONG_INLINE Packet16f zero_to_one(Rng& rng)
121 return pdiv(_mm512_cvtepi32_ps(pand(this->rawbits(rng), pset1<Packet16i>(0x7FFFFFFF))),
122 pset1<Packet16f>(0x7FFFFFFF));
125 EIGEN_STRONG_INLINE Packet16f uniform_real(Rng& rng)
127 return bit_to_ur_float(this->rawbits_34(rng));
131 template<
typename Rng>
132 struct UniformRealUtils<Packet8d, Rng> :
public RawbitsMaker<Packet16i, Rng>
134 EIGEN_STRONG_INLINE Packet8d zero_to_one(Rng& rng)
136 return pdiv(_mm512_cvtepi32_pd(pand(this->rawbits_half(rng), pset1<Packet8i>(0x7FFFFFFF))),
137 pset1<Packet8d>(0x7FFFFFFF));
140 EIGEN_STRONG_INLINE Packet8d uniform_real(Rng& rng)
142 return bit_to_ur_double(this->rawbits(rng));