rogashova_ekaterina_lab_5 #203
BIN
rogashova_ekaterina_lab_5/img.png
Normal file
BIN
rogashova_ekaterina_lab_5/img.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 32 KiB |
52
rogashova_ekaterina_lab_5/main.py
Normal file
52
rogashova_ekaterina_lab_5/main.py
Normal 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)
|
23
rogashova_ekaterina_lab_5/readme.md
Normal file
23
rogashova_ekaterina_lab_5/readme.md
Normal 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).
|
Loading…
Reference in New Issue
Block a user