diff --git a/klyushenkova_ksenia_lab_5/README.md b/klyushenkova_ksenia_lab_5/README.md new file mode 100644 index 0000000..21a0073 --- /dev/null +++ b/klyushenkova_ksenia_lab_5/README.md @@ -0,0 +1,18 @@ + +# Клюшенкова Ксения ПИбд-42 +# Лабораторная работа №5 - Параллельное перемножение матриц + + +## Результат: +![results](./res.jpg) + +## Выводы: + +1. Для небольших матриц более эффективно использовать последовательное умножение (1 поток). + +2. Для крупных матриц предпочтительнее применять параллельное умножение, поскольку временные затраты при последовательном умножении в этом случае значительно превышают затраты на управление потоками. + +3. Увеличение числа потоков для выполнения параллельного умножения крупных матриц в определённый момент не приводит к увеличению скорости выполнения. Это означает, что оптимальное количество потоков уже достигнуто. + + +## [Видео](https://drive.google.com/file/d/1yaFvRlzHPyghwOm__m2MvqNR__HsK469/view?usp=sharing) \ No newline at end of file diff --git a/klyushenkova_ksenia_lab_5/main.py b/klyushenkova_ksenia_lab_5/main.py new file mode 100644 index 0000000..35a0dab --- /dev/null +++ b/klyushenkova_ksenia_lab_5/main.py @@ -0,0 +1,51 @@ +import numpy as np +import multiprocessing +import time +from time import time + + +def multiplication(first, second, res, start, stop, size): + for i in range(start, stop): + for j in range(size): + res[i][j] = 0 + for k in range(size): + res[i][j] += first[i][k] * second[k][j] + + +if __name__ == "__main__": + sizes = [100, 300, 500] + threads_counts = [1, 3, 5, 7, 9] + for threads in threads_counts: + print(f'Количество потоков: {threads}') + for size in sizes: + A = np.random.randint(10, size=(size, size)) + B = np.random.randint(10, size=(size, size)) + if threads == 1: + res = np.zeros((size, size)) + start = time() + multiplication(A, B, res, 0, size, size) + stop = time() + print(f'Размер: {size}x{size}, время выполнения: {stop - start}') + + else: + offset = int(size / threads) + offset_last = size % threads + offset + + processes = [] + res = np.zeros((size, size)) + start = time() + for i in range(threads): + start_ = i * offset + stop_ = start_ + offset_last if i == threads - 1 else start_ + offset + + process = multiprocessing.Process(target=multiplication, args=(A, B, res, start_, stop_, size)) + processes.append(process) + process.start() + + for p in processes: + p.join() + + stop = time() + + print(f'Размер: {size}x{size}, время выполнения: {stop - start}') + print() \ No newline at end of file diff --git a/klyushenkova_ksenia_lab_5/res.jpg b/klyushenkova_ksenia_lab_5/res.jpg new file mode 100644 index 0000000..edb331b Binary files /dev/null and b/klyushenkova_ksenia_lab_5/res.jpg differ