60 lines
1.9 KiB
Python
60 lines
1.9 KiB
Python
|
import random
|
|||
|
import time
|
|||
|
import multiprocessing
|
|||
|
import numpy as np
|
|||
|
|
|||
|
# Генерация случайной матрицы
|
|||
|
def create_random_matrix(dim):
|
|||
|
return [[random.randint(0, 10) for _ in range(dim)] for _ in range(dim)]
|
|||
|
|
|||
|
# Умножение отдельной строки
|
|||
|
def compute_row_product(row_idx, mat_a, mat_b, output_mat):
|
|||
|
dim = len(mat_a)
|
|||
|
for col_idx in range(dim):
|
|||
|
for k in range(dim):
|
|||
|
output_mat[row_idx][col_idx] += mat_a[row_idx][k] * mat_b[k][col_idx]
|
|||
|
|
|||
|
# Параллельное умножение матриц
|
|||
|
def parallel_matrix_multiplication(mat_a, mat_b, num_workers):
|
|||
|
dim = len(mat_a)
|
|||
|
result_matrix = [[0] * dim for _ in range(dim)]
|
|||
|
|
|||
|
with multiprocessing.Pool(processes=num_workers) as pool:
|
|||
|
pool.starmap(compute_row_product, [(i, mat_a, mat_b, result_matrix) for i in range(dim)])
|
|||
|
|
|||
|
return result_matrix
|
|||
|
|
|||
|
# Измерение времени выполнения
|
|||
|
def run_benchmark(dim, num_workers=1):
|
|||
|
mat_a = create_random_matrix(dim)
|
|||
|
mat_b = create_random_matrix(dim)
|
|||
|
|
|||
|
start_time = time.time()
|
|||
|
parallel_matrix_multiplication(mat_a, mat_b, num_workers)
|
|||
|
elapsed_time = time.time() - start_time
|
|||
|
|
|||
|
return elapsed_time
|
|||
|
|
|||
|
def main():
|
|||
|
# Размеры матриц
|
|||
|
matrix_dimensions = [100, 300, 500]
|
|||
|
# Количество рабочих процессов
|
|||
|
worker_counts = [1, 2, 4, 6, 8]
|
|||
|
|
|||
|
# Печать таблицы с результатами
|
|||
|
print("-*" * 40)
|
|||
|
print(f"{'Количество процессов':<20}{'|100x100 (сек.)':<20}{'|300x300 (сек.)':<20}{'|500x500 (сек.)'}")
|
|||
|
print("-*" * 40)
|
|||
|
|
|||
|
for workers in worker_counts:
|
|||
|
row = f"{workers:<20}"
|
|||
|
|
|||
|
for dim in matrix_dimensions:
|
|||
|
benchmark_time = run_benchmark(dim, workers)
|
|||
|
row += f"|{benchmark_time:.4f}".ljust(20)
|
|||
|
print(row)
|
|||
|
print("-*" * 40)
|
|||
|
|
|||
|
if __name__ == "__main__":
|
|||
|
main()
|