Добавил:
baraevaliza
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:Лабы по ПарАлг 2024 / Baraeva_Elizaveta_lb2
.pdf
МИНОБРНАУКИ РОССИИ
САНКТ-ПЕТЕРБУРГСКИЙ ГОСУДАРСТВЕННЫЙ
ЭЛЕКТРОТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ
«ЛЭТИ» ИМ. В. И. УЛЬЯНОВА (ЛЕНИНА)
Кафедра МО ЭВМ
ОТЧЕТ
по лабораторной работе №2
по дисциплине «Параллельные алгоритмы»
Тема: Использование функций обмена данными «точка-
точка» в библиотеке MPI
Студентка гр. 2383
Бараева Е. Н.
Преподаватель
Татаринов Ю. С.
Санкт-Петербург
2024

2
Цель работы.
Изучить использование функций обмена данными «точка-точка» в
библиотеке MPI. Написать параллельную программу с использованием
данной связи без использования джокеров. Проанализировать результаты
работы с построением графика ускорения/замедления, а также с построением
сети Петри.
Задание.
Вариант 9
Игра с ведущим (съедобное − несъедобное). Процесс 0 поочередно
посылает остальным процессам сообщение. Получив сообщение, процессприемник информирует об этом процесс 0.
Выполнение работы.
Написана программа MPI с замером времени выполнения, в которой
нулевой процесс поочередно отправляет сообщения нескольким
принимающим процессам, а как только эти процессы получают сообщение от
нулевого, они сразу же отправляют ему подтверждение о получении
сообщения.
Время выполнения программы приведено в таблице 1.
Таблица 1 – Время выполнения программы на разном количестве процессов
Кол-во
процессов
Время работы, с
Кол-во
процессов
Время работы, с
2
0.000025
10
0.000392
3
0.000125
11
0.000508
4
0.000074
12
0.000630
5
0.000140
13
0.005016
6
0.000221
14
0.009041
7
0.000212
15
0.007994
8
0.000339
16
0.015620
9
0.000367
Вывод программы на 4 процессах см. рис. 1.

3
Рисунок 1 – Вывод программы
Анализируя вывод программы, видим, что время выполнения программы
иногда убывает при возрастании количества процессов. Это происходит,
скорее всего, потому что объем вычислительных операций несравнимо мал и
поэтому случайные факторы сильно сказываются на времени работы
программы. Также это сказывается на выводе программы.
Сеть Петри см. рис. 2.
Рисунок 2 – Сеть Петри

4
Pi – ожидание сообщения от 0 процесса; Wi – процесс 0 ожидает
отправки подтверждения от i процесса; S_0,i – сообщение от 0 процесса
отправлено i процессу; S_i,0 – подтверждение от i процесса отправлено 0
процессу; D_0,i – сообщение от 0 процесса получено i процессом; D_i,0 –
подтверждение от i процесса получено 0 процессом.
Разработанный программный код см. в приложении А.
Исследование программы.
Построим график времени работы программы в зависимости от числа
запущенных процессов от 2 до 16 см. рис. 3.
Рисунок 3 – График времени работы программы в зависимости от числа
запущенных процессов
По графику видно, что время работы программы возрастает вместе с
увеличением количества процессов. Сильнее всего это заметно после 12
процесса. Это связано с тем, что в процессоре устройства 12 ядер.
График ускорения/замедления программы см. на рис. 4.

5
Рисунок 4 – График ускорения/замедления программы
Из графика можно понять, что программа замедляется при увеличении
количества процессов. Это связано с тем, что программа по сути является не
параллельной, а последовательной.
Вывод.
В ходе лабораторной работы были изучены основные функции передачи
данных между процессами в библиотеке MPI, использующие механизм
обмена сообщениями «точка-точка». Написана программа на языке C.
Проведены замеры времени работы программы в зависимости от количества
процессов и проанализированы результаты. Построены графики
замедления/ускорения и работы программы, а также построена сеть Петри.
Было замечено, что программа замедляется при увеличении числа процессов.

6
ПРИЛОЖЕНИЕ А
ИСХОДНЫЙ КОД ПРОГРАММЫ
Название файла: lb2.c
#include <mpi.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(int argc, char* argv[]) {
int proc_rank, num_procs;
double time_start = 0.0, time_end;
MPI_Status Status;
MPI_Init(&argc, &argv);
MPI_Comm_rank(MPI_COMM_WORLD, &proc_rank);
MPI_Comm_size(MPI_COMM_WORLD, &num_procs);
// Сообщение для передачи
char message[100];
sprintf(message, "Привет от процесса %d!", proc_rank);
// Буфер для получения сообщения
char received_message[100];
// Процесс 0 - ведущий
if (proc_rank == 0) {
time_start = MPI_Wtime();
for (int i = 1; i < num_procs; i++) {
// Отправка сообщения процессу i
MPI_Send(message, strlen(message) + 1, MPI_CHAR, i, 0,
MPI_COMM_WORLD);
printf("Процесс 0 отправил сообщение процессу %d\n", i);
// Получение подтверждения от процесса i
MPI_Recv(received_message, 100, MPI_CHAR, i, 0, MPI_COMM_WORLD,
&Status);
printf("Процесс 0 получил подтверждение от процесса %d: %s\n",
i, received_message);
}
time_end = MPI_Wtime();
printf("The program has taken %lf seconds\n", time_end -
time_start);
}
// Процесс-приемник
else {
// Получение сообщения от процесса 0
MPI_Recv(received_message, 100, MPI_CHAR, 0, 0, MPI_COMM_WORLD,
&Status);
printf("Процесс %d получил сообщение: %s\n", proc_rank,
received_message);
// Отправка подтверждения процессу 0

7
MPI_Send("Получено!", strlen("Получено!") + 1, MPI_CHAR, 0, 0,
MPI_COMM_WORLD);
}
MPI_Finalize();
return 0;
}
Соседние файлы в папке Лабы по ПарАлг 2024
