我有一个基本程序,它从线程向线程发送消息,每次都替换一个字符。我的问题是每个线程中生成的随机数总是相同的。这是我的代码:
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),但它不起作用。
答案 0 :(得分:2)
您没有正确使用RANDOM_SEED()
。使用单个(标量)伪参数,您实际上是在查询SIZE
,其中
指定与PUT和GET参数一起使用的数组的最小大小。
正确用法是
call random_seed(put=seed)
其中seed是一个数组(在我的机器上大小为12 / gfortran
)。
有关您可以根据需要调整的示例,请参阅the documentation,即为每个流程使用不同的种子。你可以,例如根据当前排名在pcg
中选择不同的素数。 不要与等级相乘,因为这可能会给出零种子,明确提到不要在引用中做...