我想問一個關於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運行它,第一個進程始終是領導者,依此類推......
可以請任何人都會向我解釋我做錯了什麼,以及如何解決這個問題?
非常感謝。
只要使用適當的PRNG,並給它一個每個進程的種子。 「蘭特」絕對不好,即使是種子。 – CodesInChaos
@CodesInChaos'rand'是壞的,但不是「在後續運行的不同進程中生成相同的序列」不好。它不僅適合手頭的任務,而且解決OP問題的單行代碼比導入任何第三方RNG可能更容易。 – suszterpatt