29
реализации такого параллельного алгоритма
получается проигрыш по
времени
по
сравнению
с
последовательным.
Следовательно,
распараллеливать алгоритм суммирования имеет смысл лишь в том
случае, если члены ряда формируются
независимо на каждом
процессоре или в процессе выполнения глобального расчета они уже
распределены по процессорам [2,7].
Приведем пример программного
кода суммирования числовой
последовательности с помощью функций
MPI_Bcast и
MPI_Reduce.
Программа. Параллельная программа суммирования числовых значений
#include
#include
#include
#include "mpi.h"
int main(int argc, char* argv[]){
double x[100], TotalSum, ProcSum = 0.0;
int ProcRank, ProcNum, N=100, k, i1, i2;
MPI_Status Status;
// Инициализация
MPI_Init(&argc,&argv);
MPI_Comm_size(MPI_COMM_WORLD,&ProcNum);
MPI_Comm_rank(MPI_COMM_WORLD,&ProcRank);
// Подготовка данных
if ( ProcRank == 0 ) DataInitialization(x,N);
// Рассылка данных на все процессы
MPI_Bcast(x, N, MPI_DOUBLE, 0, MPI_COMM_WORLD);
// Вычисление частичной суммы на каждом из процессов
// на каждом процессе суммируются элементы вектора x от i1 до i2
k = N / ProcNum;
i1 = k * ProcRank;
i2 = k * ( ProcRank + 1 );
if ( ProcRank == ProcNum-1 ) i2 = N;
for ( int i = i1; i < i2; i++ )
ProcSum = ProcSum + x[i];
MPI_Reduce(&ProcSum,&TotalSum,1,MPI_DOUBLE,MPI_SUM,0,MPI_CO
MM_WORLD);
// Вывод результата
if ( ProcRank == 0 )
printf("\nTotal Sum = %10.2f",TotalSum);
MPI_Finalize();
return 0;}