32 #ifndef MCKL_RANDOM_INTERNAL_INCREMENT_AVX512_64_HPP 33 #define MCKL_RANDOM_INTERNAL_INCREMENT_AVX512_64_HPP 46 template <
typename T, std::
size_t K, std::
size_t S>
48 std::array<T, K> &ctr, std::array<__m512i, S> &s, std::false_type)
50 constexpr T blocks = (
sizeof(__m512i) *
S) / (
sizeof(T) * K);
52 alignas(
MCKL_ALIGNMENT) std::array<std::array<T, K>, blocks> ctr_block;
54 std::memcpy(s.data(), ctr_block.data(),
sizeof(__m512i) *
S);
57 template <
typename T, std::
size_t K, std::
size_t S>
59 std::array<T, K> &ctr, std::array<__m512i, S> &s, std::true_type)
61 constexpr T blocks = (
sizeof(__m512i) *
S) / (
sizeof(T) * K);
63 if (std::get<0>(ctr) < std::numeric_limits<T>::max() - blocks) {
65 std::get<0>(ctr) += blocks;
71 template <
typename T, std::
size_t K, std::
size_t S>
73 std::array<T, K> &ctr, std::array<__m512i, S> &s)
75 constexpr
bool direct =
S == 2 ||
S == 4 ||
S == 8;
76 constexpr
bool bits = std::numeric_limits<T>::digits == 64;
79 ctr, s, std::integral_constant<
bool, (direct && bits)>());
88 #endif // MCKL_RANDOM_INTERNAL_INCREMENT_AVX512_64_HPP #define MCKL_PUSH_GCC_WARNING(warning)
void increment_si512(std::array< T, K > &ctr, std::array< __m512i, S > &s, std::true_type)
void increment(std::array< T, K > &ctr, std::integral_constant< T, NSkip >)
Increment a counter by given steps.
#define MCKL_ALIGNMENT
The default alignment for scalar type.
#define MCKL_POP_GCC_WARNING