rogashova_ekaterina_lab_5 #203

Open
rkaterina wants to merge 1 commits from rogashova_ekaterina_lab_5 into main
3 changed files with 75 additions and 0 deletions

Binary file not shown.

After

Width:  |  Height:  |  Size: 32 KiB

View File

@ -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)

View File

@ -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).