Код 3.4.5.1.1

#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 осуществляет подготовку начальных данных.

Далее выполняется рассылка соответствующих порций по процессорам в зависимости от их идентификатора (ранга).

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


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: