distributed-computing/tasks/plaksina-av/lab_6
2023-12-17 00:55:54 +04:00
..
photo lab6_done 2023-12-17 00:55:54 +04:00
determinant.py lab6_done 2023-12-17 00:55:54 +04:00
README.md lab6_done 2023-12-17 00:55:54 +04:00

Отчет по лабораторной работе №6

Выполнила студентка гр. ИСЭбд-41 Плаксина А.В.

Описание работы приложения

Приложение реализовнао на языке питон, использована среда PyCharm для разработки.

Это консольное приложение, которое вычисляет детерминант матриц. Задается размерность матрицы, элементы генерируются рандомно (указываетя только диапазон их значений), количество

Код реализующий заполнение данных:

if __name__ == "__main__":
    matrix_size = 10  # размер матрицы
    lower_limit = 5  # числа в матрице от
    upper_limit = 15  # и до
    processes = [2, 4, 8, 16, 32]
    #
    # последовательное вычисление
    sequential_determinant_calculation(matrix_size, lower_limit, upper_limit)

    # параллельное вычисление
    for i in processes:
        print("Потоков " + str(i))
        parallel_determinant_calculation(matrix_size, lower_limit, upper_limit, i)

Код реализующий последовательное вычисление детерминанта матриц:

def sequential_determinant_calculation(matrix_size, lower_limit, upper_limit):
    random_matrix = generate_random_matrix(matrix_size, lower_limit, upper_limit)

    start_time = time.time()
    result = determinant(random_matrix)
    end_time = time.time()

    print(f"Последовательный детерминант: {result}")
    print(f"Последовательное время: {end_time - start_time} секунд")

Код реализующий параллельное вычисление детерминанта матриц:

def parallel_determinant_calculation(matrix_size, lower_limit, upper_limit, num_processes):
    random_matrix = generate_random_matrix(matrix_size, lower_limit, upper_limit)

    matrices_to_process = [submatrix(random_matrix, 0, col) for col in range(matrix_size)]

    start_time = time.time()
    with Pool(processes=num_processes) as pool:
        determinants = pool.map(determinant, matrices_to_process)

    result = sum(((-1) ** col) * random_matrix[0][col] * det for col, det in enumerate(determinants))
    end_time = time.time()

    print(f"Параллельный детерминант: {result}")
    print(f"Параллельное время: {end_time - start_time} секунд")


Бенчмаркинг

Для матриц болших размеров детерминант вычисляется очень долгое время, поэтому для примера я взяла размерность матрица 10х10

Результаты бенчмаркинга для последовательного способа вычисления детерминанта матриц:

Результаты бенчмаркинга для параллельного способа вычисления детерминанта матриц с различным количеством потока:

Вывод

Скорость обработки у параллельного способа значительно выше, чем у последовательного

При увеличении количества потоков время обработки сначала снижается, затем, по примеру, начиная с 16 потока, время опять увеличивается, так как потоков становится слишком много.