63 lines
2.4 KiB
Python
63 lines
2.4 KiB
Python
import multiprocessing
|
|
import numpy as np
|
|
import time
|
|
|
|
def sequential_multiply(A, B):
|
|
# Последовательное умножение матриц
|
|
return np.dot(A, B)
|
|
|
|
def parallel_multiply(A, B, num_processes):
|
|
rows_A = A.shape[0]
|
|
cols_B = B.shape[1]
|
|
|
|
# Используем Array для совместного использования памяти
|
|
C = multiprocessing.Array('d', rows_A * cols_B) # 'd' для double
|
|
|
|
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, C, start, end, rows_A, cols_B))
|
|
processes.append(p)
|
|
p.start()
|
|
|
|
for p in processes:
|
|
p.join()
|
|
|
|
# Преобразуем C в 2D массив NumPy для удобства
|
|
return np.frombuffer(C.get_obj()).reshape((rows_A, cols_B))
|
|
|
|
def perform_multiplication(A, B, C, start, end, rows_A, cols_B):
|
|
# Умножение строк матрицы A на столбцы матрицы B
|
|
for i in range(start, end):
|
|
for j in range(cols_B):
|
|
C[i * cols_B + j] = np.dot(A[i, :], B[:, j])
|
|
|
|
if __name__ == "__main__":
|
|
matrix_sizes = [100, 300, 500]
|
|
num_processes = int(input('Введите количество потоков: '))
|
|
|
|
for n in matrix_sizes:
|
|
# Генерация случайных матриц A и B
|
|
A = np.random.randint(10, size=(n, n))
|
|
B = np.random.randint(10, size=(n, n))
|
|
|
|
# Бенчмарк для последовательного умножения
|
|
start = time.time()
|
|
sequential_result = sequential_multiply(A, B)
|
|
end = time.time()
|
|
print(f"Последовательное умножение {n}x{n}: {end - start:.6f} секунд")
|
|
|
|
# Бенчмарк для параллельного умножения
|
|
start = time.time()
|
|
parallel_result = parallel_multiply(A, B, num_processes)
|
|
end = time.time()
|
|
print(f"Параллельное умножение {n}x{n}: {end - start:.6f} секунд")
|
|
|
|
# Проверка совпадения результатов
|
|
assert np.array_equal(sequential_result, parallel_result), "Результаты не совпадают!"
|