Merge pull request 'morozov_vladimir_lab_5 is ready' (#184) from morozov_vladimir_lab_5 into main

Reviewed-on: #184
This commit is contained in:
Alexey 2024-12-03 22:18:46 +04:00
commit 46da8f27b8
5 changed files with 88 additions and 0 deletions

View File

@ -0,0 +1,60 @@
import math
from multiprocessing import Pool
import numpy as np
from datetime import datetime
# Метод по умножение определенных строк 1й матрицы на столбцы 2й матрицы
def work(start, end, fst, sec):
result = []
for i1 in range(start, end):
str = np.zeros(len(sec[0]))
for j2 in range(0, len(sec[0])):
mul = np.zeros(len(sec[0]))
for i2 in range(0, len(sec)):
mul[i2] = fst[i1][i2] * sec[i2][j2]
str[j2] = np.sum(mul)
result.append(str.tolist())
return result
if __name__ == '__main__':
sizes = [100, 300]
threads_counts = [1, 2, 4, 8]
for size_arrays in sizes:
fst = np.random.randint(1, 30, size=(size_arrays, size_arrays))
sec = np.random.randint(1, 30, size=(size_arrays, size_arrays))
result = np.ones((size_arrays, size_arrays,), dtype='int32')
for thread_count in threads_counts:
step = math.floor(size_arrays / thread_count)
remaining_lines = size_arrays % thread_count
steps = [step] * thread_count
for i in range(0, len(steps)):
steps[i] = steps[i] + math.ceil(remaining_lines / thread_count)
remaining_lines -= math.ceil(remaining_lines / thread_count)
if remaining_lines == 0:
break
# Создаем список кусочков массива
args = []
i = 0
for step in steps:
args.append([i, i + step, fst, sec])
i += step
pool = Pool(thread_count)
# начинаем умножение
startTime = datetime.now()
result = pool.starmap(work, args)
endTime = datetime.now()
print(f"Size of arrays: {size_arrays}")
print(f"Count of threads: {thread_count}")
print("Time work:", endTime - startTime)
print("--------------")
print("--------------------------------------------------------")

Binary file not shown.

After

Width:  |  Height:  |  Size: 45 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 40 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 40 KiB

View File

@ -0,0 +1,28 @@
# Лабораторная работа №5 - Вспоминаем математику или параллельное перемножение матриц
## Разработка приложения
Для разработки был выбран язык Python. Для разработки приложения были использованы библиотки:
- Numpy - библиотека для работы с массивами
- Multiprocessing - библиотека для запуска нескольких процеесов, что позволяет паралельно запускать функции
Суть алгоритма:
- Задаем размер матриц
- Задаем кол-во потоков, которые будут работать паралельно
- Разбиваем 1ю матрицу на матрицы поменьше, кол-во которых = кол-во потоков. Каждый поток будет обрабатывать свой кусок изначальной матрицы, умножая строки своего кусочка на столбцы 2й матрицы
- Объединяем результаты работы всех потоков
## Тестирование
#### Тестирование матриц 100х100
![image1.png](images%2Fimage1.png)
#### Тестирование матриц 300х300
![image2.png](images%2Fimage2.png)
#### Тестирование матриц 500х500
![image3.png](images%2Fimage3.png)
## Вывод
Паралельной алгоритм умножения матриц работает эффективнее, чем обычный.
## Запись тестирования
Работа приложения представлена в [видео](https://disk.yandex.ru/i/YpNEhFwbDh865A)