# Отчет по лабораторной работе №5 Выполнила студентка гр. ИСЭбд-41 Островская С.Ф. ## Создание приложения Было выбрано консольное приложение, язык программирования - c#. Обычный алгоритм: ```cs static int[][] MultiplyMatrix(int[][] matrix1, int[][] matrix2) { int rows = matrix1.Length; int columns = matrix2[0].Length; int[][] result = new int[rows][]; for (int i = 0; i < rows; i++) { result[i] = new int[columns]; for (int j = 0; j < columns; j++) { result[i][j] = 0; for (int k = 0; k < matrix1[i].Length; k++) { result[i][j] += matrix1[i][k] * matrix2[k][j]; } } } return result; } ``` Параллельный алгоритм: ```cs static int[][] MultiplyMatrixParallel(int[][] matrix1, int[][] matrix2, int numThreads) { int rows = matrix1.Length; int columns = matrix2[0].Length; int[][] result = new int[rows][]; Parallel.For(0, rows, new ParallelOptions { MaxDegreeOfParallelism = numThreads }, i => { result[i] = new int[columns]; for (int j = 0; j < columns; j++) { result[i][j] = 0; Parallel.For(0, matrix1[i].Length, k => { result[i][j] += matrix1[i][k] * matrix2[k][j]; }); } }); return result; } ``` ![](pic/pic1.jpg) ![](pic/pic2.jpg) В результате обычный алгоритм выполнился за ``0,0002112`` секунды, а паралелльный за ``0,0064956`` секунды. ## Бенчмарки Протестируем обычный и параллельный алгоритмы на матрицах различных размеров: 100х100, 300х300 и 500х500. Количество потоков: ``4`` ![](pic/pic3.jpg) Количество потоков: ``12`` ![](pic/pic4.jpg) ``Вывод``: Обыный алгоритм работает быстрее, если количество элементов не слишком много. Параллельный же алгоритм работает быстрее только при наличии большого количества операций и данных. Оптимальное количество потоков для эффективной работы - 12.