Merge pull request 'klyushenkova_ksenia_lab_5 is ready' (#381) from klyushenkova_ksenia_lab_5 into main

Reviewed-on: #381
This commit is contained in:
Alexey 2025-01-02 13:07:22 +04:00
commit 9ae1098d6e
3 changed files with 69 additions and 0 deletions

View File

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

View File

@ -0,0 +1,51 @@
import numpy as np
import multiprocessing
import time
from time import time
def multiplication(first, second, res, start, stop, size):
for i in range(start, stop):
for j in range(size):
res[i][j] = 0
for k in range(size):
res[i][j] += first[i][k] * second[k][j]
if __name__ == "__main__":
sizes = [100, 300, 500]
threads_counts = [1, 3, 5, 7, 9]
for threads in threads_counts:
print(f'Количество потоков: {threads}')
for size in sizes:
A = np.random.randint(10, size=(size, size))
B = np.random.randint(10, size=(size, size))
if threads == 1:
res = np.zeros((size, size))
start = time()
multiplication(A, B, res, 0, size, size)
stop = time()
print(f'Размер: {size}x{size}, время выполнения: {stop - start}')
else:
offset = int(size / threads)
offset_last = size % threads + offset
processes = []
res = np.zeros((size, size))
start = time()
for i in range(threads):
start_ = i * offset
stop_ = start_ + offset_last if i == threads - 1 else start_ + offset
process = multiprocessing.Process(target=multiplication, args=(A, B, res, start_, stop_, size))
processes.append(process)
process.start()
for p in processes:
p.join()
stop = time()
print(f'Размер: {size}x{size}, время выполнения: {stop - start}')
print()

Binary file not shown.

After

Width:  |  Height:  |  Size: 127 KiB