mirror of
https://github.com/leejet/stable-diffusion.cpp.git
synced 2026-09-24 20:20:37 +00:00
perf: eliminate temporary allocations in Philox rounds (#1982)
This commit is contained in:
parent
3161505fe8
commit
cc515a01f9
@ -19,13 +19,6 @@ private:
|
|||||||
float two_pow32_inv = 2.3283064e-10f;
|
float two_pow32_inv = 2.3283064e-10f;
|
||||||
float two_pow32_inv_2pi = 2.3283064e-10f * 6.2831855f;
|
float two_pow32_inv_2pi = 2.3283064e-10f * 6.2831855f;
|
||||||
|
|
||||||
std::vector<uint32_t> uint32(uint64_t x) {
|
|
||||||
std::vector<uint32_t> result(2);
|
|
||||||
result[0] = static_cast<uint32_t>(x & 0xFFFFFFFF);
|
|
||||||
result[1] = static_cast<uint32_t>(x >> 32);
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
std::vector<std::vector<uint32_t>> uint32(const std::vector<uint64_t>& x) {
|
std::vector<std::vector<uint32_t>> uint32(const std::vector<uint64_t>& x) {
|
||||||
uint32_t N = (uint32_t)x.size();
|
uint32_t N = (uint32_t)x.size();
|
||||||
std::vector<std::vector<uint32_t>> result(2, std::vector<uint32_t>(N));
|
std::vector<std::vector<uint32_t>> result(2, std::vector<uint32_t>(N));
|
||||||
@ -43,13 +36,13 @@ private:
|
|||||||
const std::vector<std::vector<uint32_t>>& key) {
|
const std::vector<std::vector<uint32_t>>& key) {
|
||||||
uint32_t N = (uint32_t)counter[0].size();
|
uint32_t N = (uint32_t)counter[0].size();
|
||||||
for (uint32_t i = 0; i < N; i++) {
|
for (uint32_t i = 0; i < N; i++) {
|
||||||
std::vector<uint32_t> v1 = uint32(static_cast<uint64_t>(counter[0][i]) * static_cast<uint64_t>(philox_m[0]));
|
const uint64_t v1 = static_cast<uint64_t>(counter[0][i]) * static_cast<uint64_t>(philox_m[0]);
|
||||||
std::vector<uint32_t> v2 = uint32(static_cast<uint64_t>(counter[2][i]) * static_cast<uint64_t>(philox_m[1]));
|
const uint64_t v2 = static_cast<uint64_t>(counter[2][i]) * static_cast<uint64_t>(philox_m[1]);
|
||||||
|
|
||||||
counter[0][i] = v2[1] ^ counter[1][i] ^ key[0][i];
|
counter[0][i] = static_cast<uint32_t>(v2 >> 32) ^ counter[1][i] ^ key[0][i];
|
||||||
counter[1][i] = v2[0];
|
counter[1][i] = static_cast<uint32_t>(v2);
|
||||||
counter[2][i] = v1[1] ^ counter[3][i] ^ key[1][i];
|
counter[2][i] = static_cast<uint32_t>(v1 >> 32) ^ counter[3][i] ^ key[1][i];
|
||||||
counter[3][i] = v1[0];
|
counter[3][i] = static_cast<uint32_t>(v1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -126,4 +119,4 @@ public:
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // __SD_CORE_RNG_PHILOX_HPP__
|
#endif // __SD_CORE_RNG_PHILOX_HPP__
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user