simonov nikita lab 5 done
This commit is contained in:
parent
60ef5724cd
commit
a0cd8cbd12
74
simonov_nikita_lab_5/main.py
Normal file
74
simonov_nikita_lab_5/main.py
Normal file
@ -0,0 +1,74 @@
|
||||
import multiprocessing
|
||||
import numpy as np
|
||||
import time
|
||||
|
||||
def sequential_multiply_matrix(A, B):
|
||||
rows_A = len(A)
|
||||
cols_A = len(A[0])
|
||||
rows_B = len(B)
|
||||
cols_B = len(B[0])
|
||||
|
||||
if cols_A != rows_B:
|
||||
print("Умножение матриц невозможно.")
|
||||
return
|
||||
|
||||
result_matrix = [[0 for row in range(cols_B)] for col in range(rows_A)]
|
||||
|
||||
for i in range(rows_A):
|
||||
for j in range(cols_B):
|
||||
for k in range(cols_A):
|
||||
result_matrix[i][j] += A[i][k] * B[k][j]
|
||||
|
||||
return result_matrix
|
||||
|
||||
def parallel_multiply_matrix(A, B, num_processes):
|
||||
rows_A = len(A)
|
||||
cols_A = len(A[0])
|
||||
rows_B = len(B)
|
||||
cols_B = len(B[0])
|
||||
|
||||
if cols_A != rows_B:
|
||||
print("Умножение матриц невозможно.")
|
||||
return
|
||||
|
||||
result_matrix = [[0 for row in range(cols_B)] for col in range(rows_A)]
|
||||
|
||||
chunk_size = int(rows_A / num_processes)
|
||||
|
||||
processes = []
|
||||
for i in range(num_processes):
|
||||
start = chunk_size * i
|
||||
end = chunk_size * (i + 1) if i < num_processes - 1 else rows_A
|
||||
|
||||
p = multiprocessing.Process(target=perform_multiplication, args=(A, B, result_matrix, start, end))
|
||||
processes.append(p)
|
||||
p.start()
|
||||
|
||||
for p in processes:
|
||||
p.join()
|
||||
|
||||
return result_matrix
|
||||
|
||||
def perform_multiplication(A, B, result_matrix, start, end):
|
||||
for i in range(start, end):
|
||||
for j in range(len(B[0])):
|
||||
for k in range(len(A[0])):
|
||||
result_matrix[i][j] += A[i][k] * B[k][j]
|
||||
|
||||
if __name__ == "__main__":
|
||||
matrix_sizes = [100, 300, 500]
|
||||
num_processes = 4
|
||||
|
||||
for n in matrix_sizes:
|
||||
matrix_A = np.random.randint(10, size=(n, n))
|
||||
matrix_B = np.random.randint(10, size=(n, n))
|
||||
|
||||
start_time = time.time()
|
||||
sequential_result = sequential_multiply_matrix(matrix_A, matrix_B)
|
||||
end_time = time.time()
|
||||
print(f"Последовательное умножение {n}x{n} матриц заняло: {end_time - start_time} секунд")
|
||||
|
||||
start_time = time.time()
|
||||
parallel_result = parallel_multiply_matrix(matrix_A, matrix_B, num_processes)
|
||||
end_time = time.time()
|
||||
print(f"Параллельное умножение {n}x{n} матриц заняло: {end_time - start_time}")
|
31
simonov_nikita_lab_5/readme.md
Normal file
31
simonov_nikita_lab_5/readme.md
Normal file
@ -0,0 +1,31 @@
|
||||
# Лабораторная работа №5.
|
||||
|
||||
## Задание
|
||||
|
||||
Реализовать умножение двух больших квадратных матриц
|
||||
|
||||
## Ход выполнения
|
||||
|
||||
- Реализовать алгоритм перемножение матриц для потокового выполнения
|
||||
- Адаптировать алгоритм для параллельного выполнения:
|
||||
- Разделить данные на чанки, сохранив корректность вычислений
|
||||
|
||||
## Технологии
|
||||
- `numpy`: библиотека для работы с многомерными массивами и матрицами в Python.
|
||||
- `multiprocessing`: модуль Python, предоставляющий возможность создания и управления процессами, что позволяет реализовать параллельные вычисления.
|
||||
|
||||
## Ход работы
|
||||
|
||||
- `sequential_multiply_matrix`: Функция выполняет последовательное умножение двух матриц. Перед умножением производится проверка на возможность выполнения операции. Результат сохраняется в новой матрице.
|
||||
|
||||
- `parallel_multiply_matrix`: Функция выполняет параллельное умножение двух матриц, разделяя работу между указанным числом процессов. Также производится проверка на возможность умножения матриц. Результат сохраняется в новой матрице.
|
||||
|
||||
- `perform_multiplication`: Вспомогательная функция, используемая в параллельном умножении. Каждый процесс выполняет умножение только для своего "куска" матрицы.
|
||||
|
||||
## Результаты
|
||||
|
||||

|
||||
|
||||
## Ссылка на видео
|
||||
|
||||
https://drive.google.com/file/d/18GxoovYjWLUAOhtsORBzBUByu4HdIeY8/view?usp=sharing
|
BIN
simonov_nikita_lab_5/screens/Screenshot_1.png
Normal file
BIN
simonov_nikita_lab_5/screens/Screenshot_1.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 11 KiB |
Loading…
x
Reference in New Issue
Block a user