diff --git a/tsukanova_irina_lab_5/README.md b/tsukanova_irina_lab_5/README.md new file mode 100644 index 0000000..a15ed43 --- /dev/null +++ b/tsukanova_irina_lab_5/README.md @@ -0,0 +1,16 @@ +# Цуканова Ирина ПИбд-42 +# Лабораторная работа №5 - Параллельное перемножение матриц + + +## Результат: +![results](./img.png) + +## Выводы: + +1. Для маленьких матриц выгоднее использовать последовательное умножение (1 поток) +2. Для больших матриц лучше использовать параллельное умножение, так как временные затраты +последовательного умножения в этом случае существенно выше, чем затраты на управление потоками. +3. Увеличение количества потоков для осуществления умножения больших матриц в определенный момент не дает +прироста в скорости выполнения. Это значит, что достигнуто оптимальное количество потоков. + +## [Видео](https://drive.google.com/file/d/1pMMKllM24xwXZlQkY9VIuKSeKr5vpUHI/view?usp=sharing) \ No newline at end of file diff --git a/tsukanova_irina_lab_5/img.png b/tsukanova_irina_lab_5/img.png new file mode 100644 index 0000000..52dd803 Binary files /dev/null and b/tsukanova_irina_lab_5/img.png differ diff --git a/tsukanova_irina_lab_5/main.py b/tsukanova_irina_lab_5/main.py new file mode 100644 index 0000000..eb9627a --- /dev/null +++ b/tsukanova_irina_lab_5/main.py @@ -0,0 +1,55 @@ +import multiprocessing +import time +from time import time + +import numpy as np + + +def matrix_multi(first, second, res, start_i, stop_i, size): + for i in range(start_i, stop_i): + for j in range(size): + res[i][j] = 0 + for k in range(size): + res[i][j] += first[i][k] * second[k][j] + + +def do(first, second, size, threads): + offset = int(size / threads) + offset_last = size % threads + offset + + processes = [] + res = np.zeros((size, size)) + start_test = time() + for i in range(threads): + start_ = i * offset + stop_ = start_ + offset_last if i == threads - 1 else start_ + offset + + process = multiprocessing.Process(target=matrix_multi, args=(first, second, res, start_, stop_, size)) + processes.append(process) + process.start() + + for p in processes: + p.join() + stop_test = time() + print(f'{size}x{size}, time: {stop_test - start_test}') + + +if __name__ == "__main__": + sizes = [100, 300, 500] + threads_counts = [1, 4, 6, 8, 12] + for threads in threads_counts: + print('-------------------------------------------------') + print(f'Threads:{threads}') + for n in sizes: + first_matrix = np.random.randint(3, size=(n, n)) + second_matrix = np.random.randint(3, size=(n, n)) + if threads == 1: + res = np.zeros((n, n)) + start = time() + matrix_multi(first_matrix, second_matrix, res, 0, n, n) + stop = time() + print(f'{n}x{n}, time: {stop - start}') + else: + do(first_matrix, second_matrix, n, threads) + + print('-------------------------------------------------')