diff --git a/antonov_dmitry_lab_6/README.md b/antonov_dmitry_lab_6/README.md new file mode 100644 index 0000000..475144e --- /dev/null +++ b/antonov_dmitry_lab_6/README.md @@ -0,0 +1,70 @@ +# Лабораторная работа №6 - Определение детерминанта матрицы с помощью параллельных вычислений + +Изучение параллельного вычисления дискриминанта + +# Задачи + +Кратко: реализовать нахождение детерминанта квадратной матрицы. + +Подробно: в лабораторной работе требуется сделать два алгоритма: обычный и параллельный +(задание со * - реализовать это в рамках одного алгоритма). +В параллельном алгоритме предусмотреть ручное задание количества потоков (число потоков = 1 +как раз и реализует задание со *), каждый из которых будет выполнять нахождение отдельной +группы множителей. + +Сделать несколько бенчмарков последовательного и параллельного алгоритма поиска детерминанта +матрицы размером 100x100, 300x300, 500x500 элементов. +# Запуск + +Проект запускается в ide просто по нажатию у питон файла на функцию мейн. +Нужно последовательно запустить функцию мейн у файлов parallel_determ.py. + +# Описание работы: + +Приложение представляет собой консольное приложение для вычисления детерминанта +рандомной матрицы с числами определенного диапазона и размера матрицы. +В программе предусмотрена возможность задания количества процессов для распараллеливания. +Используется библиотека python multiprocessing. + +На рис 3 видно, что с использованием параллельного алгоритма скорость обработки увеличивается довольно +существенно. Но оптимальная скорость достигается при кол-ве потоков = кол-ву потоков процессора +У меня их 8. + +

+

Вводим значения в скрипт
+ +

+

+

Параллельное умножение в коде
+ +

+

+

Сравнение бенчмарков
+ +

+ +* Размер матрицы для эксперимента 10*10 +* Потоков 1 +* Параллельный детерминант: 195955762.2581097 +* Параллельное время: 5.735873222351074 секунд +* Потоков 2 +* Параллельный детерминант: 4409801072.873513 +* Параллельное время: 3.585620164871216 секунд +* Потоков 4 +* Параллельный детерминант: -219763547.41593504 +* Параллельное время: 2.174274206161499 секунд +* Потоков 8 +* Параллельный детерминант: 2067674869.5092595 +* Параллельное время: 1.8252685070037842 секунд +* Потоков 16 +* Параллельный детерминант: 653887070.4597099 +* Параллельное время: 1.887946605682373 секунд +* Потоков 32 +* Параллельный детерминант: 802268193.971918 +* Параллельное время: 3.3444454669952393 секунд + + + +# Ссылка на видео +https://disk.yandex.ru/i/PMBcmHiqJEjAcg + diff --git a/antonov_dmitry_lab_6/parallel_determ.py b/antonov_dmitry_lab_6/parallel_determ.py new file mode 100644 index 0000000..9b18cc9 --- /dev/null +++ b/antonov_dmitry_lab_6/parallel_determ.py @@ -0,0 +1,72 @@ +import random +from multiprocessing import Pool +import time + + +def submatrix(matrix, row, col): + return [[matrix[i][j] for j in range(len(matrix[i])) if j != col] for i in range(len(matrix)) if i != row] + + +def determinant(matrix): + size = len(matrix) + + # Простой случай: детерминант матрицы 1x1 + if size == 1: + return matrix[0][0] + + # Простой случай: детерминант матрицы 2x2 + if size == 2: + return matrix[0][0] * matrix[1][1] - matrix[0][1] * matrix[1][0] + + det = 0 + for col in range(size): + det += ((-1) ** col) * matrix[0][col] * determinant(submatrix(matrix, 0, col)) + + return det + + +def generate_random_matrix(size, lower_limit, upper_limit): + return [[random.uniform(lower_limit, upper_limit) for _ in range(size)] for _ in range(size)] + + +def sequential_determinant_calculation(matrix_size, lower_limit, upper_limit): + random_matrix = generate_random_matrix(matrix_size, lower_limit, upper_limit) + + start_time = time.time() + result = determinant(random_matrix) + end_time = time.time() + + print(f"Последовательный детерминант: {result}") + print(f"Последовательное время: {end_time - start_time} секунд") + + +def parallel_determinant_calculation(matrix_size, lower_limit, upper_limit, num_processes): + random_matrix = generate_random_matrix(matrix_size, lower_limit, upper_limit) + + matrices_to_process = [submatrix(random_matrix, 0, col) for col in range(matrix_size)] + + start_time = time.time() + with Pool(processes=num_processes) as pool: + determinants = pool.map(determinant, matrices_to_process) + + result = sum(((-1) ** col) * random_matrix[0][col] * det for col, det in enumerate(determinants)) + end_time = time.time() + + print(f"Параллельный детерминант: {result}") + print(f"Параллельное время: {end_time - start_time} секунд") + + +if __name__ == "__main__": + matrix_size = 20 # размер матрицы + lower_limit = 10 # числа в матрице от + upper_limit = 20 # и до + processes = [1, 2, 4, 8, 16, 32] + # + # # последовательное вычисление + # sequential_determinant_calculation(matrix_size, lower_limit, upper_limit) + + # параллельное вычисление + for i in processes: + print("Потоков " + str(i)) + parallel_determinant_calculation(matrix_size, lower_limit, upper_limit, i) + diff --git a/antonov_dmitry_lab_6/screens/img.png b/antonov_dmitry_lab_6/screens/img.png new file mode 100644 index 0000000..075a416 Binary files /dev/null and b/antonov_dmitry_lab_6/screens/img.png differ diff --git a/antonov_dmitry_lab_6/screens/img_1.png b/antonov_dmitry_lab_6/screens/img_1.png new file mode 100644 index 0000000..5c235bc Binary files /dev/null and b/antonov_dmitry_lab_6/screens/img_1.png differ diff --git a/antonov_dmitry_lab_6/screens/img_2.png b/antonov_dmitry_lab_6/screens/img_2.png new file mode 100644 index 0000000..cc5e425 Binary files /dev/null and b/antonov_dmitry_lab_6/screens/img_2.png differ