Лабы по ПарАлг 2024 / Baraeva_Elizaveta_lb2
.docМИНОБРНАУКИ РОССИИ
Санкт-Петербургский государственный
электротехнический университет
«ЛЭТИ» им. В. И. Ульянова (Ленина)
Кафедра МО ЭВМ
отчет
по лабораторной работе №2
по дисциплине «Параллельные алгоритмы»
Тема: Использование функций обмена данными «точка-
точка» в библиотеке MPI
Студентка гр. 2383 |
|
Бараева Е. Н. |
Преподаватель |
|
Татаринов Ю. С. |
Санкт-Петербург
2024
Цель работы.
Изучить использование функций обмена данными «точка-точка» в библиотеке 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.
Рисунок 1 – Вывод программы
Анализируя вывод программы, видим, что время выполнения программы иногда убывает при возрастании количества процессов. Это происходит, скорее всего, потому что объем вычислительных операций несравнимо мал и поэтому случайные факторы сильно сказываются на времени работы программы. Также это сказывается на выводе программы.
Сеть Петри см. рис. 2.
Рисунок 2 – Сеть Петри
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.
Рисунок 4 – График ускорения/замедления программы
Из графика можно понять, что программа замедляется при увеличении количества процессов. Это связано с тем, что программа по сути является не параллельной, а последовательной.
Вывод.
В ходе лабораторной работы были изучены основные функции передачи данных между процессами в библиотеке MPI, использующие механизм обмена сообщениями «точка-точка». Написана программа на языке C. Проведены замеры времени работы программы в зависимости от количества процессов и проанализированы результаты. Построены графики замедления/ускорения и работы программы, а также построена сеть Петри. Было замечено, что программа замедляется при увеличении числа процессов.
ПРИЛОЖЕНИЕ А ИСХОДНЫЙ КОД ПРОГРАММЫ
Название файла: 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
MPI_Send("Получено!", strlen("Получено!") + 1, MPI_CHAR, 0, 0, MPI_COMM_WORLD);
}
MPI_Finalize();
return 0;
}
