【问题标题】:How does random_number() work in parallel?random_number() 如何并行工作?
【发布时间】:2020-02-05 12:33:17
【问题描述】:

random_number() 如何与 OpenMP 并行工作?

如果我在没有并行化的情况下运行我的程序,我总是会得到相同的结果,但如果使用并行化,我每次都会得到不同(但相似)的结果。

【问题讨论】:

  • 除非事情发生了变化,这不是标准中指定的,您必须查看编译器特定版本的文档。但如果你真的关心随机数,我会使用线程安全库。我不是这里的专家,但stackoverflow.com/questions/3772100/… 可能有用

标签: parallel-processing fortran


【解决方案1】:

一般来说,关于random_number 的线程安全或线程性能无法保证。 Fortran 标准根本不了解 OpenMP。

个别编译器可能会为您提供一些保证,但它们仅对特定编译器中存在的版本有效。例如,当前的 gfortran 版本提供了线程安全的随机数生成器,"Note that in a multi-threaded program (e.g. using OpenMP directives), each thread will have its own random number state." 其他编译器可能会有所不同。值得注意的是,您的用户可能想要使用的编译器可能会有所不同,而您可能不知道这一点。

有专用的并行随机数生成器可用。例如,我使用库的modified 版本,该库使用 Ziggurat 方法处理多个随机数分布,由 Gib Bogle 并行化,我添加了 xoroshiro128+ 的实现作为底层算法,类似于 Gfortran 使用的算法。还有其他类似算法的实现可用,标准 C++ 包含一些新生成器,这些生成器实际上被定义为使用特定算法,因此您可以调用它们。

【讨论】:

    【解决方案2】:

    如果您的目标是获得可重现的随机数,请查看以下答案:https://stackoverflow.com/a/52884455/12845922

    它用 C 语言编写,但为您提供了一种有效的方法来获得可轻松转换为 Fortan 的任意数量线程的可重现结果。

    【讨论】:

      猜你喜欢
      • 2013-06-12
      • 2020-04-29
      • 2019-12-15
      • 2017-06-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多