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