Merge pull request 'tsukanova_irina_lab_5' (#108) from tsukanova_irina_lab_5 into main

Reviewed-on: Alexey/DAS_2024_1#108
This commit is contained in:
Alexey 2024-10-26 13:01:34 +04:00
commit 3b9698ac38
3 changed files with 71 additions and 0 deletions

View File

@ -0,0 +1,16 @@
# Цуканова Ирина ПИбд-42
# Лабораторная работа №5 - Параллельное перемножение матриц
## Результат:
![results](./img.png)
## Выводы:
1. Для маленьких матриц выгоднее использовать последовательное умножение (1 поток)
2. Для больших матриц лучше использовать параллельное умножение, так как временные затраты
последовательного умножения в этом случае существенно выше, чем затраты на управление потоками.
3. Увеличение количества потоков для осуществления умножения больших матриц в определенный момент не дает
прироста в скорости выполнения. Это значит, что достигнуто оптимальное количество потоков.
## [Видео](https://drive.google.com/file/d/1pMMKllM24xwXZlQkY9VIuKSeKr5vpUHI/view?usp=sharing)

Binary file not shown.

After

Width:  |  Height:  |  Size: 24 KiB

View File

@ -0,0 +1,55 @@
import multiprocessing
import time
from time import time
import numpy as np
def matrix_multi(first, second, res, start_i, stop_i, size):
for i in range(start_i, stop_i):
for j in range(size):
res[i][j] = 0
for k in range(size):
res[i][j] += first[i][k] * second[k][j]
def do(first, second, size, threads):
offset = int(size / threads)
offset_last = size % threads + offset
processes = []
res = np.zeros((size, size))
start_test = time()
for i in range(threads):
start_ = i * offset
stop_ = start_ + offset_last if i == threads - 1 else start_ + offset
process = multiprocessing.Process(target=matrix_multi, args=(first, second, res, start_, stop_, size))
processes.append(process)
process.start()
for p in processes:
p.join()
stop_test = time()
print(f'{size}x{size}, time: {stop_test - start_test}')
if __name__ == "__main__":
sizes = [100, 300, 500]
threads_counts = [1, 4, 6, 8, 12]
for threads in threads_counts:
print('-------------------------------------------------')
print(f'Threads:{threads}')
for n in sizes:
first_matrix = np.random.randint(3, size=(n, n))
second_matrix = np.random.randint(3, size=(n, n))
if threads == 1:
res = np.zeros((n, n))
start = time()
matrix_multi(first_matrix, second_matrix, res, 0, n, n)
stop = time()
print(f'{n}x{n}, time: {stop - start}')
else:
do(first_matrix, second_matrix, n, threads)
print('-------------------------------------------------')