diff --git a/savenkov_alexander_lab_6/.idea/.gitignore b/savenkov_alexander_lab_6/.idea/.gitignore new file mode 100644 index 0000000..26d3352 --- /dev/null +++ b/savenkov_alexander_lab_6/.idea/.gitignore @@ -0,0 +1,3 @@ +# Default ignored files +/shelf/ +/workspace.xml diff --git a/savenkov_alexander_lab_6/.idea/discord.xml b/savenkov_alexander_lab_6/.idea/discord.xml new file mode 100644 index 0000000..30bab2a --- /dev/null +++ b/savenkov_alexander_lab_6/.idea/discord.xml @@ -0,0 +1,7 @@ + + + + + \ No newline at end of file diff --git a/savenkov_alexander_lab_6/.idea/inspectionProfiles/profiles_settings.xml b/savenkov_alexander_lab_6/.idea/inspectionProfiles/profiles_settings.xml new file mode 100644 index 0000000..105ce2d --- /dev/null +++ b/savenkov_alexander_lab_6/.idea/inspectionProfiles/profiles_settings.xml @@ -0,0 +1,6 @@ + + + + \ No newline at end of file diff --git a/savenkov_alexander_lab_6/.idea/misc.xml b/savenkov_alexander_lab_6/.idea/misc.xml new file mode 100644 index 0000000..4e6f3a1 --- /dev/null +++ b/savenkov_alexander_lab_6/.idea/misc.xml @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/savenkov_alexander_lab_6/.idea/modules.xml b/savenkov_alexander_lab_6/.idea/modules.xml new file mode 100644 index 0000000..592982c --- /dev/null +++ b/savenkov_alexander_lab_6/.idea/modules.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/savenkov_alexander_lab_6/.idea/savenkov_alexander_lab_6.iml b/savenkov_alexander_lab_6/.idea/savenkov_alexander_lab_6.iml new file mode 100644 index 0000000..74d515a --- /dev/null +++ b/savenkov_alexander_lab_6/.idea/savenkov_alexander_lab_6.iml @@ -0,0 +1,10 @@ + + + + + + + + + + \ No newline at end of file diff --git a/savenkov_alexander_lab_6/README.md b/savenkov_alexander_lab_6/README.md new file mode 100644 index 0000000..081d718 --- /dev/null +++ b/savenkov_alexander_lab_6/README.md @@ -0,0 +1,33 @@ +# Лабораторная работа №6 - Определение детерминанта матрицы с помощью параллельных вычислений + +Задание: + +Кратко: реализовать нахождение детерминанта квадратной матрицы. Что такое детерминант матрицы (или определитель) можно посмотреть по ссылке. + +Подробно: в лабораторной работе требуется сделать два алгоритма: обычный и параллельный (задание со * - реализовать это в рамках одного алгоритма). В параллельном алгоритме предусмотреть ручное задание количества потоков (число потоков = 1 как раз и реализует задание со *), каждый из которых будет выполнять нахождение отдельной группы множителей. + +Сделать несколько бенчмарков последовательного и параллельного алгоритма поиска детерминанта матрицы размером 100x100, 300x300, 500x500 элементов. Отразить свои наблюдения в readme-отчете. + +

+

Код
+ +

+

+

Код
+ +

+

+

Код
+ +

+

+

Работа программы
+ +

+ +Вывод: Параллельный алгоритм намного бысрее и имеет место быть если либо в матрице используются огромные числа или сама матрица намного большей размерностью + + +# Видео + +Видео с разбором лабораторной https://youtu.be/--PnevLHZ9k diff --git a/savenkov_alexander_lab_6/app.py b/savenkov_alexander_lab_6/app.py new file mode 100644 index 0000000..8d26bc6 --- /dev/null +++ b/savenkov_alexander_lab_6/app.py @@ -0,0 +1,69 @@ +import numpy as np +import time +from concurrent.futures import ThreadPoolExecutor + +def sequential_matrix_determinant(matrix): + """Выполняет последовательное вычисление детерминанта матрицы.""" + return np.linalg.det(matrix) + +def parallel_matrix_determinant(matrix, num_threads=1): + """ + Выполняет параллельное вычисление детерминанта матрицы с использованием заданного количества потоков. + Каждый поток обрабатывает свою часть вычислений. + """ + rows, cols = matrix.shape + chunk_size = rows // num_threads + + determinants = [] + + def calculate_determinant(start_row, end_row): + """Вычисление детерминанта для части матрицы.""" + nonlocal determinants + submatrix = matrix[start_row:end_row, :] + # Убедимся, что submatrix является квадратной + submatrix_size = min(submatrix.shape) + determinant = np.linalg.det(submatrix[:submatrix_size, :submatrix_size]) + determinants.append(determinant) + + with ThreadPoolExecutor(max_workers=num_threads) as executor: + futures = [] + for i in range(0, rows, chunk_size): + end_row = min(i + chunk_size, rows) + futures.append(executor.submit(calculate_determinant, i, end_row)) + + for future in futures: + future.result() + + return determinants + +def benchmark(matrix_size, num_threads=1): + """ + Измеряет время выполнения последовательного и параллельного вычисления детерминанта матриц + заданного размера с использованием заданного количества потоков. + """ + matrix = np.random.randint(0, 10, size=(matrix_size, matrix_size)) + + # Замер времени для последовательного алгоритма + start_time = time.time() + sequential_result = sequential_matrix_determinant(matrix) + sequential_time = time.time() - start_time + + # Замер времени для параллельного алгоритма + start_time = time.time() + parallel_result = parallel_matrix_determinant(matrix, num_threads) + parallel_time = time.time() - start_time + + return sequential_time, parallel_time + +if __name__ == "__main__": + matrix_sizes = [100, 300, 500] # Для демонстрации используем небольшие матрицы + num_threads = int(input("Введите количество потоков: ")) + + for size in matrix_sizes: + print(f"Matrix size: {size}x{size}") + sequential_time, parallel_time = benchmark(size, num_threads) + + print(f"Sequential algorithm time: {sequential_time:.6f} seconds") + print(f"Parallel algorithm time ({num_threads} threads): {parallel_time:.6f} seconds") + + print("="*30) diff --git a/savenkov_alexander_lab_6/screens/img1.png b/savenkov_alexander_lab_6/screens/img1.png new file mode 100644 index 0000000..48835d8 Binary files /dev/null and b/savenkov_alexander_lab_6/screens/img1.png differ diff --git a/savenkov_alexander_lab_6/screens/img2.png b/savenkov_alexander_lab_6/screens/img2.png new file mode 100644 index 0000000..688cc15 Binary files /dev/null and b/savenkov_alexander_lab_6/screens/img2.png differ diff --git a/savenkov_alexander_lab_6/screens/img3.png b/savenkov_alexander_lab_6/screens/img3.png new file mode 100644 index 0000000..cc7cff6 Binary files /dev/null and b/savenkov_alexander_lab_6/screens/img3.png differ diff --git a/savenkov_alexander_lab_6/screens/img4.png b/savenkov_alexander_lab_6/screens/img4.png new file mode 100644 index 0000000..b1522c8 Binary files /dev/null and b/savenkov_alexander_lab_6/screens/img4.png differ