2015-07-20 43 views
1

我有一個基本程序,它將線程中的消息發送到每個線程並替換一個字符。我的問題是每個線程中生成的隨機數總是相同的。這裏是我的代碼:使用mpi,fortran在每個線程上獲取不同的隨機數

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(我),但它不起作用。

+0

爲什麼你想讓每個數字有所不同? mpi的一部分力量是溝通者在相同的過程中工作。 – kilojoules

回答

2

您沒有正確使用RANDOM_SEED()。對於單個(標量)虛擬參數,實際上您正在查詢SIZE,其中

指定與PUT和GET參數一起使用的數組的最小大小。

正確用法是

call random_seed(put=seed) 

其中種子是(尺寸12的我的機器/ gfortran上)的陣列。

查看the documentation查看示例,您可以根據需要進行調整,即對每個進程使用不同的種子。你可以,例如根據當前的排名,在pcg中選擇不同的素數。 不要乘以排名,因爲這可能會給出零種子,明確提到不在參考中做...

+0

所以如果有人感興趣:我有點解決它通過使用第一個 \t調用random_number(種子);在我調用隨機數之前,我調用random_seed(put = int(seed))之前,在我的代碼中seed = int(seed * 1000)*(me + 1),然後(seed是一個12的數組)。希望這有助於並感謝你! – user3254126

+0

@ user3254126如果你有一個解決方案,沒有理由不把它作爲一個單獨的答案添加,如果它與這個解決方案有很大的不同。當然,參考這一點,如果它有助於上下文。但是,請注意,使用您提到的方法,必須非常小心地確保改性種子中存在合理的熵。 – francescalus