chernyshov_nikita_lab_6 is ready
This commit is contained in:
parent
5dd9e26f07
commit
7f775233bf
36
chernyshov_nikita_lab_6/README.md
Normal file
36
chernyshov_nikita_lab_6/README.md
Normal file
@ -0,0 +1,36 @@
|
||||
# Лабораторная работа 6: Определение детерминанта матрицы с помощью параллельных вычислений
|
||||
|
||||
## Описание
|
||||
|
||||
В лабраторной работе программа вычисляет определитель матрицы двумя способами: параллельным методом с использованием нескольких процессов и последовательным методом, а также сравнивает их производительность. Функция determinant_block вычисляет детерминант переданного блока матрицы с помощью функции np.linalg.det из библиотеки NumPy. Функция determinant_parallel разделяет исходную матрицу на блоки (строго по строкам и столбцам) в зависимости от количества процессов, заданного аргументом num_processes. После этого каждый блок обрабатывается отдельным процессом в пуле процессов (Pool), и вычисленные детерминанты блоков перемножаются, чтобы получить общий детерминант матрицы. Функция benchmark генерирует случайную квадратную матрицу заданного размера, измеряет время выполнения параллельного и последовательного вычисления детерминанта, а затем выводит результаты. Основная часть программы запускается, если файл выполняется напрямую. Используется модуль argparse для получения аргумента командной строки --processes, который задает количество процессов для параллельного вычисления (по умолчанию 4). В цикле for функция benchmark выполняется для матриц размеров 100x100, 300x300 и 500x500, сравнивая производительность последовательного и параллельного подходов.
|
||||
|
||||
## Результаты
|
||||
|
||||
В процессе тестирования были получены следующие результаты:
|
||||
|
||||
### Скриншоты результатов
|
||||
|
||||
#### Результат бенчамарка при 1 процессе:
|
||||
![img1.png](img1.png)
|
||||
|
||||
#### Результат бенчамарка при 2 процессах:
|
||||
![img2.png](img2.png)
|
||||
|
||||
#### Результат бенчамарка при 3 процессах:
|
||||
![img3.png](img3.png)
|
||||
|
||||
#### Результат бенчамарка при 4 процессах:
|
||||
![img4.png](img4.png)
|
||||
|
||||
|
||||
|
||||
## Выводы
|
||||
|
||||
1. **Производительность**: Для небольших матриц (например, 100x100) параллельное вычисление демонстрирует замедление по сравнению с последовательным методом из-за накладных расходов на создание и управление процессами.
|
||||
|
||||
2. **Эффективность**: С увеличением размера матриц (300x300 и 500x500) время выполнения параллельного алгоритма также растёт, что свидетельствует о снижении его эффективности при использовании большего числа процессов. В некоторых тестах, например, для матрицы 500x500 при использовании 3 и 4 процессов, параллельный алгоритм оказался медленнее последовательного.
|
||||
|
||||
|
||||
|
||||
## Ссылка на видео
|
||||
https://vkvideo.ru/video286865610_456239229?list=ln-59QwPscwM3KZRLxg1E
|
50
chernyshov_nikita_lab_6/application.py
Normal file
50
chernyshov_nikita_lab_6/application.py
Normal file
@ -0,0 +1,50 @@
|
||||
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)
|
BIN
chernyshov_nikita_lab_6/img1.png
Normal file
BIN
chernyshov_nikita_lab_6/img1.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 38 KiB |
BIN
chernyshov_nikita_lab_6/img2.png
Normal file
BIN
chernyshov_nikita_lab_6/img2.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 38 KiB |
BIN
chernyshov_nikita_lab_6/img3.png
Normal file
BIN
chernyshov_nikita_lab_6/img3.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 39 KiB |
BIN
chernyshov_nikita_lab_6/img4.png
Normal file
BIN
chernyshov_nikita_lab_6/img4.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 39 KiB |
Loading…
Reference in New Issue
Block a user