diff --git a/tasks/plaksina-av/lab_6/README.md b/tasks/plaksina-av/lab_6/README.md new file mode 100644 index 0000000..702ebe2 --- /dev/null +++ b/tasks/plaksina-av/lab_6/README.md @@ -0,0 +1,79 @@ +# Отчет по лабораторной работе №6 + +Выполнила студентка гр. ИСЭбд-41 Плаксина А.В. + +# Описание работы приложения + +Приложение реализовнао на языке питон, использована среда PyCharm для разработки. + +Это консольное приложение, которое вычисляет детерминант матриц. Задается размерность матрицы, элементы генерируются рандомно (указываетя только диапазон их значений), количество + +Код реализующий заполнение данных: + +```cs +if __name__ == "__main__": + matrix_size = 10 # размер матрицы + lower_limit = 5 # числа в матрице от + upper_limit = 15 # и до + processes = [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) +``` + +Код реализующий последовательное вычисление детерминанта матриц: + +```cs +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} секунд") + +``` +Код реализующий параллельное вычисление детерминанта матриц: + +```cs +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} секунд") + + +``` +# Бенчмаркинг + +Для матриц болших размеров детерминант вычисляется очень долгое время, поэтому для примера я взяла размерность матрица 10х10 + +Результаты бенчмаркинга для последовательного способа вычисления детерминанта матриц: + +![](photo/ph32.jpg) + +Результаты бенчмаркинга для параллельного способа вычисления детерминанта матриц с различным количеством потока: + +![](photo/ph31.jpg) + +# Вывод + +Скорость обработки у параллельного способа значительно выше, чем у последовательного + +При увеличении количества потоков время обработки сначала снижается, затем, по примеру, начиная с 16 потока, время опять увеличивается, так как потоков становится слишком много. \ No newline at end of file diff --git a/tasks/plaksina-av/lab_6/determinant.py b/tasks/plaksina-av/lab_6/determinant.py new file mode 100644 index 0000000..0487924 --- /dev/null +++ b/tasks/plaksina-av/lab_6/determinant.py @@ -0,0 +1,71 @@ +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 = 10 # размер матрицы + lower_limit = 5 # числа в матрице от + upper_limit = 15 # и до + processes = [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) \ No newline at end of file diff --git a/tasks/plaksina-av/lab_6/photo/ph31.jpg b/tasks/plaksina-av/lab_6/photo/ph31.jpg new file mode 100644 index 0000000..d4dc0c8 Binary files /dev/null and b/tasks/plaksina-av/lab_6/photo/ph31.jpg differ diff --git a/tasks/plaksina-av/lab_6/photo/ph32.jpg b/tasks/plaksina-av/lab_6/photo/ph32.jpg new file mode 100644 index 0000000..5478f65 Binary files /dev/null and b/tasks/plaksina-av/lab_6/photo/ph32.jpg differ