diff --git a/morozov_vladimir_lab_5/app.py b/morozov_vladimir_lab_5/app.py new file mode 100644 index 0000000..dc2a4f2 --- /dev/null +++ b/morozov_vladimir_lab_5/app.py @@ -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("--------------------------------------------------------") diff --git a/morozov_vladimir_lab_5/images/image1.png b/morozov_vladimir_lab_5/images/image1.png new file mode 100644 index 0000000..ed06d63 Binary files /dev/null and b/morozov_vladimir_lab_5/images/image1.png differ diff --git a/morozov_vladimir_lab_5/images/image2.png b/morozov_vladimir_lab_5/images/image2.png new file mode 100644 index 0000000..57f6257 Binary files /dev/null and b/morozov_vladimir_lab_5/images/image2.png differ diff --git a/morozov_vladimir_lab_5/images/image3.png b/morozov_vladimir_lab_5/images/image3.png new file mode 100644 index 0000000..3c86cc7 Binary files /dev/null and b/morozov_vladimir_lab_5/images/image3.png differ diff --git a/morozov_vladimir_lab_5/readme.md b/morozov_vladimir_lab_5/readme.md new file mode 100644 index 0000000..9e2a19b --- /dev/null +++ b/morozov_vladimir_lab_5/readme.md @@ -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) \ No newline at end of file