ismailov_rovshan_lab_5 is ready
This commit is contained in:
parent
bc087de470
commit
239da31a0d
17
ismailov_rovshan_lab_5/README.md
Normal file
17
ismailov_rovshan_lab_5/README.md
Normal file
@ -0,0 +1,17 @@
|
||||
# Лабораторная работа №5
|
||||
## ПИбд-42 || Исмаилов Ровшан
|
||||
|
||||
### Цель лабораторной работы
|
||||
Изучение принципов работы праллельных вычислений.
|
||||
|
||||
### Описание:
|
||||
Был реализован механизм параллельного перемножения матриц 100x100, 300x300 и 500x500 с возможностью задания потоков, в том числе и 1 (последовательное перемножение). Были сделаны замеры времени для каждого вычисления, проведен анализ и сделаны выводы.
|
||||
|
||||
### Результаты:
|
||||
![Изображение 1](./result.png)
|
||||
|
||||
### Выводы:
|
||||
При использовании параллельного умножения матриц основной целью является сокращение времени вычислений за счет увеличения количества потоков, что дает ощутимый эффект для больших матриц. Однако это оправдано только в том случае, если затраты на настройку многопоточности не перевешивают преимущества параллельной обработки: для небольших задач, таких как умножение матриц 100x100, заметного улучшения времени не наблюдается, а значит, этот метод неэффективен. Кроме того, существует ограничение, заключающееся в том, что добавление новых потоков не приводит к увеличению скорости. Исходя из этого, было определено оптимальное количество потоков для данной задачи.
|
||||
|
||||
### Видео с демонстрацией работы:
|
||||
https://cloud.mail.ru/public/AfQo/nnejh3xt2
|
59
ismailov_rovshan_lab_5/main.py
Normal file
59
ismailov_rovshan_lab_5/main.py
Normal 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()
|
BIN
ismailov_rovshan_lab_5/result.png
Normal file
BIN
ismailov_rovshan_lab_5/result.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 27 KiB |
Loading…
Reference in New Issue
Block a user