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

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

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

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

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

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

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

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

отчет

по лабораторной работе №6

по дисциплине «Параллельные алгоритмы»

Тема: Виртуальные топологии

Студентка гр. 2383

Бараева Е. Н.

Преподаватель

Татаринов Ю. С.

Санкт-Петербург

2024

Цель работы.

Изучить, что такое декартовая топология в библиотеке MPI, как ее создавать, и какие манипуляции с ней можно делать. Написать параллельную программу с созданием декартовой топологии процессов, с дальнейшим ее расщеплением и применением коллективной операции. Проанализировать результаты работы с построением графика ускорения/замедления, а также с построением сети Петри.

Задание.

Вариант 4

Число процессов К является четным: K = 2N, N > 1 В процессах 0 и 1 дано по одному вещественному числу A. Определить для всех процессов декартову топологию в виде матрицы размера N × 2, после чего, используя функцию MPI_Cart_sub, расщепить матрицу процессов на два одномерных столбца (при этом процессы 0 и 1 будут главными процессами в полученных столбцах). Используя одну коллективную операцию пересылки данных, переслать число A из главного процесса каждого столбца во все процессы этого же столбца и вывести полученное число в каждом процессе (включая процессы 0 и 1).

Выполнение работы.

Написана программа MPI с замером времени выполнения, в которой процессы с рангами 0 и 1 генерируют случайное вещественное число в диапазоне от -1 до 1 и сохраняют его в переменной A. Далее создается двумерная декартова топология с N строками и 2 столбцами, где N равно половине общего количества процессов. Затем декартова топология расщепляется на два одномерных столбца. Для каждого процесса определяется его ранг в новом коммуникаторе col_comm, который соответствует столбцу. Главный процесс в каждом столбце распространяет свое значение A на все процессы в этом столбце. В конце каждый процесс выводит свое значение A, а также свой ранг в столбце.

Время выполнения программы приведено в таблице 1.

Таблица 1 – Время выполнения программы на разном количестве процессов

Кол-во процессов

Время работы, с

Кол-во процессов

Время работы, с

2

0.000048

10

0.000373

4

0.000227

12

0.000438

6

0.000324

14

0.032785

8

0.000348

16

0.075870

Вывод программы на 6 процессах см. рис. 1.

Рисунок 1 – Вывод программы

Анализируя вывод программы, видим, что некоторые строки выведены в неправильном порядке. Это происходит, скорее всего, потому что объем вычислительных операций несравнимо мал и поэтому случайные факторы сильно сказываются на выводе программы.

Сеть Петри см. рис. 2.

Рисунок 2 – Сеть Петри

2N – четные процессы, 2N+1 – нечетные процессы. Для 1 и 2N+1 процессов сеть Петри аналогична.

Разработанный программный код см. в приложении А.

Исследование программы.

Построим график времени работы программы в зависимости от числа запущенных процессов от 2 до 16 см. рис. 3.

Рисунок 3 – График времени работы программы в зависимости от числа запущенных процессов

По графику видно, что время работы программы медленно возрастает вместе с увеличением количества процессов до 12, а после резко. Это связано с тем, что в процессоре устройства 12 ядер, и при использовании до 12-ти процессов программа эффективна, а уже после эффективность теряется.

График ускорения/замедления программы см. на рис. 4.

Рисунок 4 – График ускорения/замедления программы

Из графика можно понять, что программа замедляется при увеличении количества процессов. Это связано с тем, что с каждым дополнительным процессом время создания декартовой топологии и разделения на группы, количество отправляемых и обрабатываемых сообщений возрастает, что приводит к увеличению задержек.

Вывод.

В ходе лабораторной работы было изучено, что такое декартовая топология в библиотеке MPI, как ее создавать, и какие манипуляции с ней можно делать. Написана программа на языке C, создающая декартовую топологию процессов, с дальнейшим ее расщеплением и применением коллективной операции. Проведены замеры времени работы программы в зависимости от количества процессов и проанализированы результаты. Построены графики замедления/ускорения и работы программы, а также построена сеть Петри. Также было замечено, что программа замедляется при увеличении числа процессов. Это происходит из-за увеличения объема коммуникаций и накладных расходов на передачу данных.

ПРИЛОЖЕНИЕ А ИСХОДНЫЙ КОД ПРОГРАММЫ

Название файла: lb6.c

#include <mpi.h>

#include <time.h>

#include <stdio.h>

#include <stdlib.h>

int main(int argc, char* argv[]) {

int proc_rank, num_procs;

double time_start = 0.0, time_end;

float A = 0.0;

MPI_Init(&argc, &argv);

MPI_Comm_rank(MPI_COMM_WORLD, &proc_rank);

MPI_Comm_size(MPI_COMM_WORLD, &num_procs);

// Проверка, что число процессов четное и больше 1

if (num_procs % 2 == 1 || num_procs == 0) {

if (proc_rank == 0)

printf("Число процессов должно быть четным и больше 1\n");

MPI_Finalize();

return 0;

}

// Генерация вещественного числа в дипазоне от -1 до 1 для 0 и 1 процессов

if (proc_rank == 0 || proc_rank == 1) {

srand(time(NULL) + proc_rank);

A = (float) rand() / RAND_MAX * 2 - 1;

printf("Процесс %d сгенерировал число A = %f\n", proc_rank, A);

}

if (proc_rank == 0)

time_start = MPI_Wtime();

int K = num_procs, N = K / 2;

// Инициализация декартовой топологии

int dims[] = {N, 2}, periods[] = {0, 0};

MPI_Comm cart_comm;

MPI_Cart_create(MPI_COMM_WORLD, 2, dims, periods, 1, &cart_comm);

// Расщепление декартовой топологии на два одномерных столбца

int remain_dims[] = {1, 0};

MPI_Comm col_comm;

MPI_Cart_sub(cart_comm, remain_dims, &col_comm);

// Выбор главного процесса в каждом столбце

int col_rank;

MPI_Comm_rank(col_comm, &col_rank);

// Главные процессы распространяют свое значение A

MPI_Bcast(&A, 1, MPI_FLOAT, 0, col_comm);

if (proc_rank == 0) {

time_end = MPI_Wtime();

printf("The program has taken %lf seconds\n", time_end - time_start);

}

// Вывод числа A для каждого процесса

printf("Процесс %d, ранг в столбце %d, число A = %f\n", proc_rank, col_rank, A);

MPI_Finalize();

return 0;

}

8

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