diff --git a/ismailov_rovshan_lab_5/README.md b/ismailov_rovshan_lab_5/README.md new file mode 100644 index 0000000..9b4be6f --- /dev/null +++ b/ismailov_rovshan_lab_5/README.md @@ -0,0 +1,17 @@ +# Лабораторная работа №5 +## ПИбд-42 || Исмаилов Ровшан + +### Цель лабораторной работы +Изучение принципов работы праллельных вычислений. + +### Описание: +Был реализован механизм параллельного перемножения матриц 100x100, 300x300 и 500x500 с возможностью задания потоков, в том числе и 1 (последовательное перемножение). Были сделаны замеры времени для каждого вычисления, проведен анализ и сделаны выводы. + +### Результаты: +![Изображение 1](./result.png) + +### Выводы: +При использовании параллельного умножения матриц основной целью является сокращение времени вычислений за счет увеличения количества потоков, что дает ощутимый эффект для больших матриц. Однако это оправдано только в том случае, если затраты на настройку многопоточности не перевешивают преимущества параллельной обработки: для небольших задач, таких как умножение матриц 100x100, заметного улучшения времени не наблюдается, а значит, этот метод неэффективен. Кроме того, существует ограничение, заключающееся в том, что добавление новых потоков не приводит к увеличению скорости. Исходя из этого, было определено оптимальное количество потоков для данной задачи. + +### Видео с демонстрацией работы: +https://cloud.mail.ru/public/AfQo/nnejh3xt2 \ No newline at end of file diff --git a/ismailov_rovshan_lab_5/main.py b/ismailov_rovshan_lab_5/main.py new file mode 100644 index 0000000..3fb87e3 --- /dev/null +++ b/ismailov_rovshan_lab_5/main.py @@ -0,0 +1,59 @@ +import random +import time +import multiprocessing +import numpy as np + +def create_random_matrix(size): + return [[random.randint(0, 10) for _ in range(size)] for _ in range(size)] + +# Функция для умножения одной строки матрицы +def process_row(i, A, B, result): + size = len(A) + for j in range(size): + for k in range(size): + result[i][j] += A[i][k] * B[k][j] + + +# Функция для параллельного умножения матриц с использованием multiprocessing +def multiply_matrices_in_parallel(A, B, num_processes): + size = len(A) + result = [[0] * size for _ in range(size)] + + with multiprocessing.Pool(processes=num_processes) as pool: + pool.starmap(process_row, [(i, A, B, result) for i in range(size)]) + + return result + + +# Функция для измерения времени выполнения умножения матриц +def measure_execution_time(size, num_processes=1): + A = create_random_matrix(size) + B = create_random_matrix(size) + + start_time = time.time() + multiply_matrices_in_parallel(A, B, num_processes) + elapsed_time = time.time() - start_time + + return elapsed_time + +def main(): + matrix_sizes = [100, 300, 500] + process_count_options = [1, 2, 4, 6, 8] + + print("-*" * 40) + print(f"{'Количество потоков':<20}{'|100x100 (сек.)':<20}{'|300x300 (сек.)':<20}{'|500x500 (сек.)'}") + print("-*" * 40) + + # Запуск тестов для разных значений числа процессов + for num_processes in process_count_options: + row = f"{num_processes:<20}" + + for size in matrix_sizes: + par_time = measure_execution_time(size, num_processes) + row += f"|{par_time:.4f}".ljust(20) + print(row) + print("-*" * 40) + + +if __name__ == "__main__": + main() diff --git a/ismailov_rovshan_lab_5/result.png b/ismailov_rovshan_lab_5/result.png new file mode 100644 index 0000000..7dd995c Binary files /dev/null and b/ismailov_rovshan_lab_5/result.png differ