Page 213 - 6571
P. 213
тися повідомлення, що розсилається, а для усіх інших процесів
вказуваний буфер є призначений для прийому даних, що переда-
ються;
- усі колективні операції «несумісні» з парними операціями
– так, наприклад, прийняти широкомовне повідомлення, відісла-
не за допомогою MPI_Bcast, функцією MPI_Recv не можна, для
цього можна задіяти тільки MPI_Bcast.
Приведемо програму для вирішення навчального завдання
підсумовування елементів вектору з використанням розглянутої
функції (лістинг 38).
Лістинг 38 – Паралельна програма підсумовування числових
значень
#include <math.h>
#include <stdio.h>
#include <stdlib.h>
#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;
212