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

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

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

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

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

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

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

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

отчет

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

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

Тема: Коллективные операции

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

Бараева Е. Н.

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

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

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

2024

Цель работы.

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

Задание.

Вариант 7

В каждом процессе дан набор из K + 5 целых чисел, где K – количество процессов. Используя функцию MPI_Reduce для операции MPI_SUM, просуммировать элементы данных наборов с одним и тем же порядковым номером и вывести полученные суммы в главном процессе.

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

Написана программа MPI с замером времени выполнения, в которой выполняется коллективная операция суммирования между процессами. Каждый процесс генерирует набор чисел от -10 до 10 фиксированного размера, равного количеству процессов + 5. Затем с помощью функции MPI_Reduce с операцией MPI_SUM собираются данные от всех процессов и суммируются по индексам. Далее 0 процесс получает результирующий массив, содержащий итоговые суммы по каждому индексу.

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

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

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

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

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

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

2

0.000019

10

0.000497

3

0.000104

11

0.000720

4

0.000044

12

0.001057

5

0.000210

13

0.001401

6

0.000271

14

0.002030

7

0.000277

15

0.002809

8

0.000328

16

0.005865

9

0.000504

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

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

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

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

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

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

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

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

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

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

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

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

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

Вывод.

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

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

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

#include <mpi.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;

MPI_Init(&argc, &argv);

MPI_Comm_rank(MPI_COMM_WORLD, &proc_rank);

MPI_Comm_size(MPI_COMM_WORLD, &num_procs);

int array_size = num_procs + 5;

int* all = (int*) malloc(num_procs * array_size * sizeof(int));

int* data = (int*) malloc(array_size * sizeof(int));

int* result = NULL;

// Заполнение массива разными значениями для каждого процесса

for (int i = 0; i < num_procs * array_size; i++)

all[i] = (rand() % 21) - 10;

printf("Процесс %d: ", proc_rank);

for (int i = 0; i < array_size; i++) {

data[i] = all[proc_rank * array_size + i];

printf("%d ", data[i]);

}

printf("\n");

// Процесс 0 получает результирующий массив

if (proc_rank == 0)

result = (int*) malloc(array_size * sizeof(int));

// Суммирование

time_start = MPI_Wtime();

MPI_Reduce(data, result, array_size, MPI_INT, MPI_SUM, 0, MPI_COMM_WORLD);

time_end = MPI_Wtime();

// Вывод результатов

if (proc_rank == 0) {

printf("\nРезультат: \n");

for (int i = 0; i < array_size; i++) {

printf("%d ", result[i]);

}

printf("\n");

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

}

free(result);

free(data);

free(all);

MPI_Finalize();

return 0;

}

8

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