savenkov_alexander_lab_6_ready #142
3
savenkov_alexander_lab_6/.idea/.gitignore
vendored
Normal file
3
savenkov_alexander_lab_6/.idea/.gitignore
vendored
Normal file
@ -0,0 +1,3 @@
|
||||
# Default ignored files
|
||||
/shelf/
|
||||
/workspace.xml
|
7
savenkov_alexander_lab_6/.idea/discord.xml
Normal file
7
savenkov_alexander_lab_6/.idea/discord.xml
Normal 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>
|
@ -0,0 +1,6 @@
|
||||
<component name="InspectionProjectProfileManager">
|
||||
<settings>
|
||||
<option name="USE_PROJECT_PROFILE" value="false" />
|
||||
<version value="1.0" />
|
||||
</settings>
|
||||
</component>
|
4
savenkov_alexander_lab_6/.idea/misc.xml
Normal file
4
savenkov_alexander_lab_6/.idea/misc.xml
Normal 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>
|
8
savenkov_alexander_lab_6/.idea/modules.xml
Normal file
8
savenkov_alexander_lab_6/.idea/modules.xml
Normal 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>
|
10
savenkov_alexander_lab_6/.idea/savenkov_alexander_lab_6.iml
Normal file
10
savenkov_alexander_lab_6/.idea/savenkov_alexander_lab_6.iml
Normal 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>
|
33
savenkov_alexander_lab_6/README.md
Normal file
33
savenkov_alexander_lab_6/README.md
Normal 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
|
69
savenkov_alexander_lab_6/app.py
Normal file
69
savenkov_alexander_lab_6/app.py
Normal 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)
|
BIN
savenkov_alexander_lab_6/screens/img1.png
Normal file
BIN
savenkov_alexander_lab_6/screens/img1.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 118 KiB |
BIN
savenkov_alexander_lab_6/screens/img2.png
Normal file
BIN
savenkov_alexander_lab_6/screens/img2.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 108 KiB |
BIN
savenkov_alexander_lab_6/screens/img3.png
Normal file
BIN
savenkov_alexander_lab_6/screens/img3.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 54 KiB |
BIN
savenkov_alexander_lab_6/screens/img4.png
Normal file
BIN
savenkov_alexander_lab_6/screens/img4.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 74 KiB |
Loading…
Reference in New Issue
Block a user