From d0528cb2fe8c9dca4d75c3bdba85092c2f94022d Mon Sep 17 00:00:00 2001 From: leejet Date: Thu, 17 Sep 2026 01:52:22 +0800 Subject: [PATCH] perf: eliminate temporary allocations in Philox rounds --- src/core/rng_philox.hpp | 21 +++++++-------------- 1 file changed, 7 insertions(+), 14 deletions(-) diff --git a/src/core/rng_philox.hpp b/src/core/rng_philox.hpp index 5538bb53c..56760d379 100644 --- a/src/core/rng_philox.hpp +++ b/src/core/rng_philox.hpp @@ -19,13 +19,6 @@ class PhiloxRNG : public RNG { float two_pow32_inv = 2.3283064e-10f; float two_pow32_inv_2pi = 2.3283064e-10f * 6.2831855f; - std::vector uint32(uint64_t x) { - std::vector result(2); - result[0] = static_cast(x & 0xFFFFFFFF); - result[1] = static_cast(x >> 32); - return result; - } - std::vector> uint32(const std::vector& x) { uint32_t N = (uint32_t)x.size(); std::vector> result(2, std::vector(N)); @@ -43,13 +36,13 @@ class PhiloxRNG : public RNG { const std::vector>& key) { uint32_t N = (uint32_t)counter[0].size(); for (uint32_t i = 0; i < N; i++) { - std::vector v1 = uint32(static_cast(counter[0][i]) * static_cast(philox_m[0])); - std::vector v2 = uint32(static_cast(counter[2][i]) * static_cast(philox_m[1])); + const uint64_t v1 = static_cast(counter[0][i]) * static_cast(philox_m[0]); + const uint64_t v2 = static_cast(counter[2][i]) * static_cast(philox_m[1]); - counter[0][i] = v2[1] ^ counter[1][i] ^ key[0][i]; - counter[1][i] = v2[0]; - counter[2][i] = v1[1] ^ counter[3][i] ^ key[1][i]; - counter[3][i] = v1[0]; + counter[0][i] = static_cast(v2 >> 32) ^ counter[1][i] ^ key[0][i]; + counter[1][i] = static_cast(v2); + counter[2][i] = static_cast(v1 >> 32) ^ counter[3][i] ^ key[1][i]; + counter[3][i] = static_cast(v1); } } @@ -126,4 +119,4 @@ class PhiloxRNG : public RNG { } }; -#endif // __SD_CORE_RNG_PHILOX_HPP__ \ No newline at end of file +#endif // __SD_CORE_RNG_PHILOX_HPP__