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

时间:2015-07-20 13:57:21

标签: fortran openmpi

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

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 =线程总数

除随机生成的数字外,一切都有效。我尝试使用调用random_seed(me),但它不起作用。

1 个答案:

答案 0 :(得分:2)

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

  

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

正确用法是

call random_seed(put=seed)

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

有关您可以根据需要调整的示例,请参阅the documentation,即为每个流程使用不同的种子。你可以,例如根据当前排名在pcg中选择不同的素数。 不要与等级相乘,因为这可能会给出零种子,明确提到不要在引用中做...