Merge pull request 'savenkov_alexander_lab_6_ready' (#142) from savenkov_alexander_lab_6 into main

Reviewed-on: #142
This commit is contained in:
Alexey 2024-12-10 22:15:04 +04:00
commit 6ae29eb79e
12 changed files with 140 additions and 0 deletions

View File

@ -0,0 +1,3 @@
# Default ignored files
/shelf/
/workspace.xml

View File

@ -0,0 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="DiscordProjectSettings">
<option name="show" value="ASK" />
<option name="description" value="" />
</component>
</project>

View File

@ -0,0 +1,6 @@
<component name="InspectionProjectProfileManager">
<settings>
<option name="USE_PROJECT_PROFILE" value="false" />
<version value="1.0" />
</settings>
</component>

View File

@ -0,0 +1,4 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ProjectRootManager" version="2" project-jdk-name="Python 3.11 (savenkov_alexander_lab_6) (2)" project-jdk-type="Python SDK" />
</project>

View File

@ -0,0 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ProjectModuleManager">
<modules>
<module fileurl="file://$PROJECT_DIR$/.idea/savenkov_alexander_lab_6.iml" filepath="$PROJECT_DIR$/.idea/savenkov_alexander_lab_6.iml" />
</modules>
</component>
</project>

View File

@ -0,0 +1,10 @@
<?xml version="1.0" encoding="UTF-8"?>
<module type="PYTHON_MODULE" version="4">
<component name="NewModuleRootManager">
<content url="file://$MODULE_DIR$">
<excludeFolder url="file://$MODULE_DIR$/venv" />
</content>
<orderEntry type="inheritedJdk" />
<orderEntry type="sourceFolder" forTests="false" />
</component>
</module>

View File

@ -0,0 +1,33 @@
# Лабораторная работа №6 - Определение детерминанта матрицы с помощью параллельных вычислений
Задание:
Кратко: реализовать нахождение детерминанта квадратной матрицы. Что такое детерминант матрицы (или определитель) можно посмотреть по ссылке.
Подробно: в лабораторной работе требуется сделать два алгоритма: обычный и параллельный (задание со * - реализовать это в рамках одного алгоритма). В параллельном алгоритме предусмотреть ручное задание количества потоков (число потоков = 1 как раз и реализует задание со *), каждый из которых будет выполнять нахождение отдельной группы множителей.
Сделать несколько бенчмарков последовательного и параллельного алгоритма поиска детерминанта матрицы размером 100x100, 300x300, 500x500 элементов. Отразить свои наблюдения в readme-отчете.
<p>
<div>Код</div>
<img src="screens/img1.png" width="650" title="Код">
</p>
<p>
<div>Код</div>
<img src="screens/img2.png" width="650" title="Код">
</p>
<p>
<div>Код</div>
<img src="screens/img3.png" width="650" title="Код">
</p>
<p>
<div>Работа программы</div>
<img src="screens/img4.png" width="650" title="Работа программы">
</p>
Вывод: Параллельный алгоритм намного бысрее и имеет место быть если либо в матрице используются огромные числа или сама матрица намного большей размерностью
# Видео
Видео с разбором лабораторной https://youtu.be/--PnevLHZ9k

View File

@ -0,0 +1,69 @@
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)

Binary file not shown.

After

Width:  |  Height:  |  Size: 118 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 108 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 54 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 74 KiB