19 return a.
v[0] == b.
v[0] && a.
v[1] == b.
v[1] && a.
v[2] == b.
v[2] && a.
v[3] == b.
v[3];
29 const std::uint64_t p =
static_cast<std::uint64_t
>(a) *
static_cast<std::uint64_t
>(b);
30 hi =
static_cast<std::uint32_t
>(p >> 32);
31 lo =
static_cast<std::uint32_t
>(p);
37 constexpr std::uint32_t kM0 = 0xD2511F53u, kM1 = 0xCD9E8D57u;
38 constexpr std::uint32_t kW0 = 0x9E3779B9u, kW1 = 0xBB67AE85u;
39 for (
int round = 0; round < 10; ++round) {
44 std::uint32_t hi0 = 0, lo0 = 0, hi1 = 0, lo1 = 0;
47 ctr =
U32x4{{hi1 ^ ctr.
v[1] ^ key.v[0], lo1, hi0 ^ ctr.
v[3] ^ key.v[1], lo0}};
54 x += 0x9E3779B97F4A7C15ull;
55 x = (x ^ (x >> 30)) * 0xBF58476D1CE4E5B9ull;
56 x = (x ^ (x >> 27)) * 0x94D049BB133111EBull;
64 TM_HD constexpr RngStream(std::uint64_t seed, std::uint32_t stage, std::uint64_t item)
65 : key_{static_cast<std::uint32_t>(
splitmix64(seed ^ (static_cast<std::uint64_t>(stage) << 32))),
66 static_cast<std::uint32_t>(
splitmix64(seed + stage) >> 32)},
71 const U32x4 ctr{{
static_cast<std::uint32_t
>(n),
static_cast<std::uint32_t
>(n >> 32),
72 static_cast<std::uint32_t
>(item_),
static_cast<std::uint32_t
>(item_ >> 32)}};
77 TM_HD constexpr std::uint64_t
u64(std::uint64_t n)
const {
79 return (
static_cast<std::uint64_t
>(b.
v[0]) << 32) | b.
v[1];
84 return static_cast<double>(
u64(n) >> 11) * 0x1.0p-53;
88 std::uint32_t key_[2];
TM_HD constexpr U32x4 block(std::uint64_t n) const
Four 32-bit values for block n of this stream.
TM_HD constexpr std::uint64_t u64(std::uint64_t n) const
Draw n as a 64-bit value.
TM_HD constexpr double uniform(std::uint64_t n) const
Draw n as a double in [0, 1) with 53 random bits.
TM_HD constexpr RngStream(std::uint64_t seed, std::uint32_t stage, std::uint64_t item)
TM_HD marks functions that must compile identically for host and device.
TM_HD_INLINE constexpr void mul_hi_lo(std::uint32_t a, std::uint32_t b, std::uint32_t &hi, std::uint32_t &lo)
TM_HD_INLINE constexpr U32x4 philox4x32_10(U32x4 ctr, U32x2 key)
One Philox4x32-10 block: 128 random bits for a 128-bit counter under a 64-bit key.
TM_HD_INLINE constexpr std::uint64_t splitmix64(std::uint64_t x)
SplitMix64 finaliser: a fast, well-mixed 64-bit hash, used to derive keys and for hashing ids.
TM_HD friend constexpr bool operator==(const U32x4 &a, const U32x4 &b)