forked from Alexey/DAS_2024_1
58 lines
2.2 KiB
Python
58 lines
2.2 KiB
Python
|
import numpy as np
|
|||
|
from multiprocessing import Pool
|
|||
|
import time
|
|||
|
import argparse
|
|||
|
|
|||
|
|
|||
|
def determinant_block(matrix_block):
|
|||
|
"""Вычисляет детерминант блока матрицы."""
|
|||
|
return np.linalg.det(matrix_block)
|
|||
|
|
|||
|
|
|||
|
def determinant_parallel(matrix, num_processes):
|
|||
|
"""Вычисляет детерминант матрицы параллельно."""
|
|||
|
size = matrix.shape[0]
|
|||
|
step = size // num_processes
|
|||
|
|
|||
|
# Обработка случаев, когда размер матрицы не делится на число процессов
|
|||
|
blocks = []
|
|||
|
for i in range(num_processes):
|
|||
|
start_row = i * step
|
|||
|
end_row = start_row + step if i < num_processes - 1 else size
|
|||
|
blocks.append(matrix[start_row:end_row, start_row:end_row])
|
|||
|
|
|||
|
pool = Pool(processes=num_processes)
|
|||
|
dets = pool.map(determinant_block, blocks)
|
|||
|
pool.close()
|
|||
|
pool.join()
|
|||
|
|
|||
|
# Объединение детерминантов блоков
|
|||
|
return np.prod(dets)
|
|||
|
|
|||
|
|
|||
|
def benchmark(size, num_processes):
|
|||
|
"""Запускает бенчмарк для матрицы заданного размера и числа процессов."""
|
|||
|
matrix = np.random.rand(size, size)
|
|||
|
|
|||
|
# Параллельное вычисление детерминанта
|
|||
|
start = time.time()
|
|||
|
det_parallel = determinant_parallel(matrix, num_processes)
|
|||
|
end = time.time()
|
|||
|
print(f"Матрица {size}x{size} с {num_processes} процессами заняла {end - start:.5f} сек (Параллельно)")
|
|||
|
|
|||
|
# Последовательное вычисление детерминанта
|
|||
|
start = time.time()
|
|||
|
det_seq = determinant_block(matrix)
|
|||
|
end = time.time()
|
|||
|
print(f"Матрица {size}x{size} последовательный вычисление заняло {end - start:.5f} сек (Последовательно)")
|
|||
|
|
|||
|
|
|||
|
if __name__ == "__main__":
|
|||
|
parser = argparse.ArgumentParser(description="Вычисление детерминанта с параллельной обработкой")
|
|||
|
parser.add_argument("--processes", type=int, default=4)
|
|||
|
args = parser.parse_args()
|
|||
|
|
|||
|
sizes = [100, 300, 500]
|
|||
|
for size in sizes:
|
|||
|
benchmark(size, args.processes)
|