DAS_2023_1/savenkov_alexander_lab_6/app.py

70 lines
3.0 KiB
Python
Raw Normal View History

2024-01-18 11:46:45 +04:00
import numpy as np
import time
from concurrent.futures import ThreadPoolExecutor
def sequential_matrix_determinant(matrix):
"""Выполняет последовательное вычисление детерминанта матрицы."""
return np.linalg.det(matrix)
def parallel_matrix_determinant(matrix, num_threads=1):
"""
Выполняет параллельное вычисление детерминанта матрицы с использованием заданного количества потоков.
Каждый поток обрабатывает свою часть вычислений.
"""
rows, cols = matrix.shape
chunk_size = rows // num_threads
determinants = []
def calculate_determinant(start_row, end_row):
"""Вычисление детерминанта для части матрицы."""
nonlocal determinants
submatrix = matrix[start_row:end_row, :]
# Убедимся, что submatrix является квадратной
submatrix_size = min(submatrix.shape)
determinant = np.linalg.det(submatrix[:submatrix_size, :submatrix_size])
determinants.append(determinant)
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(calculate_determinant, i, end_row))
for future in futures:
future.result()
return determinants
def benchmark(matrix_size, num_threads=1):
"""
Измеряет время выполнения последовательного и параллельного вычисления детерминанта матриц
заданного размера с использованием заданного количества потоков.
"""
matrix = np.random.randint(0, 10, size=(matrix_size, matrix_size))
# Замер времени для последовательного алгоритма
start_time = time.time()
sequential_result = sequential_matrix_determinant(matrix)
sequential_time = time.time() - start_time
# Замер времени для параллельного алгоритма
start_time = time.time()
parallel_result = parallel_matrix_determinant(matrix, 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)