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

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

.doc
Скачиваний:
1
Добавлен:
09.09.2026
Размер:
449 Кб
Скачать
☆

МИНОБРНАУКИ РОССИИ

Санкт-Петербургский государственный

электротехнический университет

«ЛЭТИ» им. В. И. Ульянова (Ленина)

Кафедра МО ЭВМ

отчет

по лабораторной работе №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;

}

8

Соседние файлы в папке Лабы по ПарАлг 2024