diff --git a/rogashova_ekaterina_lab_5/img.png b/rogashova_ekaterina_lab_5/img.png new file mode 100644 index 0000000..5de5ae6 Binary files /dev/null and b/rogashova_ekaterina_lab_5/img.png differ diff --git a/rogashova_ekaterina_lab_5/main.py b/rogashova_ekaterina_lab_5/main.py new file mode 100644 index 0000000..e751a8d --- /dev/null +++ b/rogashova_ekaterina_lab_5/main.py @@ -0,0 +1,52 @@ +import numpy as np +import time +import multiprocessing + + +def matrix_multiply(A, B): + n = A.shape[0] + C = np.zeros((n, n)) + for i in range(n): + for j in range(n): + for k in range(n): + C[i, j] += A[i, k] * B[k, j] + return C + +def worker(A, B, C, row_indices): + for i in row_indices: + for j in range(B.shape[1]): + for k in range(A.shape[1]): + C[i, j] += A[i, k] * B[k, j] + +def parallel_matrix_multiply(A, B, num_processes): + n = A.shape[0] + C = np.zeros((n, n)) + + rows_per_process = n // num_processes + processes = [] + for i in range(num_processes): + start_row = i * rows_per_process + end_row = start_row + rows_per_process if i != num_processes - 1 else n + p = multiprocessing.Process(target=worker, args=(A, B, C, range(start_row, end_row))) + processes.append(p) + p.start() + + for p in processes: + p.join() + + return C + +def benchmark(matrix_size, num_processes): + A = np.random.rand(matrix_size, matrix_size) + B = np.random.rand(matrix_size, matrix_size) + + start_time = time.time() + C_par = parallel_matrix_multiply(A, B, num_processes) + par_time = time.time() - start_time + print(f"Размер матрицы: {matrix_size}x{matrix_size}, Потоки: {num_processes}, Время: {par_time:.4f} сек.") + +if __name__ == "__main__": + mat_sizes = [100, 300, 500] + for size in mat_sizes: + for num_processes in [1, 2, 4]: + benchmark(size, num_processes) diff --git a/rogashova_ekaterina_lab_5/readme.md b/rogashova_ekaterina_lab_5/readme.md new file mode 100644 index 0000000..00db661 --- /dev/null +++ b/rogashova_ekaterina_lab_5/readme.md @@ -0,0 +1,23 @@ +# Лабораторная работа №5 + +## Описание +Код реализует умножение квадратных матриц с использованием последовательного и параллельного подхода на основе библиотек numpy и multiprocessing. + +Функция matrix_multiply(A, B) - выполняет умножение матриц + +Функция worker(A, B, C, row_indices) - умножение матриц для определенного диапазона + +Функция parallel_matrix_multiply(A, B, num_processes) - делит строки матрицы между процессами и создает процессы для выполнения функции worker, которая обрабатывает каждую партию строк + +Функция benchmark(matrix_size, num_processes) - генерирует матрицы и выполняет параллельное умножение, вычисляя затраченное время. + +## Вывод работы +Этот код позволяет сравнивать производительность обычного и параллельного умножения матриц для разных размеров. Он помогает понять, как использование многопоточности может ускорить выполнение ресурсоемких операций, таких как умножение больших матриц. +По получившемуся времени, можно заметить, что параллельное умножение больше подходит для больших матриц, чем для маленьких. Заметно большое уменьшение времени при параллельном вычислении в больших матрицах. В матрице 100*100 ускорения почти нет, чаще всего происходит такое, что при увеличении потоков - увеличивается время умножения. +Это связано с тем, что система тратит время и ресурсы на создание и управление потоками. +Для малых задач эти накладные расходы могут превышать преимущества, получаемые от параллельной обработки. + +![img.png](img.png) + +## Видео +Работоспособность представлена на [видео](https://vk.com/video204968285_456240929). \ No newline at end of file