Compare commits
4 Commits
main
...
putilin_pa
Author | SHA1 | Date | |
---|---|---|---|
0ec65711b4 | |||
|
9fc4526d6f | ||
|
c1e6b1abc5 | ||
|
f10d4d5c3a |
31
putilin_pavel_lab_6/README.md
Normal file
31
putilin_pavel_lab_6/README.md
Normal file
@ -0,0 +1,31 @@
|
|||||||
|
# Лабораторная работа №6: Нахождение детерминанта квадратной матрицы
|
||||||
|
|
||||||
|
## Задание
|
||||||
|
|
||||||
|
Необходимо реализовать два алгоритма нахождения детерминанта квадратной матрицы:
|
||||||
|
1. Обычное вычисление.
|
||||||
|
2. Параллельное вычисление с использованием многозадачности, где каждый поток будет вычислять часть матрицы.
|
||||||
|
|
||||||
|
### Требования:
|
||||||
|
1. Обычный алгоритм нахождения детерминанта (например, через рекурсию или разложение по строкам/столбцам).
|
||||||
|
2. Параллельный алгоритм с возможностью задания количества потоков.
|
||||||
|
3. Бенчмаркинг для матриц размером 100x100, 300x300 и 500x500.
|
||||||
|
|
||||||
|
## Структура проекта
|
||||||
|
|
||||||
|
Проект реализован в одном файле `main.py`, который включает в себя:
|
||||||
|
- Обычное вычисление детерминанта.
|
||||||
|
- Параллельное вычисление с использованием многозадачности.
|
||||||
|
- Генерацию случайных матриц для тестирования.
|
||||||
|
- Бенчмаркинг для измерения времени выполнения обоих алгоритмов.
|
||||||
|
- Тесты для проверки корректности вычисления детерминанта.
|
||||||
|
|
||||||
|
## Видео
|
||||||
|
|
||||||
|
https://cloud.mail.ru/public/31aJ/RrdgK3Rik
|
||||||
|
|
||||||
|
## Заключение
|
||||||
|
|
||||||
|
В ходе лабораторной работы были реализованы два алгоритма вычисления детерминанта матрицы: обычный и параллельный.
|
||||||
|
Параллельное вычисление показало значительное ускорение на больших матрицах,
|
||||||
|
что подчеркивает эффективность многозадачности в вычислительных задачах.
|
75
putilin_pavel_lab_6/main.py
Normal file
75
putilin_pavel_lab_6/main.py
Normal file
@ -0,0 +1,75 @@
|
|||||||
|
import numpy as np
|
||||||
|
import threading
|
||||||
|
import time
|
||||||
|
|
||||||
|
|
||||||
|
def determinant_gauss(matrix):
|
||||||
|
"""Вычисление детерминанта методом Гаусса"""
|
||||||
|
matrix_copy = matrix.astype(np.float64)
|
||||||
|
n = matrix_copy.shape[0]
|
||||||
|
det = 1.0
|
||||||
|
|
||||||
|
for i in range(n):
|
||||||
|
if matrix_copy[i, i] == 0:
|
||||||
|
for j in range(i + 1, n):
|
||||||
|
if matrix_copy[j, i] != 0:
|
||||||
|
matrix_copy[[i, j]] = matrix_copy[[j, i]]
|
||||||
|
det *= -1
|
||||||
|
break
|
||||||
|
det *= matrix_copy[i, i]
|
||||||
|
matrix_copy[i, i:] /= matrix_copy[i, i]
|
||||||
|
|
||||||
|
for j in range(i + 1, n):
|
||||||
|
factor = matrix_copy[j, i]
|
||||||
|
matrix_copy[j, i:] -= factor * matrix_copy[i, i:]
|
||||||
|
|
||||||
|
return det
|
||||||
|
|
||||||
|
|
||||||
|
def determinant_parallel(matrix, num_threads=2):
|
||||||
|
"""Параллельное вычисление детерминанта с использованием потоков"""
|
||||||
|
|
||||||
|
def compute_row(row, matrix_copy):
|
||||||
|
n = matrix_copy.shape[0]
|
||||||
|
for i in range(row, n, num_threads):
|
||||||
|
for j in range(i + 1, n):
|
||||||
|
if matrix_copy[i, i] == 0:
|
||||||
|
continue
|
||||||
|
factor = matrix_copy[j, i] / matrix_copy[i, i]
|
||||||
|
matrix_copy[j, i:] -= factor * matrix_copy[i, i:]
|
||||||
|
|
||||||
|
matrix_copy = matrix.astype(np.float64)
|
||||||
|
|
||||||
|
threads = []
|
||||||
|
for i in range(num_threads):
|
||||||
|
t = threading.Thread(target=compute_row, args=(i, matrix_copy))
|
||||||
|
threads.append(t)
|
||||||
|
t.start()
|
||||||
|
|
||||||
|
for t in threads:
|
||||||
|
t.join()
|
||||||
|
|
||||||
|
return matrix_copy[-1, -1]
|
||||||
|
|
||||||
|
|
||||||
|
def benchmark(sizes):
|
||||||
|
for size in sizes:
|
||||||
|
matrix = np.random.randint(1, 11, (size, size))
|
||||||
|
|
||||||
|
start_time = time.time()
|
||||||
|
det_regular = determinant_gauss(matrix)
|
||||||
|
end_time = time.time()
|
||||||
|
regular_time = end_time - start_time
|
||||||
|
|
||||||
|
start_time = time.time()
|
||||||
|
det_parallel = determinant_parallel(matrix, num_threads=4)
|
||||||
|
end_time = time.time()
|
||||||
|
parallel_time = end_time - start_time
|
||||||
|
|
||||||
|
print(f"Размер матрицы: {size}x{size}")
|
||||||
|
print(f"Детерминант (последовательно): {det_regular} | Время: {regular_time} секунд")
|
||||||
|
print(f"Детерминант (параллельно): {det_parallel} | Время: {parallel_time} секунд")
|
||||||
|
print("-" * 50)
|
||||||
|
|
||||||
|
|
||||||
|
benchmark([100, 300, 500])
|
22
putilin_pavel_lab_7/README.md
Normal file
22
putilin_pavel_lab_7/README.md
Normal file
@ -0,0 +1,22 @@
|
|||||||
|
## Эссе
|
||||||
|
|
||||||
|
Для балансировки нагрузки в распределённых системах используются различные алгоритмы и методы,
|
||||||
|
включая "круговую" (round-robin) и на основе минимальной нагрузки.
|
||||||
|
Первый метод направляет запросы по очереди на все серверы, второй —
|
||||||
|
направляет запросы на сервер с наименьшей текущей нагрузкой. Т акже используется алгоритм на основе хеширования,
|
||||||
|
при котором запросы направляются на сервер в зависимости от хеша параметров запроса,
|
||||||
|
что позволяет обеспечить распределение нагрузки более предсказуемо.
|
||||||
|
|
||||||
|
Открытые технологии для балансировки нагрузки включают Nginx, HAProxy и Apache HTTP Server.
|
||||||
|
Эти решения позволяют распределять нагрузку на несколько серверов, обеспечивая отказоустойчивость и масштабируемость приложений.
|
||||||
|
Эти технологии поддерживают различные методы балансировки, такие как круговая и на основе сессий.
|
||||||
|
|
||||||
|
Балансировка нагрузки на базах данных часто осуществляется с использованием репликации и шардирования.
|
||||||
|
Репликация позволяет распределить запросы на чтение между несколькими репликами базы данных, а шардирование делит базу данных на части (шарды),
|
||||||
|
каждая из которых обрабатывает часть запросов. Важно обеспечить консистентность данных при такой балансировке,
|
||||||
|
что достигается с помощью различных механизмов синхронизации и транзакций.
|
||||||
|
|
||||||
|
Реверс-прокси является важным элементом балансировки нагрузки.
|
||||||
|
Он принимает входящие запросы и перенаправляет их на соответствующие серверы.
|
||||||
|
Такой подход позволяет скрыть реальную инфраструктуру от пользователей, улучшить безопасность,
|
||||||
|
а также обеспечить централизованный контроль над нагрузкой, кэшированием и аутентификацией
|
Loading…
Reference in New Issue
Block a user