【问题标题】:Get different random numbers on each thread using mpi, fortran使用 mpi、fortran 在每个线程上获取不同的随机数
【发布时间】:2015-10-09 16:32:25
【问题描述】:

我有一个基本程序,它在线程之间发送消息并每次替换一个字符。我的问题是每个线程中生成的随机数总是相同的。这是我的代码:

if (me+1 == npe) then
        a = 0
    else
        a = me + 1
    end if

    if (me == 0) then
        b = npe-1
    else
        b = me-1
    end if

    if (me == 0) then
        call MPI_Send(msg, len(msg), MPI_CHARACTER, a, tag, comm, ierr)
    else
        call MPI_Recv(msg, len(msg), MPI_CHARACTER, b, tag, comm, stat, ierr)
        call random_number(u)
        j = FLOOR(14*u)
        msg(j:j) = "?"
        call MPI_Send(msg, len(msg), MPI_CHARACTER, a, tag, comm, ierr)
    end if
    if (me == 0) then
        call MPI_Recv(msg, len(msg), MPI_CHARACTER, b, tag, comm, stat, ierr)
end if

me = 线程数,npe = 线程总数

除了随机生成的数字外,一切正常。我尝试使用 call random_seed(me) 但它不起作用。

【问题讨论】:

  • 为什么要让每个数字都不一样? mpi 的部分优势在于沟通者在相同的进程上工作。

标签: fortran openmpi


【解决方案1】:

您没有正确使用RANDOM_SEED()。使用单个(标量)虚拟参数,您实际上是在查询 SIZE

指定与 PUT 和 GET 参数一起使用的数组的最小大小。

正确的用法是

call random_seed(put=seed)

其中种子是一个数组(在我的机器上大小为 12/gfortran)。

请参阅 the documentation 以了解您可以根据需要进行调整的示例,即为每个进程使用不同的种子。你可以,例如根据当前排名在pcg 中选择不同的素数。 不要与排名相乘,因为这可能会产生零种子,参考文献中明确提到不要这样做......

【讨论】:

  • 所以如果有人有兴趣:我通过第一次调用 random_number(seed); 解决了它。在我调用我使用的随机数调用 random_seed(put=int(seed)) 之前,种子 = int(seed*1000)*(me+1) 然后在我的代码中 (seed 是一个大小为 12 的数组)。希望这会有所帮助,谢谢!
  • @user3254126 如果您有解决方案,如果它与此解决方案有很大不同,则没有理由不将其添加为单独的答案。当然,如果它有助于上下文,请参考这个。但是请注意,对于您提到的方法,必须非常小心地确保修改后的种子中存在合理的熵。
猜你喜欢
  • 2013-12-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-04
  • 1970-01-01
  • 1970-01-01
  • 2012-06-20
相关资源
最近更新 更多