sergeev_evgenii_lab_6 is done #174
@ -0,0 +1,32 @@
|
||||
# Лабораторная работа №6 - Определение детерминанта матрицы с помощью параллельных вычислений
|
||||
|
||||
Задание:
|
||||
|
||||
Кратко: реализовать нахождение детерминанта квадратной матрицы.
|
||||
|
||||
Подробно: в лабораторной работе требуется сделать два алгоритма: обычный и параллельный (задание со * -
|
||||
реализовать это в рамках одного алгоритма). В параллельном алгоритме предусмотреть ручное задание количества потоков
|
||||
(число потоков = 1 как раз и реализует задание со *), каждый из которых будет выполнять нахождение отдельной группы
|
||||
множителей
|
||||
|
||||
Сделать несколько бенчмарков последовательного и параллельного алгоритма поиска детерминанта матрицы размером
|
||||
100x100, 300x300, 500x500 элементов. Отразить свои наблюдения в readme-отчете.
|
||||
|
||||
Код:
|
||||
![Alt text](images/img.png)
|
||||
|
||||
Код:
|
||||
![Alt text](images/img_1.png)
|
||||
|
||||
Код:
|
||||
![Alt text](images/img_2.png)
|
||||
|
||||
Вывод:
|
||||
|
||||
С увеличением количества потоков параллельный способ работает быстрее. При меньшем количестве потоков обычный способ
|
||||
обрабатывает задачу эффективнее
|
||||
|
||||
# Видео
|
||||
|
||||
Видео с разбором лабораторной:
|
||||
https://youtu.be/ty9KQNjDrWM
|
BIN
sergeev_evgenii_lab_6/images/img.png
Normal file
BIN
sergeev_evgenii_lab_6/images/img.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 44 KiB |
BIN
sergeev_evgenii_lab_6/images/img_1.png
Normal file
BIN
sergeev_evgenii_lab_6/images/img_1.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 37 KiB |
BIN
sergeev_evgenii_lab_6/images/img_2.png
Normal file
BIN
sergeev_evgenii_lab_6/images/img_2.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 51 KiB |
58
sergeev_evgenii_lab_6/matrix.py
Normal file
58
sergeev_evgenii_lab_6/matrix.py
Normal file
@ -0,0 +1,58 @@
|
||||
import numpy as np
|
||||
import time
|
||||
from concurrent.futures import ThreadPoolExecutor
|
||||
|
||||
|
||||
def sequential_determinant(matrix):
|
||||
return np.linalg.det(matrix)
|
||||
|
||||
|
||||
def parallel_determinant(matrix, num_threads):
|
||||
determinant = 1.0
|
||||
n = len(matrix)
|
||||
|
||||
def calculate_partial_determinant(start, end):
|
||||
nonlocal determinant
|
||||
for i in range(start, end):
|
||||
determinant *= matrix[i, i]
|
||||
|
||||
with ThreadPoolExecutor(max_workers=num_threads) as executor:
|
||||
chunk_size = n // num_threads
|
||||
futures = []
|
||||
|
||||
for i in range(0, n, chunk_size):
|
||||
start = i
|
||||
end = min(i + chunk_size, n)
|
||||
futures.append(executor.submit(calculate_partial_determinant, start, end))
|
||||
|
||||
# Wait for all threads to finish
|
||||
for future in futures:
|
||||
future.result()
|
||||
|
||||
return determinant
|
||||
|
||||
|
||||
def benchmark(matrix_size, num_threads=1):
|
||||
matrix = np.random.rand(matrix_size, matrix_size)
|
||||
|
||||
start_time = time.time()
|
||||
sequential_result = sequential_determinant(matrix)
|
||||
sequential_time = time.time() - start_time
|
||||
|
||||
start_time = time.time()
|
||||
parallel_result = parallel_determinant(matrix, num_threads)
|
||||
parallel_time = time.time() - start_time
|
||||
|
||||
return sequential_time, parallel_time
|
||||
|
||||
|
||||
# Пример использования для матриц размером 100x100, 300x300, 500x500 элементов
|
||||
matrix_sizes = [100, 300, 500]
|
||||
num_threads = 1 # Указать желаемое количество потоков
|
||||
|
||||
for size in matrix_sizes:
|
||||
sequential_time, parallel_time = benchmark(size, num_threads)
|
||||
print(f"Размер матрицы: {size}x{size}")
|
||||
print(f"Время с последовательным выполнением: {sequential_time:.6f} секунд")
|
||||
print(f"Время с параллельной обработкой ({num_threads} потоков): {parallel_time:.6f} секунд")
|
||||
print("=" * 30)
|
Loading…
Reference in New Issue
Block a user