Я хотел бы задать вопрос о 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: %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, первый процесс всегда является лидером и так далее ...

Не могли бы вы объяснить мне, что я делаю не так и как исправить это поведение?

Большое спасибо.

7
Kyselejsyreček 19 Май 2014 в 20:14

2 ответа

Лучший ответ

Вы должны засеять свой генератор случайных чисел, например

srand(time(NULL) + rank);
24
Anycorn 19 Май 2014 в 16:18

Вы не предоставляете семя для своей случайной функции. «Обычное» семя - time(NULL), хотя вы можете проверить что-нибудь более гибкое, например Mersenne Twister.

Хороший генератор случайных чисел для C

1
Community 23 Май 2017 в 12:02