75 lines
2.2 KiB
Python
Raw Normal View History

2024-01-22 04:27:41 +04:00
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}")