klyushenkova_ksenia_lab_5 is ready
This commit is contained in:
parent
5dd9e26f07
commit
17ec016a38
18
klyushenkova_ksenia_lab_5/README.md
Normal file
18
klyushenkova_ksenia_lab_5/README.md
Normal 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)
|
51
klyushenkova_ksenia_lab_5/main.py
Normal file
51
klyushenkova_ksenia_lab_5/main.py
Normal 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()
|
BIN
klyushenkova_ksenia_lab_5/res.jpg
Normal file
BIN
klyushenkova_ksenia_lab_5/res.jpg
Normal file
Binary file not shown.
After Width: | Height: | Size: 127 KiB |
Loading…
Reference in New Issue
Block a user