Код 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_StatusStatus;
// Инициализация среды выполнения
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 осуществляет подготовку начальных данных.
Далее выполняется рассылка соответствующих порций по процессорам в зависимости от их идентификатора (ранга).
После того как, мастер-процесс закончил обработку данных он добавляет результат своих вычислений в результирующий вектор и ожидает результатов от дочерних процессов, которые занимают свои места в результирующем векторе.
Дата добавления: 2015-02-03; просмотров: 850;