在并行 MPI 中使用 fortran RANDOM_SEED
Using fortran RANDOM_SEED in parallel MPI
我正在尝试在 MPI 代码中使用 fortran 内部 PRNG。
我从这个 link 了解到 GFortran 使用 xorshift1024* 实现 PRNG,其周期为 2^1024 - 1。它还说:
Note that in a multi-threaded program (e.g. using OpenMP directives),
each thread will have its own random number state.
然后阅读 this 我发现:
When a new thread uses
RANDOM_NUMBER for the first time, the seed is copied from the master
seed, and forwarded N * 2^512 steps to guarantee that the random
stream does not alias any other stream in the system, where N is the
number of threads that have used RANDOM_NUMBER so far during the
program execution
如果这是 GFortran 的自动功能,它只适用于 OpenMP?如果我想使用 MPI 进行并行 PRNG 怎么办?如何确保代码对其他编译器的可移植性?
换句话说:是否有任何方法可以使用 Fortran 内部指令以可移植的方式执行 GFortran 所说的(即保证真正的并行 PRNG)?
注意:我在 MPI 中使用了数字食谱的 PRNG。几年来效果很好,但现在我在整数模型的一些假设中遇到了一些错误,数值食谱说它超出了 fortran ......所以我不知道如何解决这个问题,这就是我想要使用的方式如果可能的话,内在的 PRNG。
如果您想要用于 Fortran 程序的多流随机数生成器的便携版本,可以使用 Mersenne Twister 的多流 Fortran 版本。请参阅 http://theo.phys.sci.hiroshima-u.ac.jp/~ishikawa/PRNG/mt_stream_en.html。它使用针对不同线程通过大量步骤推进 PRNG 的概念。它由子程序调用设置和配置,因此您应该能够在各种多线程环境中使用它。
请注意,xorshoft1024* 的使用是 GFortran 非常 的新功能,它仅在开发主干版本中可用,在撰写本文时尚未发布版本这个。它将作为 GCC 7 的一部分发布,可能在 spring 2017.
因此,当您使用 MPI 时,每个 MPI 等级都是一个单独的进程,并且每个进程中的随机数生成器是完全独立的,不同进程中的 PRNG 之间没有通信(除非您自己使用 MPI 处理它,课程)。转发 PRNG 流 2^512 步的事情仅在使用同一进程中多个线程的 PRNG 时发生。
话虽这么说,xorshift1024* 有一个相当长的周期 (2^1024-1),并且第一次在进程中使用 PRNG(再次考虑 MPI 等级)时,它是用来自OS(/dev/urandom 在 POSIX 系统上),除非它已经用 RANDOM_SEED 显式初始化。所以在实践中我认为你会没事的,不同 MPI 等级的 PRNG 流极不可能出现别名。
不,上面描述了 GFortran 版本 7 中的 PRNG。如果您想要可移植的东西,您不能依赖标准保证之外的任何东西。除了并行方面之外,对于可移植的高质量随机数,您最好使用已知的良好 PRNG 而不是依赖编译器提供的 PRNG(我有至少一个编译器产生质量差的随机数的个人经验RANDOM_NUMBER 固有的,但我不会说出供应商的名字,因为那是很多年前的事了,他们可能已经修复了它,因为我不知道他们是否还在营业。
(如果您发现新的 xorshift1024* 实现的语义很困难,请责怪 a)我,因为我设计并实现了它 b)Fortran 标准使得不可能具有具有简单语义的并行 PRNG)
我正在尝试在 MPI 代码中使用 fortran 内部 PRNG。
我从这个 link 了解到 GFortran 使用 xorshift1024* 实现 PRNG,其周期为 2^1024 - 1。它还说:
Note that in a multi-threaded program (e.g. using OpenMP directives), each thread will have its own random number state.
然后阅读 this 我发现:
When a new thread uses RANDOM_NUMBER for the first time, the seed is copied from the master seed, and forwarded N * 2^512 steps to guarantee that the random stream does not alias any other stream in the system, where N is the number of threads that have used RANDOM_NUMBER so far during the program execution
如果这是 GFortran 的自动功能,它只适用于 OpenMP?如果我想使用 MPI 进行并行 PRNG 怎么办?如何确保代码对其他编译器的可移植性?
换句话说:是否有任何方法可以使用 Fortran 内部指令以可移植的方式执行 GFortran 所说的(即保证真正的并行 PRNG)?
注意:我在 MPI 中使用了数字食谱的 PRNG。几年来效果很好,但现在我在整数模型的一些假设中遇到了一些错误,数值食谱说它超出了 fortran ......所以我不知道如何解决这个问题,这就是我想要使用的方式如果可能的话,内在的 PRNG。
如果您想要用于 Fortran 程序的多流随机数生成器的便携版本,可以使用 Mersenne Twister 的多流 Fortran 版本。请参阅 http://theo.phys.sci.hiroshima-u.ac.jp/~ishikawa/PRNG/mt_stream_en.html。它使用针对不同线程通过大量步骤推进 PRNG 的概念。它由子程序调用设置和配置,因此您应该能够在各种多线程环境中使用它。
请注意,xorshoft1024* 的使用是 GFortran 非常 的新功能,它仅在开发主干版本中可用,在撰写本文时尚未发布版本这个。它将作为 GCC 7 的一部分发布,可能在 spring 2017.
因此,当您使用 MPI 时,每个 MPI 等级都是一个单独的进程,并且每个进程中的随机数生成器是完全独立的,不同进程中的 PRNG 之间没有通信(除非您自己使用 MPI 处理它,课程)。转发 PRNG 流 2^512 步的事情仅在使用同一进程中多个线程的 PRNG 时发生。
话虽这么说,xorshift1024* 有一个相当长的周期 (2^1024-1),并且第一次在进程中使用 PRNG(再次考虑 MPI 等级)时,它是用来自OS(/dev/urandom 在 POSIX 系统上),除非它已经用 RANDOM_SEED 显式初始化。所以在实践中我认为你会没事的,不同 MPI 等级的 PRNG 流极不可能出现别名。
不,上面描述了 GFortran 版本 7 中的 PRNG。如果您想要可移植的东西,您不能依赖标准保证之外的任何东西。除了并行方面之外,对于可移植的高质量随机数,您最好使用已知的良好 PRNG 而不是依赖编译器提供的 PRNG(我有至少一个编译器产生质量差的随机数的个人经验RANDOM_NUMBER 固有的,但我不会说出供应商的名字,因为那是很多年前的事了,他们可能已经修复了它,因为我不知道他们是否还在营业。
(如果您发现新的 xorshift1024* 实现的语义很困难,请责怪 a)我,因为我设计并实现了它 b)Fortran 标准使得不可能具有具有简单语义的并行 PRNG)