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

ЛР5. SGEMV умножение матрицы на вектор

.docx
Скачиваний:
3
Добавлен:
06.06.2023
Размер:
258.72 Кб
Скачать

Была реализована MPI программа для параллельного умножения строк матрицы на вектор. Так как реализовывался алгоритм одинарной точности (SGEMV), то типом данных выступил float. Ввод размерности квадратной матрицы и векторов происходит в функции SetMatrixSize().

Строки матрицы делятся на чанки (каждому процессу своё количество строк). Чанки равны, если размерность матрицы делится на число процессов нацело, иначе часть процессов берут на себя дополнительные строки. Функция GetChunk() принимает указатели на границы по строкам, тем самым вычисляется кол-во строк для обработки каждым процессом.

Умножение матрицы на вектор стандартно, просто в учёт идёт распараллеливание вычислений по строкам. Дальнейшая сборка результирующего вектора в корневом процессе происходит при помощи функции MPI_Gatherv(). Всё это реализовано в рамках функции SGEMV().

В конце программы происходит вывод статистических данных через корневой процесс и освобождение памяти от созданных массивов.

Функция main():

Функция SetMatrixSize():

Функция GetChunk():

Функция SGEMV():

По заданию нужно было предельные размеры квадратной матрицы и вектора, которые можно перемножать на сервере. Экспериментальным путём выяснилось, что это примерно 47000 строк и столбцов. Занимаемая память при этом больше 16 Гибибайт (GiB).

В следующем задании нужно было оценить зависимость коэффициента ускорения параллельной программы от числа p процессов (p = 8, 16, 32, 48). Размерность матрицы и вектора при этом выбрать равными n = 28000 и n = 45000.

Коэффициент ускорения S рассчитывался по следующей формуле: S = / .

N = 28000

P = 8

P = 16

P = 32

P = 40

t = 1.28 (с)

t = 0.71 (с)

t = 0.45 (с)

t = 0.57 (с)

N = 40000

P = 8

P = 16

P = 32

P = 48

t = 2.92 (с)

t = 1.46 (с)

t = 1.06 (с)

t = 0.83 (с)

Для выполнения параллельной части программы с n = 45000 для p > 8 не хватало ресурсов, поэтому я провёл расчёты для n = 40000. Помимо этого, в обоих случаях (28000 и 40000) не хватало ресурсов для p = 48, поэтому я снизил это число.

Вывод:

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