sergeev_evgenii_lab_5 is done! #173
@ -0,0 +1,36 @@
|
||||
# Лабораторная работа №5 - Вспоминаем математику или параллельное перемножение матриц
|
||||
|
||||
Задание
|
||||
|
||||
Кратко: реализовать умножение двух больших квадратных матриц.
|
||||
|
||||
Подробно: в лабораторной работе требуется сделать два алгоритма: обычный и параллельный (задание со * -
|
||||
реализовать это в рамках одного алгоритма). В параллельном алгоритме предусмотреть ручное задание количества потоков
|
||||
(число потоков = 1 как раз и реализует задание со *), каждый из которых будет выполнять умножение элементов матрицы в
|
||||
рамках своей зоны ответственности
|
||||
|
||||
Код:
|
||||

|
||||
|
||||
Код:
|
||||

|
||||
|
||||
Код:
|
||||

|
||||
|
||||
Вывод программы:
|
||||

|
||||
|
||||
Заключение
|
||||
|
||||
Сделать несколько бенчмарков последовательного и параллельного алгоритма на умножение двух матриц размером 100x100,
|
||||
300x300, 500x500 элементов.
|
||||
|
||||
|
||||
Вывод: Параллельный алгоритм работает намного быстрее, так как вычисления происходят в различных потоках в одно и то же
|
||||
время. Его следует использовать, если в матрице присутствуют огромные числа или сама матрица большой размерности
|
||||
|
||||
# Видео
|
||||
|
||||
Видео с разбором лабораторной работы:
|
||||
https://youtu.be/dcVWNjDzG8M
|
BIN
sergeev_evgenii_lab_5/images/img.png
Normal file
BIN
sergeev_evgenii_lab_5/images/img.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 46 KiB |
BIN
sergeev_evgenii_lab_5/images/img_1.png
Normal file
BIN
sergeev_evgenii_lab_5/images/img_1.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 47 KiB |
BIN
sergeev_evgenii_lab_5/images/img_2.png
Normal file
BIN
sergeev_evgenii_lab_5/images/img_2.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 34 KiB |
BIN
sergeev_evgenii_lab_5/images/img_3.png
Normal file
BIN
sergeev_evgenii_lab_5/images/img_3.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 28 KiB |
48
sergeev_evgenii_lab_5/matrix.py
Normal file
48
sergeev_evgenii_lab_5/matrix.py
Normal file
@ -0,0 +1,48 @@
|
||||
import numpy as np
|
||||
import time
|
||||
from concurrent.futures import ThreadPoolExecutor
|
||||
|
||||
|
||||
def sequential_matrix_multiply(matrix_a, matrix_b):
|
||||
return np.dot(matrix_a, matrix_b)
|
||||
|
||||
|
||||
def parallel_matrix_multiply(matrix_a, matrix_b, num_threads):
|
||||
result = np.zeros_like(matrix_a)
|
||||
rows, cols = matrix_a.shape
|
||||
|
||||
def multiply_row(row):
|
||||
nonlocal matrix_a, matrix_b, result
|
||||
result[row, :] = np.dot(matrix_a[row, :], matrix_b)
|
||||
|
||||
with ThreadPoolExecutor(max_workers=num_threads) as executor:
|
||||
executor.map(multiply_row, range(rows))
|
||||
|
||||
return result
|
||||
|
||||
|
||||
def benchmark(matrix_size, num_threads=1):
|
||||
matrix_a = np.random.rand(matrix_size, matrix_size)
|
||||
matrix_b = np.random.rand(matrix_size, matrix_size)
|
||||
|
||||
start_time = time.time()
|
||||
sequential_result = sequential_matrix_multiply(matrix_a, matrix_b)
|
||||
sequential_time = time.time() - start_time
|
||||
|
||||
start_time = time.time()
|
||||
parallel_result = parallel_matrix_multiply(matrix_a, matrix_b, num_threads)
|
||||
parallel_time = time.time() - start_time
|
||||
|
||||
return sequential_time, parallel_time
|
||||
|
||||
|
||||
# Пример использования для матриц размером 100x100, 300x300, 500x500 элементов
|
||||
matrix_sizes = [100, 300, 500]
|
||||
threads_count = 4 # Указать желаемое количество потоков
|
||||
|
||||
for size in matrix_sizes:
|
||||
sequential_time, parallel_time = benchmark(size, threads_count)
|
||||
print(f"Размер матрицы: {size}x{size}")
|
||||
print(f"Время с последовательным выполнением: {sequential_time:.6f} секунд")
|
||||
print(f"Время с параллельной обработкой ({threads_count} потоков): {parallel_time:.6f} секунд")
|
||||
print("=" * 30)
|
Loading…
x
Reference in New Issue
Block a user