From 8186f826c3ec458711b63667f8a45993a16344bf Mon Sep 17 00:00:00 2001 From: "an.lazarev" Date: Tue, 5 Nov 2024 22:38:45 +0400 Subject: [PATCH] lazarev_andrey_lab_5 --- lazarev_andrey_lab_5/README.md | 35 ++++++++++++++ lazarev_andrey_lab_5/main.py | 81 ++++++++++++++++++++++++++++++++ lazarev_andrey_lab_5/report.png | Bin 0 -> 38661 bytes 3 files changed, 116 insertions(+) create mode 100644 lazarev_andrey_lab_5/README.md create mode 100644 lazarev_andrey_lab_5/main.py create mode 100644 lazarev_andrey_lab_5/report.png diff --git a/lazarev_andrey_lab_5/README.md b/lazarev_andrey_lab_5/README.md new file mode 100644 index 0000000..e3d54f8 --- /dev/null +++ b/lazarev_andrey_lab_5/README.md @@ -0,0 +1,35 @@ +# Лабораторная работа №5 + +## Задание + +Реализовать последовательное и параллельное умножение матриц размером 100x100, 300x300, 500x500 элементов, сравнить результаты. + +## Описание алгоритмов + +### Последовательное умножение + +- Реализовано при помощи тройного цикла умножения квадратных матриц с сложностью O(n³), т.е. при увеличении размера матриц увеличится и время работы алгоритма. + +### Параллельное умножение + +- Реализовано при помощи разделения матриц на части в зависимости от количества потоков, а после умножаются две прямоугольные матрицы. +- Сложность аналогична последовательному алгоритму, но разделение матриц значительно снижает время работы алгоритма. + +### Умножение с использованием библиотеки Numpy + +- Умножение с ипользованием библиотеки Numpy максимально отпимизировано за счет кэшированияи и использования библиотеки BLAS (Basic Linear Algebra Subprograms) на языке C для выполнения линейной алгребры. + +## Результаты + +![](report.png "") + + +### Вывод +- Параллельное умножение матриц эффективно при работе с большими матрицами при увеличении потоков. +- Последовательное умножение матриц эффективно использовать при меньших размерах матриц, где выйгрыш от управления потоками минимален. +- Numpy показал блестящий результат. + +## Видеодемонстрация работоспособности + +[Демонстрация работы сервисов](https://files.ulstu.ru/s/4jmPMLK3szdKdWS) + diff --git a/lazarev_andrey_lab_5/main.py b/lazarev_andrey_lab_5/main.py new file mode 100644 index 0000000..433bcba --- /dev/null +++ b/lazarev_andrey_lab_5/main.py @@ -0,0 +1,81 @@ +import numpy as np +from concurrent.futures import ProcessPoolExecutor +import time + +#Функция умножения матриц +def multi(A, B): + n = len(A) + k = len(B) + C = np.zeros((n, n)) + + for i in range(n): + for j in range(n): + C[i][j] = sum(A[i][p] * B[p][j] for p in range(k)) + + return C + +# Функция последовательного умножения матриц +def multi_sequential(A, B): + n = len(A) + C = np.zeros((n, n)) + for i in range(n): + for k in range(n): + temp = A[i][k] + for j in range(n): + C[i][j] += temp * B[k][j] + return C + +# Функция умножения матриц с numpy +def multi_numpy(A, B): + return np.dot(A, B) + +# Параллельное умножение матриц +def multi_parallel(A, B, num_threads): + n = len(A) + C = np.zeros((n, n)) + step = n // num_threads + + with ProcessPoolExecutor(max_workers=num_threads) as executor: + futures = [] + for i in range(num_threads): + start_row = i * step + end_row = (i + 1) * step if i != num_threads - 1 else n + + a_slice = A[:, i*step: (i+1)*step] + b_slice = B[start_row:end_row] + + futures.append(executor.submit(multi, a_slice, b_slice)) + + for future in futures: + C += future.result() + + return C + +# Пример использования +if __name__ == "__main__": + matrix_sizes = [100, 300, 500] + num_threads = [2, 4, 5, 10] + for n in matrix_sizes: + A = np.random.rand(n, n) + B = np.random.rand(n, n) + + # Умножение с numpy + start_np = time.time() + nump = multi_numpy(A, B) + end_np = time.time() + print(f'Умножение матриц {n}x{n} последовательно с numpy: {(end_np - start_np):.6f} с.') + + # Последовательное умножение + start_seq = time.time() + sequential = multi_sequential(A, B) + end_seq = time.time() + print(f'Умножение матриц {n}x{n} последовательно: {(end_seq - start_seq):.6f} с.') + + # Параллельное умножение + for thread in num_threads: + start_par = time.time() + parallel = multi_parallel(A, B, thread) + end_par = time.time() + print(f'Умножение матриц {n}x{n} параллельно для {thread} потоков: {(end_par - start_par):.3f} с.') + + print('') \ No newline at end of file diff --git a/lazarev_andrey_lab_5/report.png b/lazarev_andrey_lab_5/report.png new file mode 100644 index 0000000000000000000000000000000000000000..9a0667b9f2ea88864bd8b487833fa00f99fb7e2f GIT binary patch literal 38661 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 literal 0 HcmV?d00001