davydov_yuriy_lab_5 #415

Open
YuriyDavydov wants to merge 1 commits from davydov_yuriy_lab_5 into main
3 changed files with 69 additions and 0 deletions

BIN
davydov_yuriy_lab_5/5.mp4 Normal file

Binary file not shown.

View File

@ -0,0 +1,10 @@
# Лабораторная работа №5 - Параллельное перемножение матриц
## ПИбд-42 || Давыдов Юрий
### Цель лабораторной работы
Изучение принципов параллельных вычислений, а также определение случаев, когда их использование оправдано, а когда — нет.
Описание:
Был реализован механизм параллельного умножения матриц размером 100x100, 300x300 и 500x500 с возможностью задания количества потоков, включая один поток (для последовательного умножения). Были произведены замеры времени для каждого вычисления, проведен анализ результатов и сделаны соответствующие выводы.

View File

@ -0,0 +1,59 @@
import random
import time
import multiprocessing
import numpy as np
# Генерация случайной матрицы
def create_random_matrix(dim):
return [[random.randint(0, 10) for _ in range(dim)] for _ in range(dim)]
# Умножение отдельной строки
def compute_row_product(row_idx, mat_a, mat_b, output_mat):
dim = len(mat_a)
for col_idx in range(dim):
for k in range(dim):
output_mat[row_idx][col_idx] += mat_a[row_idx][k] * mat_b[k][col_idx]
# Параллельное умножение матриц
def parallel_matrix_multiplication(mat_a, mat_b, num_workers):
dim = len(mat_a)
result_matrix = [[0] * dim for _ in range(dim)]
with multiprocessing.Pool(processes=num_workers) as pool:
pool.starmap(compute_row_product, [(i, mat_a, mat_b, result_matrix) for i in range(dim)])
return result_matrix
# Измерение времени выполнения
def run_benchmark(dim, num_workers=1):
mat_a = create_random_matrix(dim)
mat_b = create_random_matrix(dim)
start_time = time.time()
parallel_matrix_multiplication(mat_a, mat_b, num_workers)
elapsed_time = time.time() - start_time
return elapsed_time
def main():
# Размеры матриц
matrix_dimensions = [100, 300, 500]
# Количество рабочих процессов
worker_counts = [1, 2, 4, 6, 8]
# Печать таблицы с результатами
print("-*" * 40)
print(f"{'Количество процессов':<20}{'|100x100 (сек.)':<20}{'|300x300 (сек.)':<20}{'|500x500 (сек.)'}")
print("-*" * 40)
for workers in worker_counts:
row = f"{workers:<20}"
for dim in matrix_dimensions:
benchmark_time = run_benchmark(dim, workers)
row += f"|{benchmark_time:.4f}".ljust(20)
print(row)
print("-*" * 40)
if __name__ == "__main__":
main()