【发布时间】:2017-01-16 13:41:59
【问题描述】:
我正在尝试在 MPI 代码中使用 fortran 内部 PRNG。
我从link 了解到,GFortran 使用 xorshift1024* 实现 PRNG,周期为 2^1024 - 1。它还说:
请注意,在多线程程序中(例如,使用 OpenMP 指令), 每个线程都有自己的随机数状态。
然后看了this我发现:
当一个新线程使用 RANDOM_NUMBER第一次,种子从master复制 种子,并转发 N * 2^512 步以保证随机 stream 不会为系统中的任何其他流添加别名,其中 N 是 到目前为止使用过 RANDOM_NUMBER 的线程数 程序执行
如果这是 GFortran 的自动功能,它只适用于 OpenMP?如果我想使用 MPI 进行并行 PRNG 怎么办?如何确保代码对其他编译器的可移植性?
换句话说:有什么方法可以使用 fortran 内在指令以可移植的方式执行 GFortran 所说的操作(即保证真正的并行 PRNG)?
注意:我在 MPI 中使用数字食谱的 PRNG。几年来效果很好,但现在我在整数模型的一些假设中遇到了一些错误,Numerical Recipes 所说的超出了 fortran ......所以我不知道如何解决这个问题,这就是我想要使用的方式如果可能的话,内在的 PRNG。
【问题讨论】:
-
如果您关心跨编译器(甚至是编译器版本)的可移植性/一致性,那么
random_number(和random_seed)将会出现很多问题。 -
有没有什么方法可以按照 GFortran 所说的那样做……使用 fortran 内部指令以可移植的方式? 不,这 -- stackoverflow.com/questions/8920411/… -- 可能有用。
-
感谢您的 cmets。如果内在函数不可移植并且数字食谱似乎也不可移植(根据我的经验)。您还建议哪些其他库、子例程或方法?
标签: random fortran mpi gfortran