# Распределенные вычисления и приложения Л5 ## _Автор Базунов Андрей Игревич ПИбд-42_ --- > ### Задание > - Кратко: реализовать умножение двух больших квадратных матриц. > - Подробно: в лабораторной работе требуется сделать два алгоритма: обычный и параллельный (задание со * - реализовать это в рамках одного алгоритма). В параллельном алгоритме предусмотреть ручное задание количества потоков (число потоков = 1 как раз и реализует задание со *), каждый из которых будет выполнять умножение элементов матрицы в рамках своей зоны ответственности. --- ## Алгоритм умножения: ### Функция умножения строки на столбец
Код ```python def mul_row_and_column_in_thread(queue: _QUEUE_TYPE) -> list[tuple[int | float, int]]: result = [] while queue.qsize(): local_result = 0 row, column, place = queue.get() for k in range(len(row)): local_result += row[k] * column[k] result.append((local_result, place)) return result ```
### Функция распределения вычислений между процессами и сборки результатов в матрицу
Код ```python def mul_matrixs(m1: Matrix, m2: Matrix, threads: int = 0): if m1.size != m2.size: return None if threads == 0: threads = 1 result = Matrix(size=m1.size, suplyer=0) thread_queues = [Queue() for _ in range(threads)] thread_iterator = 0 for row_m1, column_m2 in itertools.product(m1.rows, m2.columns): thread_queues[thread_iterator].put((row_m1, column_m2, thread_iterator)) thread_iterator += 1 if thread_iterator >= threads: thread_iterator = 0 with ThreadPoolExecutor(max_workers=threads) as executor: flat = [] for item in executor.map(mul_row_and_column_in_thread, thread_queues): flat += item flat.sort(key=lambda x: x[1]) result.from_flat([*map(lambda x: x[0], flat)]) return result ```
| Размер матрицы | 1 Поток (сек) | 5 Потоков (сек) | 20 Потоков (сек) | |----------------|---------------|-----------------|------------------| | 50x50 | 0.00654 | 0.00666 | 0.00685 | | 100x100 | 0.03809 | 0.03753 | 0.03796 | | 150x150 | 0.11277 | 0.11239 | 0.11342 | | 200x200 | 0.24218 | 0.2474 | 0.25167 | | 250x250 | 0.45891 | 0.46111 | 0.46475 | | 300x300 | 0.80544 | 0.81466 | 0.8198 | | 350x350 | 1.28701 | 1.30309 | 1.32854 | | 400x400 | 1.93252 | 1.97905 | 2.00756 | | 450x450 | 2.81152 | 2.88893 | 2.94218 | | 500x500 | 3.87053 | 4.02238 | 4.03649 | | 550x550 | 5.26902 | 5.43371 | 6.10302 | | 600x600 | 6.82189 | 7.09791 | 7.17916 | | 650x650 | 8.80005 | 9.15325 | 11.26757 | | 700x700 | 11.04467 | 11.50241 | 12.2389 | | 750x750 | 13.50451 | 14.23333 | 18.4895 | | 800x800 | 16.5745 | 17.30878 | 20.61224 | | 850x850 | 19.99281 | 23.19894 | 30.13554 | | 900x900 | 23.48408 | 24.84928 | 31.74338 | | 950x950 | 27.84541 | 29.19429 | 41.40166 | | 1000x1000 | 32.5547 | 34.0334 | 44.55267 |