49 lines
1.7 KiB
Python
49 lines
1.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):
|
|||
|
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)
|