karamushko_maxim_lab_5 #387
17
karamushko_maxim_lab_5/README.md
Normal file
17
karamushko_maxim_lab_5/README.md
Normal file
@ -0,0 +1,17 @@
|
|||||||
|
# Лабораторная работа №5 - Параллельное перемножение матриц
|
||||||
|
## ПИбд-42 || Карамушко Максим
|
||||||
|
|
||||||
|
### Цель лабораторной работы
|
||||||
|
Изучить приципы работы с параллельными вычислениями и узнать насколько они оправданы в зависимости от объемов вычислений.
|
||||||
|
|
||||||
|
### Описание:
|
||||||
|
В данной лабораторной работе было реализовано параллельное перемножение матриц различных размеров (100x100, 300x300 и 500x500). Помимо этого были сделаны замеры времени выполнения в зависимости от количества потоков и размеров матриц.
|
||||||
|
|
||||||
|
### Результаты:
|
||||||
|
![Изображение 1](./result.png)
|
||||||
|
|
||||||
|
### Выводы:
|
||||||
|
Распараллеливание вычислений дает хороший прирост производительности для больших матриц, однако для маленьких матриц с увеличением числа потоков в какой-то момент расходы ресурсов на создание потоков и параллельные вычисления лишь увеличивают время вычислений.
|
||||||
|
|
||||||
|
### Видео с демонстрацией работы:
|
||||||
|
https://disk.yandex.ru/i/1a4-VeWhXP8gtQ
|
57
karamushko_maxim_lab_5/main.py
Normal file
57
karamushko_maxim_lab_5/main.py
Normal file
@ -0,0 +1,57 @@
|
|||||||
|
import random
|
||||||
|
import time
|
||||||
|
import multiprocessing
|
||||||
|
|
||||||
|
# Генерация матрицы
|
||||||
|
def matrix_generate(size):
|
||||||
|
return [[random.randint(0, 50) for _ in range(size)] for _ in range(size)]
|
||||||
|
|
||||||
|
# Умножение строк
|
||||||
|
def row_multi(i, A, B, result):
|
||||||
|
size = len(A)
|
||||||
|
for j in range(size):
|
||||||
|
for k in range(size):
|
||||||
|
result[i][j] += A[i][k] * B[k][j]
|
||||||
|
|
||||||
|
# параллельное умножение с помощью multiprocessing
|
||||||
|
def matrix_mulit_parallel(A, B, num_processes):
|
||||||
|
size = len(A)
|
||||||
|
result = [[0] * size for _ in range(size)]
|
||||||
|
|
||||||
|
with multiprocessing.Pool(processes=num_processes) as pool:
|
||||||
|
pool.starmap(row_multi, [(i, A, B, result) for i in range(size)])
|
||||||
|
|
||||||
|
return result
|
||||||
|
|
||||||
|
# Замер времени
|
||||||
|
def measure_time(size, num_processes=1):
|
||||||
|
A = matrix_generate(size)
|
||||||
|
B = matrix_generate(size)
|
||||||
|
|
||||||
|
start_time = time.time()
|
||||||
|
matrix_mulit_parallel(A, B, num_processes)
|
||||||
|
par_time = time.time() - start_time
|
||||||
|
|
||||||
|
return par_time
|
||||||
|
|
||||||
|
def main():
|
||||||
|
# Размеры матриц
|
||||||
|
matrix_sizes = [100, 300, 500]
|
||||||
|
# Количество потоков
|
||||||
|
num_processes_list = [1, 2, 4, 6, 8]
|
||||||
|
# Таблица с замерами времени
|
||||||
|
print("-*" * 40)
|
||||||
|
print(f"{'Количество потоков':<20}{'|100x100 (сек.)':<20}{'|300x300 (сек.)':<20}{'|500x500 (сек.)'}")
|
||||||
|
print("-*" * 40)
|
||||||
|
|
||||||
|
for num_processes in num_processes_list:
|
||||||
|
row = f"{num_processes:<20}"
|
||||||
|
|
||||||
|
for size in matrix_sizes:
|
||||||
|
par_time = measure_time(size, num_processes)
|
||||||
|
row += f"|{par_time:.4f}".ljust(20)
|
||||||
|
print(row)
|
||||||
|
print("-*" * 40)
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
main()
|
BIN
karamushko_maxim_lab_5/result.png
Normal file
BIN
karamushko_maxim_lab_5/result.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 19 KiB |
Loading…
Reference in New Issue
Block a user