Для чего используется MPI_Bcast () в этой программе на C ++? - PullRequest
0 голосов
/ 06 мая 2019

Я начал изучать MPI и взял этот пример учебного кода из русского IT-блога Habrahabr :

#include <mpi.h>
#include <iostream>
#include <windows.h>
using namespace std;

double Fact(int n)
{ 
    if (n==0) return 1;
    else return n*Fact(n-1);
}

int main(int argc, char *argv[])
{
    int n;
    int myid;
    int numprocs;
    int i;
    int rc;

    long double drob,drobSum=0,Result, sum;
    double startwtime = 0.0;
    double endwtime;

    n = atoi(argv[1]);

    if (rc= MPI_Init(&argc, &argv)) { 
        cout << "Launch error" << endl;
        MPI_Abort(MPI_COMM_WORLD, rc);
    } 

    MPI_Comm_size(MPI_COMM_WORLD,&numprocs); 
    MPI_Comm_rank(MPI_COMM_WORLD,&myid); 

    if (myid == 0) {
        startwtime = MPI_Wtime();
    }

    MPI_Bcast(&n, 1, MPI_INT, 0, MPI_COMM_WORLD);

    for (i = myid; i <= n; i += numprocs)
    { 
        drob = 1/Fact(i);
        drobSum += drob;
    }

    MPI_Reduce(&drobSum, &Result, 1, MPI_LONG_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD);

    cout.precision(20);

    if (myid == 0)
    {   
        cout << Result << endl; 
        endwtime = MPI_Wtime();
        cout << (endwtime-startwtime)*1000 << endl;      
    }

    MPI_Finalize();
    return 0;
}

Мой вопрос: зачем им это

MPI_Bcast(&n, 1, MPI_INT, 0, MPI_COMM_WORLD);

там, если значение n установлено во всех процессах с

n = atoi(argv[1]);

в любом случае.

Это просто ошибка или она имеет какую-то цель?Я проверил код, и он работает нормально без него.

Я подумал, что широковещание подразумевает некоторый барьер рабочего процесса, который используется для правильного измерения времени вычисления или что-то в этом роде.

Также я подумал, что это может бытьпотому что инициализация n идет до вызова MPI_Init().Нужно ли мне MPI_Bcast() в этом коде, если я поставлю n = atoi(argv[1]); после MPI_Init() тогда?

1 Ответ

1 голос
/ 07 мая 2019

Все, что до MPI_Init() - это неопределенное поведение в MPI .Если вы не хотите передавать аргументы командной строки, вам следует использовать argv и argc после MPI_Init(&argc, &argv), потому что тогда они гарантированно будут доступны для всех задач.

Код работает нормально, потому чтомногие реализации MPI делают argv и argc доступными до инициализации, но вы не должны полагаться на это поведение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...