使用mpi,fortran在每个线程上获得不同的随机数

问题描述 投票:1回答:2

我有一个基本程序,该程序从一个线程到另一个线程发送一条消息,并每次替换一个字符。我的问题是,每个线程中生成的随机数始终相同。这是我的代码:

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

我=线程数,npe =线程总数

除了随机生成的数字以外,所有其他方法都有效。我尝试使用random_seed(me)调用,但是它不起作用。

fortran openmpi
2个回答
2
投票

您没有正确使用RANDOM_SEED()。使用单个(标量)伪参数,实际上是在查询RANDOM_SEED(),其中>

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

正确的用法是

SIZE

其中种子是一个数组(我的机器上的大小为12 / call random_seed(put=seed) )。

请参见gfortran,您可以根据自己的需要进行调整,例如,为每个过程使用不同的种子。您可以,例如根据当前等级在the documentation中选择一个不同的素数。 不要与等级相乘

,因为这可能会产生零种子,在参考文献中明确提到不要这样做...

0
投票

我是否= 1,5Rho = rhonot + rand()* Epsilon做完在这里,我有20个处理器和100个样本。因此,每个处理器获得5个样本。有人可以用rand帮助我,让我在20个处理器中获得不同的随机数。我通过每个处理器获得相同的5个随机数。尝试了很多,周围没有具体答案。

© www.soinside.com 2019 - 2024. All rights reserved.