MCKL
Monte Carlo Kernel Library
Classes | Namespaces | Macros
threefry_avx2_4x32.hpp File Reference
#include <mckl/random/internal/common.hpp>
#include <mckl/random/internal/threefry_common.hpp>
#include <mckl/random/internal/threefry_constants.hpp>
#include <mckl/random/internal/threefry_generic_4x32.hpp>

Go to the source code of this file.

Classes

class  mckl::internal::Threefry4x32GeneratorAVX2Impl< T >
 

Namespaces

 mckl
 
 mckl::internal
 

Macros

#define MCKL_RANDOM_INTERNAL_THREEFRY_AVX2_4X32_CYCLE_4(N)
 
#define MCKL_RANDOM_INTERNAL_THREEFRY_AVX2_4X32_CYCLE_8(N)
 
#define MCKL_RANDOM_INTERNAL_THREEFRY_AVX2_4X32_KBOX(N)
 
#define MCKL_RANDOM_INTERNAL_THREEFRY_AVX2_4X32_RBOX(N)
 

Macro Definition Documentation

◆ MCKL_RANDOM_INTERNAL_THREEFRY_AVX2_4X32_CYCLE_4

#define MCKL_RANDOM_INTERNAL_THREEFRY_AVX2_4X32_CYCLE_4 (   N)
Value:
MCKL_RANDOM_INTERNAL_THREEFRY_AVX2_4X32_RBOX(N * 8 + 2); \
MCKL_RANDOM_INTERNAL_THREEFRY_AVX2_4X32_RBOX(N * 8 + 3); \
MCKL_RANDOM_INTERNAL_THREEFRY_AVX2_4X32_RBOX(N * 8 + 4); \
MCKL_RANDOM_INTERNAL_THREEFRY_AVX2_4X32_KBOX(N * 8 + 4);
#define MCKL_RANDOM_INTERNAL_THREEFRY_AVX2_4X32_RBOX(N)

Definition at line 88 of file threefry_avx2_4x32.hpp.

◆ MCKL_RANDOM_INTERNAL_THREEFRY_AVX2_4X32_CYCLE_8

#define MCKL_RANDOM_INTERNAL_THREEFRY_AVX2_4X32_CYCLE_8 (   N)
Value:
MCKL_RANDOM_INTERNAL_THREEFRY_AVX2_4X32_RBOX(N * 8 + 2); \
MCKL_RANDOM_INTERNAL_THREEFRY_AVX2_4X32_RBOX(N * 8 + 3); \
MCKL_RANDOM_INTERNAL_THREEFRY_AVX2_4X32_RBOX(N * 8 + 4); \
MCKL_RANDOM_INTERNAL_THREEFRY_AVX2_4X32_KBOX(N * 8 + 4); \
MCKL_RANDOM_INTERNAL_THREEFRY_AVX2_4X32_RBOX(N * 8 + 5); \
MCKL_RANDOM_INTERNAL_THREEFRY_AVX2_4X32_RBOX(N * 8 + 6); \
MCKL_RANDOM_INTERNAL_THREEFRY_AVX2_4X32_RBOX(N * 8 + 7); \
MCKL_RANDOM_INTERNAL_THREEFRY_AVX2_4X32_RBOX(N * 8 + 8); \
MCKL_RANDOM_INTERNAL_THREEFRY_AVX2_4X32_KBOX(N * 8 + 8);
#define MCKL_RANDOM_INTERNAL_THREEFRY_AVX2_4X32_RBOX(N)

Definition at line 95 of file threefry_avx2_4x32.hpp.

◆ MCKL_RANDOM_INTERNAL_THREEFRY_AVX2_4X32_KBOX

#define MCKL_RANDOM_INTERNAL_THREEFRY_AVX2_4X32_KBOX (   N)
Value:
ymmt0 = _mm256_set1_epi32( \
static_cast<int>(ThreefryKBox<T, K, N>::template key<0>(par))); \
ymmt1 = _mm256_set1_epi32( \
static_cast<int>(ThreefryKBox<T, K, N>::template key<1>(par))); \
ymmt2 = _mm256_set1_epi32( \
static_cast<int>(ThreefryKBox<T, K, N>::template key<2>(par))); \
ymmt3 = _mm256_set1_epi32( \
static_cast<int>(ThreefryKBox<T, K, N>::template key<3>(par))); \
ymms0 = _mm256_add_epi32(ymms0, ymmt0); \
ymms1 = _mm256_add_epi32(ymms1, ymmt1); \
ymms2 = _mm256_add_epi32(ymms2, ymmt2); \
ymms3 = _mm256_add_epi32(ymms3, ymmt3); \
ymms4 = _mm256_add_epi32(ymms4, ymmt0); \
ymms5 = _mm256_add_epi32(ymms5, ymmt1); \
ymms6 = _mm256_add_epi32(ymms6, ymmt2); \
ymms7 = _mm256_add_epi32(ymms7, ymmt3);

Definition at line 42 of file threefry_avx2_4x32.hpp.

◆ MCKL_RANDOM_INTERNAL_THREEFRY_AVX2_4X32_RBOX

#define MCKL_RANDOM_INTERNAL_THREEFRY_AVX2_4X32_RBOX (   N)
Value:
{ \
constexpr int L0 = Constants::rotate::value[0][(N - 1) % 8]; \
constexpr int L1 = Constants::rotate::value[1][(N - 1) % 8]; \
constexpr int R0 = 32 - L0; \
constexpr int R1 = 32 - L1; \
ymms0 = _mm256_add_epi32(ymms0, ymms1); \
ymms2 = _mm256_add_epi32(ymms2, ymms3); \
ymms4 = _mm256_add_epi32(ymms4, ymms5); \
ymms6 = _mm256_add_epi32(ymms6, ymms7); \
ymmt1 = _mm256_slli_epi32(ymms1, L0); \
ymmt3 = _mm256_slli_epi32(ymms3, L1); \
ymmt5 = _mm256_slli_epi32(ymms5, L0); \
ymmt7 = _mm256_slli_epi32(ymms7, L1); \
ymms1 = _mm256_srli_epi32(ymms1, R0); \
ymms3 = _mm256_srli_epi32(ymms3, R1); \
ymms5 = _mm256_srli_epi32(ymms5, R0); \
ymms7 = _mm256_srli_epi32(ymms7, R1); \
ymmt1 = _mm256_or_si256(ymms1, ymmt1); \
ymmt3 = _mm256_or_si256(ymms3, ymmt3); \
ymmt5 = _mm256_or_si256(ymms5, ymmt5); \
ymmt7 = _mm256_or_si256(ymms7, ymmt7); \
ymms1 = _mm256_xor_si256(ymms2, ymmt3); \
ymms3 = _mm256_xor_si256(ymms0, ymmt1); \
ymms5 = _mm256_xor_si256(ymms6, ymmt7); \
ymms7 = _mm256_xor_si256(ymms4, ymmt5); \
}

Definition at line 60 of file threefry_avx2_4x32.hpp.