c - MPI: rand()在每次运行中为所有进程提供相同的常数

  • 本文关键字:进程 常数 运行 rand MPI random mpi
  • 更新时间 :
  • 英文 :


我想问一个关于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。

C的一个很好的随机数生成器

最新更新