DAS_2023_1/antonov_dmitry_lab_5/benchmark.py
2023-12-05 13:01:36 +04:00

83 lines
2.4 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import multiprocessing
import numpy as np
import time
def multiply_matrices(matrix_a, matrix_b):
if len(matrix_a[0]) != len(matrix_b):
raise ValueError("матрицы имеют разную длину")
result = [[0 for _ in range(len(matrix_b[0]))] for _ in range(len(matrix_a))]
for i in range(len(matrix_a)):
for j in range(len(matrix_b[0])):
for k in range(len(matrix_b)):
result[i][j] += matrix_a[i][k] * matrix_b[k][j]
return result
def multiply_row(args):
matrix_a, matrix_b, i = args
row_result = [0 for _ in range(len(matrix_b[0]))]
for j in range(len(matrix_b[0])):
for k in range(len(matrix_b)):
row_result[j] += matrix_a[i][k] * matrix_b[k][j]
return row_result, i
def multiply_matrices_parallel(matrix_a, matrix_b, threads):
if len(matrix_a[0]) != len(matrix_b):
raise ValueError("матрицы имеют разную длину")
result = [[0 for _ in range(len(matrix_b[0]))] for _ in range(len(matrix_a))]
with multiprocessing.Pool(processes=threads) as pool:
args_list = [(matrix_a, matrix_b, i) for i in range(len(matrix_a))]
rows_results = pool.map(multiply_row, args_list)
for row_result, row_index in rows_results:
result[row_index] = row_result
return result
def benchmark_sequential(size):
matrix_a = np.random.rand(size, size)
matrix_b = np.random.rand(size, size)
start_time = time.time()
multiply_matrices(matrix_a, matrix_b)
end_time = time.time()
return end_time - start_time
def benchmark_parallel(size, num_threads):
matrix_a = np.random.rand(size, size)
matrix_b = np.random.rand(size, size)
start_time = time.time()
multiply_matrices_parallel(matrix_a, matrix_b, num_threads)
end_time = time.time()
return end_time - start_time
if __name__ == "__main__":
sizes = [100, 300, 500]
threads = [2, 16, 32]
for size in sizes:
sequential_time = benchmark_sequential(size)
print(f"Время обычное: {sequential_time} с")
print(f"Размер матрицы: {size}x{size}")
for thread in threads:
for size in sizes:
parallel_time = benchmark_parallel(size, thread)
print(f"Размер матрицы: {size}x{size}")
print(f"Время параллельное: {parallel_time} с")
print(f"Потоков: {thread}")