gpt4 book ai didi

random - 在并行 MPI 中使用 fortran RANDOM_SEED

转载 作者:行者123 更新时间:2023-12-02 08:43:13 25 4
gpt4 key购买 nike

我正在尝试在 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。

最佳答案

请注意,xorhoft1024* 的使用是 GFortran 中的一个非常新功能,它仅在开发主干版本中可用,在撰写本文时尚未发布版本。它将作为 GCC 7 的一部分发布,可能在 2017 年 Spring 发布。

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

话虽这么说,xorshift1024* 有一个相当长的周期 (2^1024-1),并且第一次在进程中使用 PRNG(再次考虑 MPI 等级)时,它是使用来自操作系统的随机数据进行初始化的(/dev/urandom(在 POSIX 系统上),除非已使用 RANDOM_SEED 显式初始化。因此,在实践中,我认为您会没事的,不同 MPI 等级的 PRNG 流极不可能发生混叠。

不,上面描述了 GFortran 版本 7 中的 PRNG。如果您想要可移植的东西,您不能依赖超出标准保证的任何东西。除了并行方面之外,对于可移植的高质量随机数,您可能最好使用已知的良好 PRNG,而不是依赖编译器提供的随机数(我个人的经验是,至少有一个编译器使用RANDOM_NUMBER 内在的,但我不会透露供应商的名字,因为这是很多年前的事了,他们可能已经修复了这个问题,如果他们还继续营业,我不知道)。

(如果您发现新的 xorshift1024* 实现的语义很困难,请责怪 a)我,因为我设计并实现了它 b)Fortran 标准,这使得不可能拥有具有简单语义的并行 PRNG)

关于random - 在并行 MPI 中使用 fortran RANDOM_SEED,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39394061/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com