【问题标题】:Pipelining the Ziggurat Random Number Generator流水线化 Ziggurat 随机数生成器
【发布时间】:2013-07-24 21:00:44
【问题描述】:

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

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

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

【问题讨论】:

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


    【解决方案1】:

    你可以看看我的 C 实现 here。 main 函数只有 20 多行代码,所以应该很容易展开循环。它还使您可以选择使用整数或浮点比较,以您的机器上更快的为准。您可以插入任何后端 RNG。

    【讨论】:

    • 算法是否依赖于 64 位的底层 RNG?我已经修改了 Colin Green 的实现,以便它使用浮点数而不是双精度数来节省内存,因为我正在为嵌入式应用程序编程。
    • 嗯,它确实一次从 RNG 获得 64 位,使用 52 作为双精度尾数,使用 7 来索引表(根据 Doonik 的改进),但没有理由你可以' t 只是调用 32 位 RNG 两次。
    • 真的,我可以。但话又说回来,我的 RNG 最终将返回浮点数,而不是双打。所以对我来说做 64 位只返回一个 32 位数字没有多大意义。
    • Lee:请参阅下面的快速 Box-Muller 答案。你能独立我的发现吗?我不完全相信在 gcc5 下不同 gcc 优化的时间是正确的
    猜你喜欢
    • 1970-01-01
    • 2023-01-03
    • 2015-03-31
    • 1970-01-01
    • 2015-03-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-05
    相关资源
    最近更新 更多