Compare commits
4 Commits
4c2e646f1a
...
bdf567195a
Author | SHA1 | Date | |
---|---|---|---|
bdf567195a | |||
d24d5be799 | |||
f944b01cca | |||
63f09a3c0b |
21
tsukanova_irina_lab_6/README.md
Normal file
21
tsukanova_irina_lab_6/README.md
Normal file
@ -0,0 +1,21 @@
|
||||
# Цуканова Ирина ПИбд-42
|
||||
# Лабораторная работа №6 - Определение детерминанта матрицы
|
||||
|
||||
|
||||
## Результат:
|
||||
![results](./img.png)
|
||||
|
||||
## Выводы:
|
||||
|
||||
1. Увеличение числа потоков ускоряет вычисление детерминанта для больших матриц.
|
||||
Как видно по результатам для матрицы 11 × 11 при использовании 1 потока время составляет 260 секунд,
|
||||
тогда как при 10 потоках оно сокращается до 62 секунд.
|
||||
2. Производительность снижается при увеличении числа потоков на малых матрицах.
|
||||
Для матрицы 8×8 использование 10 потоков оказывается медленнее, чем использование 4 или 8 потоков.
|
||||
Это связано с накладными расходами на создание и управление потоками, которые становятся ощутимыми при малых объемах вычислений.
|
||||
3. Подход с многопоточностью эффективно снижает время выполнения для больших матриц,
|
||||
однако оптимальное количество потоков следует выбирать в зависимости от размера задачи,
|
||||
чтобы избежать накладных расходов и добиться наилучших результатов.
|
||||
|
||||
|
||||
## [Видео](https://drive.google.com/file/d/1tVVQwmh3W9HEEn6WrqEEiB9n-cEI8aGW/view?usp=sharing)
|
BIN
tsukanova_irina_lab_6/img.png
Normal file
BIN
tsukanova_irina_lab_6/img.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 27 KiB |
64
tsukanova_irina_lab_6/main.py
Normal file
64
tsukanova_irina_lab_6/main.py
Normal file
@ -0,0 +1,64 @@
|
||||
import numpy as np
|
||||
from time import time
|
||||
import multiprocessing
|
||||
|
||||
|
||||
def do_task(matrix, start_j, stop_j, queue):
|
||||
size = len(matrix[0] - 1)
|
||||
if size == 2:
|
||||
return matrix[0][0] * matrix[1][1] - matrix[1][0] * matrix[0][1]
|
||||
else:
|
||||
res = 0
|
||||
for j in range(start_j, stop_j):
|
||||
tmp = np.delete(matrix, 0, axis=0)
|
||||
tmp = np.delete(tmp, j, axis=1)
|
||||
a = matrix[0][j]
|
||||
b = do_task(tmp, 0, len(tmp[0]), None)
|
||||
|
||||
if j % 2 == 0:
|
||||
res += a * b
|
||||
else:
|
||||
res += a * b * (-1)
|
||||
if queue:
|
||||
queue.put(res)
|
||||
return res
|
||||
|
||||
|
||||
def do_threads(matrix, size, threads):
|
||||
offset = int(size / threads)
|
||||
offset_last = size % threads + offset
|
||||
|
||||
processes = []
|
||||
queue = multiprocessing.Queue()
|
||||
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=do_task, args=(matrix, start_, stop_, queue))
|
||||
processes.append(process)
|
||||
process.start()
|
||||
|
||||
total_result = 0
|
||||
for p in processes:
|
||||
p.join()
|
||||
total_result += queue.get()
|
||||
|
||||
# print(total_result)
|
||||
stop_test = time()
|
||||
print(f'{size}x{size}, time: {stop_test - start_test}')
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
sizes = [8, 9, 10, 11]
|
||||
threads_counts = [1, 4, 6, 8, 10]
|
||||
|
||||
for threads in threads_counts:
|
||||
print('-------------------------------------------------')
|
||||
print(f'Threads:{threads}')
|
||||
for n in sizes:
|
||||
m = np.random.randint(3, size=(n, n))
|
||||
do_threads(m, n, threads)
|
||||
|
||||
print('-------------------------------------------------')
|
||||
|
Loading…
Reference in New Issue
Block a user