Merge pull request 'balakhonov_danila_lab_5' (#375) from balakhonov_danila_lab_5 into main
Reviewed-on: #375
This commit is contained in:
commit
12d9b33cb4
37
balakhonov_danila_lab_5/README.md
Normal file
37
balakhonov_danila_lab_5/README.md
Normal file
@ -0,0 +1,37 @@
|
||||
# Лабораторная работа номер 5
|
||||
|
||||
> Здравствуйте меня зовут Балахонов Данила группа ПИбд-42
|
||||
>
|
||||
> *— Балахонов Данила ПИбд-42*
|
||||
|
||||
Видео лабораторной работы номер 5 доступно по этой [ссылке](https://drive.google.com/file/d/1gs_6PZ8SYj_p3IMrXD9AfiAWmiLt9T-g/view?usp=sharing).
|
||||
|
||||
## Как запустить лабораторную работу номер 5?
|
||||
### Необходимые компоненты для запуска лабораторной работы номер 5
|
||||
> Здесь рассказана установка необходимых компонентов для запуска лабораторной работы номер 5 под дистрибутив GNU/Linux **Ubuntu**.
|
||||
|
||||
Для запуска лабораторной работы номер 5 необходимы такие компоненты:
|
||||
- Python 3
|
||||
|
||||
Чтобы установить Python 3, введите такую команду:
|
||||
``` bash
|
||||
sudo apt update
|
||||
sudo apt install python3
|
||||
```
|
||||
После этого будет установлена последняя версия Python.
|
||||
### Запуск лабораторной работы номер 5
|
||||
Для запуска лабораторной работы номер 5 необходимо **склонировать** репозиторий в любую папку и **перейти на ветку** balakhonov_danila_lab_5.
|
||||
Далее в папке с `program.py` нужно вызвать такую команду:
|
||||
``` bash
|
||||
python3 program.py
|
||||
```
|
||||
Таким образом будет запущена программа по перемножению матриц.
|
||||
## Какие технологии были использованы?
|
||||
Для выполнения лабораторной работы номер 5 были использованы такие технологии, как:
|
||||
- Python
|
||||
## Что делает лабораторная работа номер 5?
|
||||
Суть лабораторной работы номер 5 заключается в разработке приложения по параллельному перемножению двух квадратных матриц большого размера.
|
||||
## Выводы лабораторной работы номер 5
|
||||
Пример выполнения программы на матрицах 100x100, 300x300, 500x500 можно увидеть на рисунке ниже.
|
||||
![Результат выполнения программы](result.png)
|
||||
Здесь прослеживается обратная зависимость между количеством потоков и временем выполнения. Чем больше потоков используется, тем меньше будет время подсчета результата.
|
86
balakhonov_danila_lab_5/program.py
Normal file
86
balakhonov_danila_lab_5/program.py
Normal file
@ -0,0 +1,86 @@
|
||||
import random as rnd
|
||||
import threading
|
||||
import time
|
||||
from multiprocessing import Pool
|
||||
|
||||
MAX_SIZE = 500
|
||||
|
||||
|
||||
def generateSquareMatrix(size):
|
||||
return [[rnd.randint(0, 100) for _ in range(size)] for _ in range(size)]
|
||||
|
||||
# Функция для перемножения матриц
|
||||
def matrixMultiply(matrix1, matrix2, start_i=0, end_i=None):
|
||||
l1 = len(matrix1)
|
||||
l2 = len(matrix2)
|
||||
global result_matrix
|
||||
result = result_matrix
|
||||
end_i = end_i if end_i is not None else l1
|
||||
|
||||
for i in range(start_i, end_i):
|
||||
for j in range(len(matrix2[0])):
|
||||
for k in range(l2):
|
||||
result[i][j] += matrix1[i - start_i][k] * matrix2[k][j]
|
||||
|
||||
return result
|
||||
|
||||
# Перемножение без использования потоков
|
||||
def matrixMultiplyStandard(matrix1, matrix2):
|
||||
return matrixMultiply(matrix1, matrix2)
|
||||
|
||||
# Перемножение в отдельном потоке
|
||||
def matrixMultiplySingleThread(args):
|
||||
matrix1, matrix2, start_i, end_i = args
|
||||
matrixMultiply(matrix1, matrix2, start_i, end_i)
|
||||
# Параллельное перемножение
|
||||
def matrixMultiplyWithThreads(matrix1, matrix2, thread_count):
|
||||
l1 = len(matrix1)
|
||||
l2 = len(matrix2)
|
||||
|
||||
# Кол-во строк на последний поток, если деление по потокам будет неточным
|
||||
last_rows_count = 0
|
||||
|
||||
if l1 % thread_count == 0:
|
||||
rows_per_thread = l1 // thread_count
|
||||
else:
|
||||
rows_per_thread = l1 // thread_count
|
||||
last_rows_count = l1 % thread_count
|
||||
|
||||
for i in range(thread_count):
|
||||
start_i = i * rows_per_thread
|
||||
|
||||
if (i - 1) == thread_count and last_rows_count > 0:
|
||||
end_i = start_i + last_rows_count
|
||||
else:
|
||||
end_i = start_i + rows_per_thread
|
||||
|
||||
args = []
|
||||
args.append((matrix1[start_i:end_i], matrix2, start_i, end_i))
|
||||
with Pool(processes = thread_count) as pool:
|
||||
pool.map(matrixMultiplySingleThread, args)
|
||||
|
||||
result_matrix = [[0 for _ in range(MAX_SIZE)] for _ in range(MAX_SIZE)]
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
|
||||
sizes = [100, 300, 500]
|
||||
num_threads = [1, 5, 8]
|
||||
|
||||
for size in sizes:
|
||||
matrix1 = generateSquareMatrix(size)
|
||||
matrix2 = generateSquareMatrix(size)
|
||||
|
||||
# Обычное перемножение
|
||||
start_time = time.time()
|
||||
matrixMultiplyStandard(matrix1, matrix2)
|
||||
end_time = time.time()
|
||||
print(f"Обычное перемножение.\t\tРазмер: {size}\t\t|\t {end_time - start_time}")
|
||||
|
||||
# Перемножение в потоках
|
||||
for threads in num_threads:
|
||||
start_time = time.time()
|
||||
matrixMultiplyWithThreads(matrix1, matrix2, threads)
|
||||
end_time = time.time()
|
||||
print(f"Параллельное перемножение.\tРазмер: {size}, {threads} потоков\t|\t {end_time - start_time}")
|
||||
print("=" * 100)
|
BIN
balakhonov_danila_lab_5/result.png
Normal file
BIN
balakhonov_danila_lab_5/result.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 52 KiB |
Loading…
Reference in New Issue
Block a user