如何random_number()
与 OpenMP 并行工作吗?
如果我在没有并行化的情况下运行程序,我总是得到相同的结果,但是通过并行化,我每次都会得到不同(但相似)的结果。
不保证线程安全或线程性能random_number
一般来说。 Fortran 标准根本不支持 OpenMP。
各个编译器可能会为您提供一些保证,但它们仅对特定编译器中存在的版本有效。例如,当前的 gfortran 版本提供了一个线程安全的随机数生成器和“请注意,在多线程程序中(例如使用 OpenMP 指令),每个线程都有自己的随机数状态。” https://gcc.gnu.org/onlinedocs/gfortran/RANDOM_005fNUMBER.html其他编译器可能有所不同。值得注意的是,您的用户可能想要使用的编译器可能有所不同,而您可能不知道这一点。
有专用的并行随机数生成器可用。例如,我使用modified https://bitbucket.org/LadaF/elmm/src/master/src/rng_par_zig.f90使用 Ziggurat 方法处理多个随机数分布的库版本由 Gib Bogle 并行化,我添加了 xoroshiro128+ 的实现作为底层算法,类似于 Gfortran 使用的算法。还有类似算法的其他实现可用,并且标准 C++ 包含一些新的生成器,它们实际上被定义为使用特定的算法,因此您可以调用它们。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)