Merge pull request 'ismailov_rovshan_lab_5 is ready' (#326) from ismailov_rovshan_lab_5 into main

Reviewed-on: #326
This commit is contained in:
Alexey 2024-12-15 14:48:34 +04:00
commit 9e71d368c8
3 changed files with 76 additions and 0 deletions

View File

@ -0,0 +1,17 @@
# Лабораторная работа №5
## ПИбд-42 || Исмаилов Ровшан
### Цель лабораторной работы
Изучение принципов работы праллельных вычислений.
### Описание:
Был реализован механизм параллельного перемножения матриц 100x100, 300x300 и 500x500 с возможностью задания потоков, в том числе и 1 (последовательное перемножение). Были сделаны замеры времени для каждого вычисления, проведен анализ и сделаны выводы.
### Результаты:
![Изображение 1](./result.png)
### Выводы:
При использовании параллельного умножения матриц основной целью является сокращение времени вычислений за счет увеличения количества потоков, что дает ощутимый эффект для больших матриц. Однако это оправдано только в том случае, если затраты на настройку многопоточности не перевешивают преимущества параллельной обработки: для небольших задач, таких как умножение матриц 100x100, заметного улучшения времени не наблюдается, а значит, этот метод неэффективен. Кроме того, существует ограничение, заключающееся в том, что добавление новых потоков не приводит к увеличению скорости. Исходя из этого, было определено оптимальное количество потоков для данной задачи.
### Видео с демонстрацией работы:
https://cloud.mail.ru/public/AfQo/nnejh3xt2

View File

@ -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()

Binary file not shown.

After

Width:  |  Height:  |  Size: 27 KiB