我想问一个关于rand()在(Open)MPI上下文中的问题。在并行编程课程中,我们被赋予了一个实现任务——创建一个MPI应用程序,在这个应用程序中,所有参与进程选择一个领导者(随机的——他们必须"投票")。我的程序是这样的:
#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: %dn",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。输出时,leader总是5,如果我用-np 8运行它,第一个进程总是leader,依此类推…
请任何人解释我我做错了什么,如何解决这种行为?
您必须为随机数生成器设置种子,例如
srand(time(NULL) + rank);
您没有为您的随机函数提供种子。"通常"的种子是time(NULL)
,尽管你可能想检查一些更灵活的东西,比如Mersenne Twister。