diff --git a/simonov_nikita_lab_5/main.py b/simonov_nikita_lab_5/main.py new file mode 100644 index 0000000..40c6615 --- /dev/null +++ b/simonov_nikita_lab_5/main.py @@ -0,0 +1,74 @@ +import multiprocessing +import numpy as np +import time + +def sequential_multiply_matrix(A, B): + rows_A = len(A) + cols_A = len(A[0]) + rows_B = len(B) + cols_B = len(B[0]) + + if cols_A != rows_B: + print("Умножение матриц невозможно.") + return + + result_matrix = [[0 for row in range(cols_B)] for col in range(rows_A)] + + for i in range(rows_A): + for j in range(cols_B): + for k in range(cols_A): + result_matrix[i][j] += A[i][k] * B[k][j] + + return result_matrix + +def parallel_multiply_matrix(A, B, num_processes): + rows_A = len(A) + cols_A = len(A[0]) + rows_B = len(B) + cols_B = len(B[0]) + + if cols_A != rows_B: + print("Умножение матриц невозможно.") + return + + result_matrix = [[0 for row in range(cols_B)] for col in range(rows_A)] + + chunk_size = int(rows_A / num_processes) + + processes = [] + for i in range(num_processes): + start = chunk_size * i + end = chunk_size * (i + 1) if i < num_processes - 1 else rows_A + + p = multiprocessing.Process(target=perform_multiplication, args=(A, B, result_matrix, start, end)) + processes.append(p) + p.start() + + for p in processes: + p.join() + + return result_matrix + +def perform_multiplication(A, B, result_matrix, start, end): + for i in range(start, end): + for j in range(len(B[0])): + for k in range(len(A[0])): + result_matrix[i][j] += A[i][k] * B[k][j] + +if __name__ == "__main__": + matrix_sizes = [100, 300, 500] + num_processes = 4 + + for n in matrix_sizes: + matrix_A = np.random.randint(10, size=(n, n)) + matrix_B = np.random.randint(10, size=(n, n)) + + start_time = time.time() + sequential_result = sequential_multiply_matrix(matrix_A, matrix_B) + end_time = time.time() + print(f"Последовательное умножение {n}x{n} матриц заняло: {end_time - start_time} секунд") + + start_time = time.time() + parallel_result = parallel_multiply_matrix(matrix_A, matrix_B, num_processes) + end_time = time.time() + print(f"Параллельное умножение {n}x{n} матриц заняло: {end_time - start_time}") diff --git a/simonov_nikita_lab_5/readme.md b/simonov_nikita_lab_5/readme.md new file mode 100644 index 0000000..9d2445e --- /dev/null +++ b/simonov_nikita_lab_5/readme.md @@ -0,0 +1,31 @@ +# Лабораторная работа №5. + +## Задание + +Реализовать умножение двух больших квадратных матриц + +## Ход выполнения + +- Реализовать алгоритм перемножение матриц для потокового выполнения +- Адаптировать алгоритм для параллельного выполнения: +- Разделить данные на чанки, сохранив корректность вычислений + +## Технологии +- `numpy`: библиотека для работы с многомерными массивами и матрицами в Python. +- `multiprocessing`: модуль Python, предоставляющий возможность создания и управления процессами, что позволяет реализовать параллельные вычисления. + +## Ход работы + +- `sequential_multiply_matrix`: Функция выполняет последовательное умножение двух матриц. Перед умножением производится проверка на возможность выполнения операции. Результат сохраняется в новой матрице. + +- `parallel_multiply_matrix`: Функция выполняет параллельное умножение двух матриц, разделяя работу между указанным числом процессов. Также производится проверка на возможность умножения матриц. Результат сохраняется в новой матрице. + +- `perform_multiplication`: Вспомогательная функция, используемая в параллельном умножении. Каждый процесс выполняет умножение только для своего "куска" матрицы. + +## Результаты + +![](screens/Screenshot_1.png) + +## Ссылка на видео + +https://drive.google.com/file/d/18GxoovYjWLUAOhtsORBzBUByu4HdIeY8/view?usp=sharing \ No newline at end of file diff --git a/simonov_nikita_lab_5/screens/Screenshot_1.png b/simonov_nikita_lab_5/screens/Screenshot_1.png new file mode 100644 index 0000000..ed00517 Binary files /dev/null and b/simonov_nikita_lab_5/screens/Screenshot_1.png differ