Merge pull request '[Л/Р 6] Плаксина Александра' (#94) from Sanechka_Plaksina/distributed-computing:plaksina-av-lab-6 into main

Reviewed-on: http://student.git.athene.tech/v.moiseev/distributed-computing/pulls/94
This commit is contained in:
Vladislav Moiseev 2023-12-17 23:42:26 +04:00
commit eff4d671f3
4 changed files with 150 additions and 0 deletions

View File

@ -0,0 +1,79 @@
# Отчет по лабораторной работе №6
Выполнила студентка гр. ИСЭбд-41 Плаксина А.В.
# Описание работы приложения
Приложение реализовнао на языке питон, использована среда PyCharm для разработки.
Это консольное приложение, которое вычисляет детерминант матриц. Задается размерность матрицы, элементы генерируются рандомно (указываетя только диапазон их значений), количество
Код реализующий заполнение данных:
```cs
if __name__ == "__main__":
matrix_size = 10 # размер матрицы
lower_limit = 5 # числа в матрице от
upper_limit = 15 # и до
processes = [2, 4, 8, 16, 32]
#
# последовательное вычисление
sequential_determinant_calculation(matrix_size, lower_limit, upper_limit)
# параллельное вычисление
for i in processes:
print("Потоков " + str(i))
parallel_determinant_calculation(matrix_size, lower_limit, upper_limit, i)
```
Код реализующий последовательное вычисление детерминанта матриц:
```cs
def sequential_determinant_calculation(matrix_size, lower_limit, upper_limit):
random_matrix = generate_random_matrix(matrix_size, lower_limit, upper_limit)
start_time = time.time()
result = determinant(random_matrix)
end_time = time.time()
print(f"Последовательный детерминант: {result}")
print(f"Последовательное время: {end_time - start_time} секунд")
```
Код реализующий параллельное вычисление детерминанта матриц:
```cs
def parallel_determinant_calculation(matrix_size, lower_limit, upper_limit, num_processes):
random_matrix = generate_random_matrix(matrix_size, lower_limit, upper_limit)
matrices_to_process = [submatrix(random_matrix, 0, col) for col in range(matrix_size)]
start_time = time.time()
with Pool(processes=num_processes) as pool:
determinants = pool.map(determinant, matrices_to_process)
result = sum(((-1) ** col) * random_matrix[0][col] * det for col, det in enumerate(determinants))
end_time = time.time()
print(f"Параллельный детерминант: {result}")
print(f"Параллельное время: {end_time - start_time} секунд")
```
# Бенчмаркинг
Для матриц болших размеров детерминант вычисляется очень долгое время, поэтому для примера я взяла размерность матрица 10х10
Результаты бенчмаркинга для последовательного способа вычисления детерминанта матриц:
![](photo/ph32.jpg)
Результаты бенчмаркинга для параллельного способа вычисления детерминанта матриц с различным количеством потока:
![](photo/ph31.jpg)
# Вывод
Скорость обработки у параллельного способа значительно выше, чем у последовательного
При увеличении количества потоков время обработки сначала снижается, затем, по примеру, начиная с 16 потока, время опять увеличивается, так как потоков становится слишком много.

View File

@ -0,0 +1,71 @@
import random
from multiprocessing import Pool
import time
def submatrix(matrix, row, col):
return [[matrix[i][j] for j in range(len(matrix[i])) if j != col] for i in range(len(matrix)) if i != row]
def determinant(matrix):
size = len(matrix)
# Простой случай: детерминант матрицы 1x1
if size == 1:
return matrix[0][0]
# Простой случай: детерминант матрицы 2x2
if size == 2:
return matrix[0][0] * matrix[1][1] - matrix[0][1] * matrix[1][0]
det = 0
for col in range(size):
det += ((-1) ** col) * matrix[0][col] * determinant(submatrix(matrix, 0, col))
return det
def generate_random_matrix(size, lower_limit, upper_limit):
return [[random.uniform(lower_limit, upper_limit) for _ in range(size)] for _ in range(size)]
def sequential_determinant_calculation(matrix_size, lower_limit, upper_limit):
random_matrix = generate_random_matrix(matrix_size, lower_limit, upper_limit)
start_time = time.time()
result = determinant(random_matrix)
end_time = time.time()
print(f"Последовательный детерминант: {result}")
print(f"Последовательное время: {end_time - start_time} секунд")
def parallel_determinant_calculation(matrix_size, lower_limit, upper_limit, num_processes):
random_matrix = generate_random_matrix(matrix_size, lower_limit, upper_limit)
matrices_to_process = [submatrix(random_matrix, 0, col) for col in range(matrix_size)]
start_time = time.time()
with Pool(processes=num_processes) as pool:
determinants = pool.map(determinant, matrices_to_process)
result = sum(((-1) ** col) * random_matrix[0][col] * det for col, det in enumerate(determinants))
end_time = time.time()
print(f"Параллельный детерминант: {result}")
print(f"Параллельное время: {end_time - start_time} секунд")
if __name__ == "__main__":
matrix_size = 10 # размер матрицы
lower_limit = 5 # числа в матрице от
upper_limit = 15 # и до
processes = [2, 4, 8, 16, 32]
#
# последовательное вычисление
#sequential_determinant_calculation(matrix_size, lower_limit, upper_limit)
# параллельное вычисление
for i in processes:
print("Потоков " + str(i))
parallel_determinant_calculation(matrix_size, lower_limit, upper_limit, i)

Binary file not shown.

After

Width:  |  Height:  |  Size: 129 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 51 KiB