81 lines
3.2 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Лабораторная 5
## Вариант 9
## Задание
Кратко: реализовать умножение двух больших квадратных матриц.
Подробно: в лабораторной работе требуется сделать два алгоритма: обычный и параллельный. В параллельном алгоритме предусмотреть ручное задание количества потоков, каждый из которых будет выполнять умножение элементов матрицы в рамках своей зоны ответственности.
## Описание Программы
### Алгоритмы:
**Последовательный**
```
def sequential_matrix_multiply(matrix_a, matrix_b):
result = np.zeros((len(matrix_a), len(matrix_b[0])))
for i in range(len(matrix_a)):
for j in range(len(matrix_b[0])):
for k in range(len(matrix_b)):
result[i][j] += matrix_a[i][k] * matrix_b[k][j]
return result
```
**Параллельный**
```
def parallel_matrix_multiply_worker(args):
matrix_a, matrix_b, row_start, row_end, result = args
local_result = np.zeros((row_end - row_start, len(matrix_b[0])))
for i in range(row_start, row_end):
for j in range(len(matrix_b[0])):
for k in range(len(matrix_b)):
local_result[i - row_start][j] += matrix_a[i][k] * matrix_b[k][j]
result.extend(local_result)
def parallel_matrix_multiply(matrix_a, matrix_b, num_processes=2):
num_rows_a = len(matrix_a)
chunk_size = num_rows_a // num_processes
processes = []
manager = multiprocessing.Manager()
result = manager.list()
for i in range(num_processes):
row_start = i * chunk_size
row_end = (i + 1) * chunk_size if i < num_processes - 1 else num_rows_a
process_args = (matrix_a, matrix_b, row_start, row_end, result)
process = multiprocessing.Process(target=parallel_matrix_multiply_worker, args=(process_args,))
processes.append(process)
for process in processes:
process.start()
for process in processes:
process.join()
return np.vstack(result)
```
## Результат:
Для матриц каждой размерности (100x100, 300x300, 500x500) с разными потоками были выполнены замеры по времени:
**100x100 2, 4 потока**
![](screens/img.png)
**300x300 2, 4 потока**
![](screens/img_1.png)
**500x500 2, 4 потока**
![](screens/img_2.png)
Из приведенных выше тестов, можно сделать вывод, что матрица размерностью 100x100 выполняется быстрее последовательно.
Матрица 300x300 выполняется быстрее последовательно, если 2 потока, если 4 потока - то быстрее параллельно.
Матрица 500x500 выполняется быстрее с 2, 4 потоками.
Ссылка на видео: https://vk.com/video151119348_456239202?list=ln-Zzcz0lPuhOW9ZAUZhK