我有一些平行Fortran90码在其中每个程需要产生于同一序列的随机数字。

我有一个随机数发生器,这似乎是线不安全,因为,对于给定的种子,我完全不能重复同样的结果每次我运行程序。

我冲浪没有成功(几乎)整个网络寻找一些代码线-安全丽贝卡.任何人都可以向我提供(链接)的代码一个吗?

在此先感谢!

有帮助吗?

解决方案

可以在伪随机数生成器。 http://www.intel.com/cd/software/products/asmo-na/eng/266864.htm“rel =”nofollow noreferrer“>英特尔数学核心矢量统计库。它们是线程安全的。另外,为什么它需要线程安全?如果您希望每个线程获得相同的列表,请使用相同的种子为每个线程实例化一个新的PRNG。

其他提示

大多数可重复的随机数生成器需要某种形式的状态。没有国家,他们就无法做到接下来的事情。为了保证线程安全,你需要一种方法来自己保持状态(即,它不能是全局的)。

当你说"需要产生于同一序列的随机数字"你的意思是

  • 每个线程需要产生一流的号码相同于其他线? 这意味着选择的种子之前剥离线,然后实例是一个线程的当地养恤金条例》中的每个螺纹与相同的种子。

  • 你希望能够重复相同的序列数字之间的不同运行程序,但是每个线程产生它自己的独立的顺序? 在这种情况下,你仍然不能共用一个单一的养恤金条例》,因为该线操作的顺序是不确定的。此种单一的养恤金条例》与一个已知的种子在发射之前线,并利用它生成的初始种子的螺纹。 然后 你的实例线的本地发电机的每一个线...

在这些情况下,应注意什么 尼尔巴特沃斯 说的统计数据:最通常的保障,《养恤金条例》等权利要求是 不可靠 当混合流,在此产生的方式。


在这两种情况下你需要一个线程的当地养恤金条例》.我不知道什么是提供f90...但是你也可以写你自己的(查找 梅森难题, 和写routne,需要保存国作为一个参数...).

在fortran77,这看起来喜欢的东西

      function PRNGthread (state)

      double state(statesize)

c stuff happens here which uses and manipulates the state vector...

      PRNGthread = result
      return 

和你的每一个线应保持一个单独的状态矢量,虽然所有会使用相同的最初价值。

我知道你需要每个线程产生相同的随机数流。

一个非常好的伪随机生成器,它将生成一个可重现的数字流并且非常快,是 MT19937 。只需确保在产生线程之前生成种子,但在每个线程中生成一个单独的MT实例(使MT线程的实例成为本地)。这样就可以保证每个MT都能产生相同的数字流。

SPRNG 怎么样?我自己没试过。

我编写了一个线程安全的Fortran 90版Mersenne Twister / MT19973。 PRNG的状态保存在派生类型(randomNumberSequence)中,您可以使用过程为生成器设定种子或获取序列中的下一个元素。

请参阅 http: //code.google.com/p/i3rc-monte-carlo-model/source/browse/trunk/Code/RandomNumbersForMC.f95

替代办法似乎是:

  • 使用一个同步的对象(例如 互斥)在发生的种子 值。这将不幸的是 serialise你的代码访问 发生器
  • 使用螺纹当地的存在 发生器,以便每个线都有自己的 种子-这可能会导致statstical 问题出于你的程序
  • 如果你的平台,支持一个合适的 原子操作中,使用得上的 种子(很可能不会,不过)

不是一个非常令人鼓舞的名单,我知道。并加入到它,我不知道如何实现他们中任何人FORTRAN!

本文 https://www.cmiss.org/openCMISS/wiki/RandomNumberGenerationWithOpenMP不仅链接到Fortran实现,还提到了使PRNG可用于线程所需的关键点。最重要的一点是:

Fortran90版本的Ziggurat有几个变量和带有'SAVE'属性的数组。为了并行化统一的RNG,似乎所需的更改是使这些变量数组具有每个线程的单独值(注意错误共享)。然后当调用PRNG函数时,我们必须传递线程号,并使用相应的状态值。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top