我正在尝试制作最快速度、高质量的随机数生成器。阅读了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指令。如果你想加速此代码(假设你要生成数十亿个随机数),你该如何利用这些指令,并在实践中期望速度提升的限制是什么?
_mm256_xor
是可结合的,你可以使用不同的操作顺序来获得更多指令级并行性。s1 ^ s0
可以与移位同时运行,但我误读了,实际上s1 ^ s0
在最内部嵌套中。我发现将大量内嵌的指令写成单个表达式难以阅读,最好为临时变量命名具有描述性的名称以提高可读性。因此,这里的gcc生成了良好的代码。 - Peter Cordes