Я начал изучать 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()
тогда?