21#if defined(OQMC_ARCH_AVX)
25#if defined(OQMC_ARCH_SSE)
29#if defined(OQMC_ARCH_ARM)
51#if defined(OQMC_ARCH_SCALAR)
57#if defined(__CUDA_ARCH__)
64 index ^=
static_cast<std::uint16_t
>((index & 0x00ff) << 8);
65 index ^=
static_cast<std::uint16_t
>((index & 0x0f0f) << 4);
66 index ^=
static_cast<std::uint16_t
>((index & 0x3333) << 2);
67 index ^=
static_cast<std::uint16_t
>((index & 0x5555) << 1);
70 index ^=
static_cast<std::uint16_t
>((index & 0x0003) << 14);
71 index ^=
static_cast<std::uint16_t
>((index & 0x0004) << 13);
72 index ^=
static_cast<std::uint16_t
>((index & 0x000f) << 12);
73 index ^=
static_cast<std::uint16_t
>((index & 0x0033) << 10);
74 index ^=
static_cast<std::uint16_t
>((index & 0x0055) << 9);
75 index ^=
static_cast<std::uint16_t
>((index & 0x0030) << 8);
76 index ^=
static_cast<std::uint16_t
>((index & 0x0303) << 6);
77 index ^=
static_cast<std::uint16_t
>((index & 0x0505) << 5);
78 index ^=
static_cast<std::uint16_t
>((index & 0x0cf3) << 4);
79 index ^=
static_cast<std::uint16_t
>((index & 0x1111) << 3);
80 index ^=
static_cast<std::uint16_t
>((index & 0x0f0f) << 2);
81 index ^=
static_cast<std::uint16_t
>((index & 0x6666) << 1);
84 index ^=
static_cast<std::uint16_t
>((index & 0x000f) << 12);
85 index ^=
static_cast<std::uint16_t
>((index & 0x0030) << 10);
86 index ^=
static_cast<std::uint16_t
>((index & 0x0050) << 9);
87 index ^=
static_cast<std::uint16_t
>((index & 0x007f) << 8);
88 index ^=
static_cast<std::uint16_t
>((index & 0x03f0) << 6);
89 index ^=
static_cast<std::uint16_t
>((index & 0x0410) << 5);
90 index ^=
static_cast<std::uint16_t
>((index & 0x07e0) << 4);
91 index ^=
static_cast<std::uint16_t
>((index & 0x1c71) << 3);
92 index ^=
static_cast<std::uint16_t
>((index & 0x1c71) << 2);
93 index ^=
static_cast<std::uint16_t
>((index & 0x4924) << 1);
111 index ^=
static_cast<std::uint16_t
>((index & 0xff00) >> 8);
112 index ^=
static_cast<std::uint16_t
>((index & 0xf0f0) >> 4);
113 index ^=
static_cast<std::uint16_t
>((index & 0xcccc) >> 2);
114 index ^=
static_cast<std::uint16_t
>((index & 0xaaaa) >> 1);
117 index ^=
static_cast<std::uint16_t
>((index & 0xc000) >> 14);
118 index ^=
static_cast<std::uint16_t
>((index & 0x2000) >> 13);
119 index ^=
static_cast<std::uint16_t
>((index & 0xf000) >> 12);
120 index ^=
static_cast<std::uint16_t
>((index & 0xcc00) >> 10);
121 index ^=
static_cast<std::uint16_t
>((index & 0xaa00) >> 9);
122 index ^=
static_cast<std::uint16_t
>((index & 0x0c00) >> 8);
123 index ^=
static_cast<std::uint16_t
>((index & 0xc0c0) >> 6);
124 index ^=
static_cast<std::uint16_t
>((index & 0xa0a0) >> 5);
125 index ^=
static_cast<std::uint16_t
>((index & 0xcf30) >> 4);
126 index ^=
static_cast<std::uint16_t
>((index & 0x8888) >> 3);
127 index ^=
static_cast<std::uint16_t
>((index & 0xf0f0) >> 2);
128 index ^=
static_cast<std::uint16_t
>((index & 0x6666) >> 1);
131 index ^=
static_cast<std::uint16_t
>((index & 0xf000) >> 12);
132 index ^=
static_cast<std::uint16_t
>((index & 0x0c00) >> 10);
133 index ^=
static_cast<std::uint16_t
>((index & 0x0a00) >> 9);
134 index ^=
static_cast<std::uint16_t
>((index & 0xfe00) >> 8);
135 index ^=
static_cast<std::uint16_t
>((index & 0x0fc0) >> 6);
136 index ^=
static_cast<std::uint16_t
>((index & 0x0820) >> 5);
137 index ^=
static_cast<std::uint16_t
>((index & 0x07e0) >> 4);
138 index ^=
static_cast<std::uint16_t
>((index & 0x8e38) >> 3);
139 index ^=
static_cast<std::uint16_t
>((index & 0x8e38) >> 2);
140 index ^=
static_cast<std::uint16_t
>((index & 0x2492) >> 1);
162 constexpr std::uint16_t
masks[16] = {
262#if defined(OQMC_ARCH_AVX)
263 constexpr auto stride = 16;
291#if defined(OQMC_ARCH_SSE)
292 constexpr auto stride = 8;
320#if defined(OQMC_ARCH_ARM)
321 constexpr auto stride = 8;
384 static_assert(
Depth >= 1,
"Pattern depth is greater or equal to one.");
385 static_assert(
Depth <= 4,
"Pattern depth is less or equal to four.");
#define OQMC_HOST_DEVICE
Definition gpu.h:13
constexpr std::uint32_t reverseAndShuffle(std::uint32_t value, std::uint32_t seed)
Reverse input bits and shuffle order.
Definition permute.h:54
constexpr std::uint32_t rotateBytes(std::uint32_t value, int distance)
Rotate bytes in an integer value.
Definition rotate.h:41
EncodeKey decodeBits16(std::uint16_t value)
Decode a value back into a key.
Definition encode.h:81
constexpr std::uint16_t reverseBits16(std::uint16_t value)
Reverse bits of an unsigned 16 bit integer.
Definition reverse.h:53
constexpr std::uint32_t laineKarrasPermutation(std::uint32_t value, std::uint32_t seed)
Laine and Karras style permutation.
Definition permute.h:34
constexpr std::uint32_t reverseBits32(std::uint32_t value)
Reverse bits of an unsigned 32 bit integer.
Definition reverse.h:25
void shuffledScrambledSobol(std::uint32_t index, std::uint32_t seed, std::uint32_t sample[Depth])
Compute a randomised sobol sequence value.
Definition owen.h:380
constexpr std::uint32_t scrambleAndReverse(std::uint32_t value, std::uint32_t seed)
Permute an input integer and reverse the bits.
Definition owen.h:359
std::uint16_t sobolReversedIndex(std::uint16_t index, int dimension)
Compute sobol sequence value at an index with reversed bits.
Definition owen.h:45