DAS_2024_1/bazunov_andrew_lab_5
Bazunov Andrew Igorevich 4b86dfd750 complete lab
2024-10-28 22:27:53 +04:00
..
main.py complete lab 2024-10-28 22:27:53 +04:00
matrix.py complete lab 2024-10-28 22:27:53 +04:00
README.md complete lab 2024-10-28 22:27:53 +04:00

Распределенные вычисления и приложения Л5

Автор Базунов Андрей Игревич ПИбд-42


Задание

  • Кратко: реализовать умножение двух больших квадратных матриц.
  • Подробно: в лабораторной работе требуется сделать два алгоритма: обычный и параллельный (задание со * - реализовать это в рамках одного алгоритма). В параллельном алгоритме предусмотреть ручное задание количества потоков (число потоков = 1 как раз и реализует задание со *), каждый из которых будет выполнять умножение элементов матрицы в рамках своей зоны ответственности.

Алгоритм умножения:

Функция умножения строки на столбец

Код
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

Функция распределения вычислений между процессами и сборки результатов в матрицу

Код
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