#include <math.h>
#include <stdio.h>
#include <stdlib.h>
#include "mpi.h"
int main (int argc, char* argv[]){
double x[100], y[100,100], z[100] …;
int ProcRank, BlockSize, ProcNum, N=100;
MPI_Status Status;
// Инициализация среды выполнения
MPI_Init (&argc,&argv);
MPI_Comm_size (MPI_COMM_WORLD,&ProcNum);
MPI_Comm_rank (MPI_COMM_WORLD,&ProcRank);
// Master-process is preparing the data
if (ProcRank == 0) DataInitialization(x,y,z,N);
//Here is some code sending parts of matrix
…
// Send vector x[N] to all the processes within
// the MPI_COMM_WORLD communicator USING One-to-all broadcast
MPI_Bcast (x, N, MPI_DOUBLE, 0, MPI_COMM_WORLD);
// DATA PROCESSING
// Each process is working on its portion of data
…
// Gathering the results on the master process
if (ProcRank == 0) {
//Master-process add calculated result to the end-result vector
AddResult(VectorPart,0);
for (int i=1; i < ProcNum; i++) {
MPI_Recv (&VectorPart, BlockSize, MPI_DOUBLE, MPI_ANY_SOURCE, 0, MPI_COMM_WORLD,
&Status);
AddResult(VectorPart, i*BlockSize);
}
}
else // все процессы отсылают свои частичные суммы
MPI_Send (&VectorPart, 100, MPI_DOUBLE, 0, 0, MPI_COMM_WORLD);
// вывод результата
if (ProcRank == 0)
SaveResult();
MPI_Finalize ();
}
В приведенной программе функция DataInitialization осуществляет подготовку начальных данных.
Далее выполняется рассылка соответствующих порций по процессорам в зависимости от их идентификатора (ранга).
После того как, мастер-процесс закончил обработку данных он добавляет результат своих вычислений в результирующий вектор и ожидает результатов от дочерних процессов, которые занимают свои места в результирующем векторе.