Merge pull request '[Л/Р 6] Казаков Евгений' (#122) from EugeneKazakov/distributed-computing:kazakov-ev-lab6 into main
Reviewed-on: http://student.git.athene.tech/v.moiseev/distributed-computing/pulls/122
This commit is contained in:
commit
a2abab3fc2
BIN
tasks/kazakov-ev/lab_6/1.png
Normal file
BIN
tasks/kazakov-ev/lab_6/1.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 55 KiB |
BIN
tasks/kazakov-ev/lab_6/2.png
Normal file
BIN
tasks/kazakov-ev/lab_6/2.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 18 KiB |
BIN
tasks/kazakov-ev/lab_6/3.png
Normal file
BIN
tasks/kazakov-ev/lab_6/3.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 18 KiB |
BIN
tasks/kazakov-ev/lab_6/4.png
Normal file
BIN
tasks/kazakov-ev/lab_6/4.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 18 KiB |
30
tasks/kazakov-ev/lab_6/README.md
Normal file
30
tasks/kazakov-ev/lab_6/README.md
Normal file
@ -0,0 +1,30 @@
|
||||
# Отчет по лабораторной работе №6
|
||||
|
||||
Выполнил студент гр. ИСЭбд-41 Казаков Е.В.
|
||||
|
||||
## Создание приложения
|
||||
|
||||
Выбрал язык Pythone.
|
||||
|
||||
Приложение на вход получает кол-во поток, далее у нас происходит последовательный расчет детерминанта. После чего выводит всё в консоль
|
||||
|
||||
![](1.png)
|
||||
|
||||
|
||||
## Бенчмарки
|
||||
|
||||
Протестируем обычный и параллельный алгоритм матрицах 100х100, 300х300 и 500х500.
|
||||
|
||||
Матрицы 100х100
|
||||
|
||||
![](2.png)
|
||||
|
||||
Матрицы 300х300
|
||||
|
||||
![](3.png)
|
||||
|
||||
Матрицы 500х500
|
||||
|
||||
![](4.png)
|
||||
|
||||
Вывод: Чем больше у нас кол-во данных, тем разница между параллельным и последовательных становится меньше Как видно из скриншотов для матрицы 500x500 параллельный алгоритм завершил быстрее чем, последовательный.
|
61
tasks/kazakov-ev/lab_6/algo.py
Normal file
61
tasks/kazakov-ev/lab_6/algo.py
Normal file
@ -0,0 +1,61 @@
|
||||
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)
|
Loading…
Reference in New Issue
Block a user