1 Commits

Author SHA1 Message Date
b269c252b6 lab8 2023-12-18 12:25:26 +03:00
7 changed files with 44 additions and 91 deletions

Binary file not shown.

Before

Width:  |  Height:  |  Size: 55 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 18 KiB

View File

@@ -1,30 +0,0 @@
# Отчет по лабораторной работе №6
Выполнил студент гр. ИСЭбд-41 Казаков Е.В.
## Создание приложения
Выбрал язык Pythone.
Приложение на вход получает кол-во поток, далее у нас происходит последовательный расчет детерминанта. После чего выводит всё в консоль
![](1.png)
## Бенчмарки
Протестируем обычный и параллельный алгоритм матрицах 100х100, 300х300 и 500х500.
Матрицы 100х100
![](2.png)
Матрицы 300х300
![](3.png)
Матрицы 500х500
![](4.png)
Вывод: Чем больше у нас кол-во данных, тем разница между параллельным и последовательных становится меньше Как видно из скриншотов для матрицы 500x500 параллельный алгоритм завершил быстрее чем, последовательный.

View File

@@ -1,61 +0,0 @@
import numpy as np
import time
from multiprocessing import Pool
def determinant(matrix):
return np.linalg.det(matrix)
def parallel_determinant(matrix, num_threads):
size = matrix.shape[0]
step = size // num_threads
pool = Pool(processes=num_threads)
blocks = []
for i in range(0, size, step):
blocks.append(matrix[i:i+step, i:i+step])
dets = pool.map(determinant, blocks)
return np.prod(dets)
def benchmark(num_threads):
matrix1 = np.random.rand(100, 100)
start_time = time.time()
det1 = determinant(matrix1)
end_time = time.time()
execution_time = end_time - start_time
print("Матрица 100x100:", matrix1)
print("Детерминант матрицы 100x100:", det1)
print("Последовательное время выполнения:", execution_time, "сек")
start_time = time.time()
detp1 = parallel_determinant(matrix1, num_threads)
end_time = time.time()
execution_time = end_time - start_time
print("Пареллельное время выполнения:", execution_time, "сек")
matrix2 = np.random.rand(300, 300)
start_time = time.time()
det2 = determinant(matrix2)
end_time = time.time()
execution_time = end_time - start_time
print("Матрица 300x300:", matrix2)
print("Детерминант матрицы 300x300:", det2)
print("Последовательное время выполнения:", execution_time, "сек")
start_time = time.time()
detp2 = parallel_determinant(matrix2, num_threads)
end_time = time.time()
execution_time = end_time - start_time
print("Пареллельное время выполнения:", execution_time, "сек")
matrix3 = np.random.rand(500, 500)
det3 = determinant(matrix3)
end_time = time.time()
execution_time = end_time - start_time
print("Матрица 500x500:", matrix3)
print("Детерминант матрицы 500x500:", det3)
print("Последовательное время выполнения:", execution_time, "сек")
start_time = time.time()
detp3 = parallel_determinant(matrix3, num_threads)
end_time = time.time()
execution_time = end_time - start_time
print("Пареллельное время выполнения:", execution_time, "сек")
if __name__ == "__main__":
print("Введите кол-во поток")
n = int(input())
benchmark(n)

View File

