Random 在并行MPI中使用fortran随机种子

Random 在并行MPI中使用fortran随机种子,random,fortran,mpi,gfortran,Random,Fortran,Mpi,Gfortran,我试图在MPI代码中使用fortran内部PRNG 我从中了解到GFortran使用xorshift1024*实现PRNG,其周期为2^1024-1。它还说: 请注意,在多线程程序中(例如,使用OpenMP指令), 每个线程都有自己的随机数状态 然后在阅读中我发现: 当一个新线程使用 第一次,种子是从母版复制的 种子,并转发N*2^512个步骤,以确保 流不别名系统中的任何其他流,其中N是 到目前为止在测试期间使用随机_数的线程数 程序执行 如果这是GFortran的自动功能,它只在OpenMP

我试图在MPI代码中使用fortran内部PRNG

我从中了解到GFortran使用xorshift1024*实现PRNG,其周期为2^1024-1。它还说:

请注意,在多线程程序中(例如,使用OpenMP指令), 每个线程都有自己的随机数状态

然后在阅读中我发现:

当一个新线程使用 第一次,种子是从母版复制的 种子,并转发N*2^512个步骤,以确保 流不别名系统中的任何其他流,其中N是 到目前为止在测试期间使用随机_数的线程数 程序执行

如果这是GFortran的自动功能,它只在OpenMP中工作?如果我想使用MPI实现并行PRNG呢?如何确保代码可移植到其他编译器

换句话说:是否有任何方法可以使用fortran内部指令以可移植的方式实现GFortran所说的功能(即保证真正的并行PRNG)


注意:我在MPI中使用了数字配方的PRNG。这在过去几年中一直很有效,但现在我在整数模型的一些假设中发现了一些错误,数值公式说这些假设超出了fortran。。。所以我不知道如何解决这个问题,如果可能的话,这就是我想要使用内在PRNG的方式。

如果你想要一个用于Fortran程序的多流随机数生成器的便携版本,有一个Mersenne Twister的多流Fortran版本。看见它使用的概念是为不同的线程推进大量的PRNG步骤。它是通过子程序调用设置和配置的,因此您应该能够在各种多线程环境中使用它。

注意,xorshoft1024*的使用是GFortran中的一项非常新的功能,它仅在开发主干版本中可用,在撰写本文时还没有发布版本。它将作为GCC 7的一部分发布,可能在2017年春季发布

因此,当您使用MPI时,每个MPI列组是一个单独的进程,每个进程中的随机数生成器是完全独立的,不同进程中的PRNG之间没有通信(当然,除非您自己使用MPI处理)。只有在同一进程中使用多个线程的PRNG时,才会转发PRNG流2^512个步骤

这就是说,xorshift1024*有一个相当长的周期(2^1024-1),并且第一次在进程中使用PRNG(同样,考虑MPI秩)时,它是使用来自OS的随机数据(POSIX系统上的/dev/uradom)初始化的,除非它已经使用随机种子显式初始化。所以在实践中,我认为你会没事的,不同MPI级别的PRNG流不太可能会出现别名

不,上面描述了GFortran版本7中的PRNG。如果你想要便携的东西,你不能依赖任何超出标准保证的东西。除了并行方面,对于可移植的高质量随机数,您可能更适合使用已知良好的PRNG,而不是依赖编译器提供的PRNG(我个人的经验是,至少有一个编译器生成了质量很差的随机数,但我不会说出供应商的名字,因为那是多年前的事了,他们可能已经修复了,如果他们还在做生意,我不知道)


(如果你发现新xorshift1024*实现的语义很难理解,那就怪我吧,因为我设计并实现了它b)Fortran标准使得不可能有一个具有简单语义的并行PRNG)

如果你关心编译器(甚至是编译器版本)之间的可移植性/一致性,那么
随机数
(和
random_seed
)会带来很多问题。有没有办法做到GFortran所说的…使用fortran内部指令以可移植的方式?没有。这----可能有用。谢谢你的评论。如果内部指令不可移植,并且数字配方似乎也不可移植(以我的经验)。您还建议使用哪些库、子例程或方法?非常感谢@janneb。您能推荐一个已知的好的、可移植的fortran PRNG吗?好的,我认为xorshift1024*是一个相当好的选择。参考实现是用C实现的,并且使用了在fortran中很难模拟的无符号64位算法。我建议使用C实现通过ISO_C_绑定进行传输。