2014-05-19 27 views
1

我想問一個關於rand()在(Open)MPI上下文中的問題。我們在並行編程課程中獲得了實施任務 - 創建一個MPI應用程序,其中所有參與者進程選擇一個領導者(隨機 - 他們必須「投票」)。我的計劃是這樣的:MPI:rand()在每次運行的所有進程中給出相同的常數

#include <stdio.h> 
#include <stdlib.h> 
#include <math.h> 
#include <limits.h> 
#include <mpi.h> 

int main (int argc, char *argv[]) { 
    int rank, size, vote, result; 

    MPI_Init(&argc, &argv); 

    MPI_Comm_rank(MPI_COMM_WORLD, &rank); 
    MPI_Comm_size(MPI_COMM_WORLD, &size); 

    vote = rand(); // Each process' vote. 
    printf("%d: %d\n",rank+1, vote); // Only for debugging purposes here. 

    MPI_Allreduce(&vote, &result, 1, MPI_INT, MPI_SUM, MPI_COMM_WORLD); 
    result = (result & INT_MAX) % size + 1; // Select the leader. 

    printf("Process %*d/%d: %d is the leader.\n", (int)(ceil(log10(size+1))), rank+1, size, result); 

    MPI_Finalize(); 
    return 0; 
} 

的問題是,當我編譯和使用OpenMPI1.6運行它,每一個過程票是1804289383,不管程序有多少進程開始。該程序的每次新運行中的編號始終相同。因此,如果我運行mpirun -np 7 ./a.out,領導者始終是編號5,如果我使用-np 8運行它,第一個進程始終是領導者,依此類推......

可以請任何人都會向我解釋我做錯了什麼,以及如何解決這個問題?

非常感謝。

+1

只要使用適當的PRNG,並給它一個每個進程的種子。 「蘭特」絕對不好,即使是種子。 – CodesInChaos

+1

@CodesInChaos'rand'是壞的,但不是「在後續運行的不同進程中生成相同的序列」不好。它不僅適合手頭的任務,而且解決OP問題的單行代碼比導入任何第三方RNG可能更容易。 – suszterpatt

回答

14

你有你的種子隨機數發生器,例如

srand(time(NULL) + rank); 
+0

哦,我的,謝謝你......這真是一個愚蠢的錯誤。 –

+0

雖然每個過程都需要不同的種子,但要小心 – Mosby

相關問題