Н., Пескова Е. Е., Шаманаев П. А. Основы параллельного программирования с использованием технологий mpi и openmp учебное пособие саранск издательство свмо 2013 2


 Примеры параллельных алгоритмов и программ



Pdf көрінісі
бет23/53
Дата07.06.2023
өлшемі6.58 Mb.
#474796
1   ...   19   20   21   22   23   24   25   26   ...   53
ParProg MPI OpenMP

    Бұл бет үшін навигация:
  • MPI_Bcast
2.7 Примеры параллельных алгоритмов и программ 
 
2.7.1 Алгоритм суммирования ряда чисел 
 
Требуется найти сумму ряда 
. Последовательный 
алгоритм выглядит следующим образом: 
Шаг 1: формируется массив 

Шаг 2: 

Шаг 3: 

Параллельный алгоритм можно построить из соображений того
что при расчетах обычно (количество процессов) много меньше и, 
следовательно, на каждом процессоре можно параллельно вычислить 
частичные суммы, переслать их значения на один процессор
выполнить суммирование 
чисел и получить окончательный 
результат. 
Заметим, что параллельный алгоритм вычисления суммы ряда на 
практике будет выполняться медленнее, чем последовательный. Это 
объясняется тем, что для нахождения частичных сумм приходится 
осуществлять рассылку данных, причем количество выполняемых 
арифметических операций примерно равно числу посылаемых данных, 
а так как выполнение одной арифметической операции занимает 
меньше времени, чем пересылка одного машинного слова, то в итоге 


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;}
 
 


30 


Достарыңызбен бөлісу:
1   ...   19   20   21   22   23   24   25   26   ...   53




©dereksiz.org 2024
әкімшілігінің қараңыз

    Басты бет