diff --git a/bogdanov_dmitry_lab_6/MatrixDet/main.py b/bogdanov_dmitry_lab_6/MatrixDet/main.py new file mode 100644 index 0000000..a528c30 --- /dev/null +++ b/bogdanov_dmitry_lab_6/MatrixDet/main.py @@ -0,0 +1,103 @@ +import random as rnd +import threading +import time +import concurrent.futures +from copy import deepcopy + +def generateSquareMatrix(size): + return [[rnd.randint(0, 100) for i in range(size)] for j in range(size)] + +def printMatrix(matrix): + for row in matrix: + print(*row, sep="\t") + +testmatrix = generateSquareMatrix(500) + +def process_row(args): + i, j, m, n = args + + factor = m[j][i] / m[i][i] + + for k in range(i, n): + m[j][k] -= factor * m[i][k] + + return m[j] + + +def parallel_det(matrix, threadss): + n = len(matrix) + + m = deepcopy(matrix) + + det_value = 1 + + def process_row(i, j): + factor = m[j][i] / m[i][i] + for k in range(i, n): + m[j][k] -= factor * m[i][k] + + for i in range(n): + if m[i][i] == 0: + for j in range(i + 1, n): + if m[j][i] != 0: + m[i], m[j] = m[j], m[i] + + det_value *= -1 + + break + else: + return 0 + + with concurrent.futures.ThreadPoolExecutor(max_workers=threadss) as executor: + futures = [ + executor.submit(process_row, i, j) for j in range(i + 1, n) + ] + concurrent.futures.wait(futures) + + det_value *= m[i][i] + + return det_value + + +def det(matrix): + n = len(matrix) + m = [row[:] for row in matrix] + det_value = 1 + + for i in range(n): + if m[i][i] == 0: + for j in range(i + 1, n): + if m[j][i] != 0: + m[i], m[j] = m[j], m[i] + + det_value *= -1 + + break + else: + return 0 + + for j in range(i + 1, n): + factor = m[j][i] / m[i][i] + + for k in range(i, n): + m[j][k] -= factor * m[i][k] + + det_value *= m[i][i] + + return det_value + + +if __name__ == "__main__": + + sizes = [100, 300, 500] + num_threads = [1, 5, 8, 12] + + for size in sizes: + matrix1 = generateSquareMatrix(size) + for threads in num_threads: + start_time = time.time() + parallel_det(matrix1, threads) + end_time = time.time() + print(f"Parallel size {size}, {threads} thread(s): {end_time - start_time}s") + + print("-" * 100) \ No newline at end of file diff --git a/bogdanov_dmitry_lab_6/README.md b/bogdanov_dmitry_lab_6/README.md new file mode 100644 index 0000000..1fc8b88 --- /dev/null +++ b/bogdanov_dmitry_lab_6/README.md @@ -0,0 +1,18 @@ +# Богданов Дмитрий ПИбд-42 +# Лабораторная работа №6 + + +## Функционал: + - Были созданы методы генерации и отображения матриц заданного размера + - Былы созданы методы для параллельного вычисления детерминанта с использованием concurrent.futures + - Был написан код для бенчмаркинга стандартного и параллельного вычислений (стандартное вычисление - вычисление в одном единственном потоке) + +## Результаты выполнения: + +![изображение 1](./images/1.png) + +### Вывод: +Подобно прошлой лабораторной, параллельное вычисление определителя может принести выигрыш только на очень больших матрицах, в то время как на остальных больше времени тратится на управление потоками. + + +## [Видео](https://drive.google.com/file/d/1T2xtHROQ34iXZTG_ue6ahV5G-e9GzuaD/view?usp=sharing) \ No newline at end of file diff --git a/bogdanov_dmitry_lab_6/images/1.png b/bogdanov_dmitry_lab_6/images/1.png new file mode 100644 index 0000000..a649cc5 Binary files /dev/null and b/bogdanov_dmitry_lab_6/images/1.png differ