@@ -0,0 +1,44 @@
# Отчет по лабораторной работе №8
Выполнил студент гр. ИСЭбд-41 Миронов Е.О.
## Задачи
Написать небольшое эссе (буквально несколько абзацев) своими словами. А помогут Вам в этом вопросы из списка:
1. Зачем сложные системы (например, социальная сеть ВКонтакте) пишутся в "распределенном" стиле, где каждое отдельное приложение (или сервис) функционально выполняет только ограниченный спектр задач?
2. Для чего были созданы системы оркестрации приложений? Каким образом они упрощают / усложняют разработку и сопровождение распределенных систем?
3. Для чего нужны очереди обработки сообщений и что может подразумеваться под сообщениями?
4. Какие преимущества и недостатки распределенных приложений существуют на Ваш взгляд?
5. Целесообразно ли в сложную распределенную систему внедрять параллельные вычисления? Приведите примеры, когда это действительно нужно, а когда нет.
## Эссе
1. Зачем сложные системы (например, социальная сеть ВКонтакте) пишутся в "распределенном" стиле, где каждое отдельное приложение (или сервис) функционально выполняет только ограниченный спектр задач?
Во-первых, такие системы обрабатывают огромные объемы данных и высокие нагрузки, поэтому разделение функциональности между отдельными приложениями или сервисами позволяет более эффективно масштабировать и обрабатывать данные. Каждое приложение выполняет свою специфическую задачу, что позволяет легко масштабировать и модифицировать систему.
2. Для чего были созданы системы оркестрации приложений? Каким образом они упрощают / усложняют разработку и сопровождение распределенных систем?
Системы оркестрации приложений созданы для упрощения и управления разработкой и сопровождением распределенных систем. Они предоставляют средства для координации работы различных сервисов, обеспечивают управление состоянием, масштабирование и мониторинг системы. Это позволяет разработчикам концентрироваться на логике приложений, не беспокоясь о низкоуровневых деталях взаимодействия между сервисами. Однако, оркестрация приложений может усложнить разработку и требует дополнительных усилий по настройке и поддержке системы.
3. Для чего нужны очереди обработки сообщений и что может подразумеваться под сообщениями?
Очереди обработки сообщений играют важную роль в распределенных системах. Они служат для асинхронной коммуникации между компонентами системы и обеспечивают отказоустойчивость и гибкость в обработке данных. Сообщения могут представлять собой запросы на выполнение определенной задачи, информацию о событии или результаты выполнения действий. Очереди позволяют более гибко и эффективно управлять потоками данных и обеспечивать их последовательную обработку, даже при высоких нагрузках.
4. Какие преимущества и недостатки распределенных приложений существуют на Ваш взгляд?
Распределенные приложения имеют свои преимущества и недостатки. Они позволяют обрабатывать большие объемы данных, расширяться горизонтально и обеспечивать высокую отказоустойчивость. Однако, разработка и поддержка таких систем могут быть сложными и требовать специфических знаний. Также, распределенные системы могут страдать от проблем с консистентностью данных, синхронизацией и возникающими задержками в обработке.
5. Целесообразно ли в сложную распределенную систему внедрять параллельные вычисления? Приведите примеры, когда это действительно нужно, а когда нет.
Внедрение параллельных вычислений в сложную распределенную систему может быть целесообразным при определенных условиях. Рассмотрим несколько примеров, когда это может быть полезно и когда необходимость в этом отсутствует:
1. Обработка больших объемов данных: Если система работает с огромными объемами данных, параллельные вычисления могут значительно ускорить обработку. Например, в аналитической системе, которая агрегирует и анализирует большие объемы данных, параллельные вычисления помогут распределить нагрузку на несколько узлов и ускорить обработку данных.
2. Вычислительно интенсивные задачи: Если система выполняет вычислительно сложные операции или алгоритмы, параллельные вычисления могут значительно сократить время обработки. Например, в системе машинного обучения, где требуется обучение модели на большом объеме данных, параллельные вычисления позволят распределить вычислительную нагрузку между несколькими узлами и ускорить процесс обучения.
Однако, есть случаи, когда внедрение параллельных вычислений может быть излишним:
1. Простые операции: Если операции в системе относительно простые и не требуют значительных вычислительных ресурсов, то внедрение параллельных вычислений может быть излишним. Например, в системе управления пользователями, где требуется простая обработка запросов на создание, обновление или удаление пользователей, параллельные вычисления не приведут к значительному ускорению.
2. Необходимость в строгой последовательности: В некоторых случаях, система может требовать строгой последовательности выполнения операций. В таких случаях, параллельные вычисления могут нарушить эту последовательность и привести к нежелательным результатам. Например, в базе данных, где нужно манипулировать данными с использованием транзакций, параллельне вычисления могут нарушить целостность данных.