67 lines
2.7 KiB
Python
67 lines
2.7 KiB
Python
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=1):
|
||
"""
|
||
Выполняет параллельное умножение матриц с использованием заданного количества потоков.
|
||
Каждый поток обрабатывает свою часть строк матрицы A.
|
||
"""
|
||
result = np.zeros_like(matrix_a)
|
||
rows, cols = matrix_a.shape
|
||
chunk_size = rows // num_threads
|
||
|
||
def multiply_chunk(start_row, end_row):
|
||
"""Умножение части матрицы A на матрицу B."""
|
||
nonlocal result
|
||
for i in range(start_row, end_row):
|
||
result[i] = np.dot(matrix_a[i], matrix_b)
|
||
|
||
with ThreadPoolExecutor(max_workers=num_threads) as executor:
|
||
futures = []
|
||
for i in range(0, rows, chunk_size):
|
||
end_row = min(i + chunk_size, rows)
|
||
futures.append(executor.submit(multiply_chunk, i, end_row))
|
||
|
||
for future in futures:
|
||
future.result()
|
||
|
||
return result
|
||
|
||
def benchmark(matrix_size, num_threads=1):
|
||
"""
|
||
Измеряет время выполнения последовательного и параллельного умножения матриц
|
||
заданного размера с использованием заданного количества потоков.
|
||
"""
|
||
matrix_a = np.random.randint(0, 10, size=(matrix_size, matrix_size))
|
||
matrix_b = np.random.randint(0, 10, size=(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
|
||
|
||
if __name__ == "__main__":
|
||
matrix_sizes = [100, 300, 500]
|
||
num_threads = int(input("Введите количество потоков: "))
|
||
|
||
for size in matrix_sizes:
|
||
print(f"Matrix size: {size}x{size}")
|
||
sequential_time, parallel_time = benchmark(size, num_threads)
|
||
|
||
print(f"Sequential algorithm time: {sequential_time:.6f} seconds")
|
||
print(f"Parallel algorithm time ({num_threads} threads): {parallel_time:.6f} seconds")
|
||
|
||
print("="*30)
|