gpt4 book ai didi

c - AVX/SSE 版本的 xorshift128+

转载 作者:太空狗 更新时间:2023-10-29 16:48:25 30 4
gpt4 key购买 nike

我正在努力制作尽可能快的高质量 RNG。看完http://xorshift.di.unimi.it/ , xorshift128+ 似乎是个不错的选择。 C代码是

#include <stdint.h>
uint64_t s[ 2 ];

uint64_t next(void) {
uint64_t s1 = s[ 0 ];
const uint64_t s0 = s[ 1 ];
s[ 0 ] = s0;
s1 ^= s1 << 23; // a
return ( s[ 1 ] = ( s1 ^ s0 ^ ( s1 >> 17 ) ^ ( s0 >> 26 ) ) ) + s0; // b, c
}

很遗憾,我不是 SSE/AVX 专家,但我的 CPU 支持 SSE4.1/SSE4.2/AVX/F16C/FMA3/XOP 指令。你如何使用它们来加速这段代码(假设你想生成数十亿个这样的随机数),这种加速在实践中的预期限制是什么?

最佳答案

对于可能遇到此问题的任何其他人,我认为此 C++ 代码使用 AVX2 正确地实现了 4 个并行运行的 xorshift128plus 生成器:

__m256i xorshift128plus_avx2(__m256i &state0, __m256i &state1)
{
__m256i s1 = state0;
const __m256i s0 = state1;
state0 = s0;
s1 = _mm256_xor_si256(s1, _mm256_slli_epi64(s1, 23));
state1 = _mm256_xor_si256(_mm256_xor_si256(_mm256_xor_si256(s1, s0),
_mm256_srli_epi64(s1, 18)),
_mm256_srli_epi64(s0, 5));
return _mm256_add_epi64(state1, s0);
}

我使用的标量实现是:

u64 xorshift128plus(u64 &state0, u64 &state1)
{
u64 s1 = state0;
const u64 s0 = state1;
state0 = s0;
s1 ^= s1 << 23; // a
state1 = s1 ^ s0 ^ (s1 >> 18) ^ (s0 >> 5); // b, c
return state1 + s0;
}

xorshiftplus paper 中的相同.请注意,原始问题中的右移常数与论文中的不对应。

关于c - AVX/SSE 版本的 xorshift128+,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24001930/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com