diff --git a/klyushenkova_ksenia_lab_6/REDME.md b/klyushenkova_ksenia_lab_6/REDME.md new file mode 100644 index 0000000..37bea0f --- /dev/null +++ b/klyushenkova_ksenia_lab_6/REDME.md @@ -0,0 +1,17 @@ +# Клюшенкова Ксения ПИбд-42 +# Лабораторная работа №6 - Определение детерминанта матрицы + + +## Результат: +![results](./res.jpg) + +## Выводы: + +1. Применение многопоточности позволяет ускорить вычисление определителя для матриц большого размера. +2. В ходе эксперимента было установлено, что для матрицы размером 10 на 10 при использовании одного потока время выполнения составляет 31 секунду. Однако при использовании 10 потоков время выполнения сокращается до 5 секунд. +3. Однако при работе с матрицами небольшого размера использование многопоточности может привести к снижению производительности. +4. Для матрицы размером 8 на 8 использование 10 потоков оказывается менее эффективным, чем использование 4 или 8 потоков. Это связано с дополнительными затратами на создание и управление потоками, которые становятся значительными при небольших объёмах вычислений. +5. Использование многопоточности позволяет значительно сократить время выполнения для матриц большого размера. Однако для достижения наилучших результатов необходимо выбрать оптимальное количество потоков в зависимости от размера задачи, чтобы избежать дополнительных затрат. + + +## [Видео](https://drive.google.com/file/d/1bdc3WzkHtTI3p-Yk2w3OP3ldMP8WwjZ8/view?usp=sharing) \ No newline at end of file diff --git a/klyushenkova_ksenia_lab_6/main-1.py b/klyushenkova_ksenia_lab_6/main-1.py new file mode 100644 index 0000000..2ce92c8 --- /dev/null +++ b/klyushenkova_ksenia_lab_6/main-1.py @@ -0,0 +1,64 @@ +import numpy as np +from time import time +import multiprocessing + + +def task(matrix, start_j, stop_j, queue): + size = len(matrix[0]) + if size == 2: # Базовый случай: определитель 2x2 + det = matrix[0][0] * matrix[1][1] - matrix[1][0] * matrix[0][1] + if queue is not None: + queue.put(det) + return det + else: + res = 0 + for j in range(start_j, stop_j): + # Удаляем строку и столбец с помощью срезов (более эффективно) + tmp = matrix[1:, :j] + tmp = np.hstack((tmp, matrix[1:, j + 1:])) + + a = matrix[0][j] + b = task(tmp, 0, len(tmp[0]), None) + + if j % 2 == 0: + res += a * b + else: + res += a * b * (-1) + + if queue is not None: + queue.put(res) + return res + + +if __name__ == '__main__': + sizes = [5, 6, 7, 8, 9, 10] + threads_counts = [1, 4, 6, 8, 10] + + for threads in threads_counts: + print(f'Количество потоков: {threads}') + for size in sizes: + matrix = np.random.randint(10, size=(size, size)) + + offset = int(size / threads) + offset_last = size % threads + offset + + processes = [] + queue = multiprocessing.Queue() + 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=task, args=(matrix, start_, stop_, queue)) + processes.append(process) + process.start() + + total_result = 0 + for p in processes: + p.join() + total_result += queue.get() + + stop = time() + print(f'Размер: {size}x{size}, время выполнения: {stop - start} сек') + + print() diff --git a/klyushenkova_ksenia_lab_6/res.jpg b/klyushenkova_ksenia_lab_6/res.jpg new file mode 100644 index 0000000..29fcefa Binary files /dev/null and b/klyushenkova_ksenia_lab_6/res.jpg differ