流水线化Ziggurat随机数发生器

时间:2013-07-24 21:00:45

标签: algorithm optimization random compiler-optimization random-sample

我目前正在实施一个版本的George Marsaglia的Ziggurat随机数生成器。虽然它被认为是生成高质量的正态分布随机数生成器的最快方法之一,但它充满了循环控制代码(即循环中间的返回语句,if语句,分支等)并且它使几次调用标准C函数,如exp()和log()。更不用说无限循环了。

这使代码无法被编译器流水线化。最终,我觉得这是一种基本方法,例如直接使用中心极限定理,最终可能会更快,因为它可以很容易地流水线化。不幸的是,它不适合高斯分布的尾部,因此对我的应用来说是不可接受的。

这里有人对如何减少控制代码和函数调用有任何想法。我目前正在使用Colin Green's implementation of the algorithm我移植到C.我的底层制服发生器是Tiny Mersenne Twister(所以请不要告诉我使用MT,因为我见过其他人,我已经在那里了这个讨论是针对正态分布的RNG,而不是统一的RNG)。

1 个答案:

答案 0 :(得分:2)

您可以查看我的C实现 here。主要功能只有20行代码,因此应该很容易展开循环。它还允许您选择使用整数或浮点数比较,以较快的速度在您的机器上。您可以插入任何后端RNG。