Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Лабы по ПарАлг 2024 / Baraeva_Elizaveta_lb2

.pdf
Скачиваний:
1
Добавлен:
09.09.2026
Размер:
336 Кб
Скачать
☆
МИНОБРНАУКИ РОССИИ
САНКТ-ПЕТЕРБУРГСКИЙ ГОСУДАРСТВЕННЫЙ
ЭЛЕКТРОТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ
«ЛЭТИ» ИМ. В. И. УЛЬЯНОВА (ЛЕНИНА)
Кафедра МО ЭВМ
ОТЧЕТ
по дисциплине «Параллельные алгоритмы»
Тема: Использование функций обмена данными «точка-
точка» в библиотеке 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