17 KiB
Альмухамметов ПИбд-42
Описание программы:
-
Ввод количества потоков: Программа начинается с запроса у пользователя количества потоков, которые будут использоваться в параллельных вычислениях. Если введено некорректное значение, используется значение по умолчанию (4).
-
Генерация матриц: Программа генерирует три пары квадратных матриц разных размеров (100x100, 300x300, 500x500). Значения в матрицах генерируются случайным образом.1
-
Тестирование умножения матриц: Для каждой пары матриц проводится серия из 10 итераций умножения, где каждая итерация включает как последовательное, так и параллельное умножение.
-
Подсчет времени и использования памяти: Для каждого умножения измеряется время выполнения и потребление памяти. Используется класс Stopwatch для измерения времени и GC.GetTotalMemory для оценки использования памяти.
-
Вывод результатов: По окончании тестирования программа выводит средние значения времени выполнения и потребления памяти для последовательного и параллельного умножения для каждого размера матриц.
-
Методы умножения матриц: Реализованы два метода умножения - MultiplyMatricesSequential для последовательного умножения и MultiplyMatricesParallel для параллельного. Параллельное умножение использует Parallel.For с заданным количеством потоков.
-
Проверка совместимости матриц: Программа проверяет матрицы на совместимость для умножения (число столбцов первой матрицы должно быть равно числу строк второй).
-
функции: Включают генерацию матриц (GenerateMatrix), печать матрицы (PrintMatrix) и конвертацию матрицы в формат MathNet.Numerics.LinearAlgebra.Matrix для проверки корректности умножения (ConvertToMathNetMatrix).
-
Тестирование операций над матрицами: TestMatrixOperation интегрирует функциональность вышеупомянутых методов, выполняя умножение и собирая статистические данные.
Результаты тестирования:
Введите количество потоков: 2 Прогон #1:
Последовательно: Время: 13 мс, Память: 39656 байт Параллельно: Время: 37 мс, Память: 45536 байт Последовательно: Время: 313 мс, Память: 359992 байт Параллельно: Время: 168 мс, Память: 360040 байт Последовательно: Время: 1497 мс, Память: 1000576 байт Параллельно: Время: 839 мс, Память: 1000288 байт Прогон #2:
Последовательно: Время: 11 мс, Память: 40040 байт Параллельно: Время: 8 мс, Память: 40040 байт Последовательно: Время: 340 мс, Память: 360576 байт Параллельно: Время: 163 мс, Память: 360040 байт Последовательно: Время: 1560 мс, Память: 1000576 байт Параллельно: Время: 799 мс, Память: 1000040 байт Прогон #3:
Последовательно: Время: 9 мс, Память: 40040 байт Параллельно: Время: 6 мс, Память: 40040 байт Последовательно: Время: 253 мс, Память: 360576 байт Параллельно: Время: 154 мс, Память: 360040 байт Последовательно: Время: 916 мс, Память: 1000576 байт Параллельно: Время: 485 мс, Память: 1000040 байт Прогон #4:
Последовательно: Время: 6 мс, Память: 40040 байт Параллельно: Время: 4 мс, Память: 40040 байт Последовательно: Время: 184 мс, Память: 360040 байт Параллельно: Время: 118 мс, Память: 360576 байт Последовательно: Время: 900 мс, Память: 1000040 байт Параллельно: Время: 518 мс, Память: 1000576 байт Прогон #5:
Последовательно: Время: 6 мс, Память: 40040 байт Параллельно: Время: 5 мс, Память: 40040 байт Последовательно: Время: 182 мс, Память: 360040 байт Параллельно: Время: 117 мс, Память: 360040 байт Последовательно: Время: 912 мс, Память: 1000576 байт Параллельно: Время: 534 мс, Память: 1000576 байт Прогон #6:
Последовательно: Время: 6 мс, Память: 40040 байт Параллельно: Время: 4 мс, Память: 40040 байт Последовательно: Время: 188 мс, Память: 360040 байт Параллельно: Время: 95 мс, Память: 360040 байт Последовательно: Время: 1046 мс, Память: 1000576 байт Параллельно: Время: 539 мс, Память: 1000576 байт Прогон #7:
Последовательно: Время: 6 мс, Память: 40040 байт Параллельно: Время: 7 мс, Память: 40040 байт Последовательно: Время: 183 мс, Память: 360040 байт Параллельно: Время: 115 мс, Память: 360040 байт Последовательно: Время: 878 мс, Память: 1000576 байт Параллельно: Время: 546 мс, Память: 1000040 байт Прогон #8:
Последовательно: Время: 6 мс, Память: 40040 байт Параллельно: Время: 6 мс, Память: 40040 байт Последовательно: Время: 193 мс, Память: 360576 байт Параллельно: Время: 105 мс, Память: 360040 байт Последовательно: Время: 1019 мс, Память: 1000576 байт Параллельно: Время: 506 мс, Память: 1000040 байт Прогон #9:
Последовательно: Время: 6 мс, Память: 40040 байт Параллельно: Время: 4 мс, Память: 40040 байт Последовательно: Время: 180 мс, Память: 360040 байт Параллельно: Время: 137 мс, Память: 360576 байт Последовательно: Время: 968 мс, Память: 1000040 байт Параллельно: Время: 485 мс, Память: 1000576 байт Прогон #10:
Последовательно: Время: 6 мс, Память: 40040 байт Параллельно: Время: 6 мс, Память: 40040 байт Последовательно: Время: 186 мс, Память: 360040 байт Параллельно: Время: 114 мс, Память: 360040 байт Последовательно: Время: 1020 мс, Память: 1000576 байт Параллельно: Время: 531 мс, Память: 1000576 байт
Среднее время (мс) и расход памяти (байт) для последовательного и параллельного умножения матриц: 100x100: Последовательно: Время: 7 мс, Память: 40001 байт 100x100: Параллельно: Время: 8 мс, Память: 40589 байт 300x300: Последовательно: Время: 220 мс, Память: 360196 байт 300x300: Параллельно: Время: 128 мс, Память: 360147 байт 500x500: Последовательно: Время: 1071 мс, Память: 1000468 байт 500x500: Параллельно: Время: 578 мс, Память: 1000332 байт
Введите количество потоков: 4 Прогон #1:
Последовательно: Время: 14 мс, Память: 39656 байт Параллельно: Время: 45 мс, Память: 46448 байт Последовательно: Время: 400 мс, Память: 359992 байт Параллельно: Время: 355 мс, Память: 361216 байт Последовательно: Время: 1603 мс, Память: 1000576 байт Параллельно: Время: 533 мс, Память: 1000040 байт Прогон #2:
Последовательно: Время: 10 мс, Память: 40040 байт Параллельно: Время: 4 мс, Память: 40040 байт Последовательно: Время: 333 мс, Память: 360576 байт Параллельно: Время: 167 мс, Память: 360088 байт Последовательно: Время: 1608 мс, Память: 1000576 байт Параллельно: Время: 480 мс, Память: 1000040 байт Прогон #3:
Последовательно: Время: 11 мс, Память: 40040 байт Параллельно: Время: 4 мс, Память: 40040 байт Последовательно: Время: 321 мс, Память: 360040 байт Параллельно: Время: 114 мс, Память: 360040 байт Последовательно: Время: 1299 мс, Память: 1000576 байт Параллельно: Время: 356 мс, Память: 1000040 байт Прогон #4:
Последовательно: Время: 6 мс, Память: 40040 байт Параллельно: Время: 3 мс, Память: 40040 байт Последовательно: Время: 268 мс, Память: 360040 байт Параллельно: Время: 73 мс, Память: 360040 байт Последовательно: Время: 877 мс, Память: 1000576 байт Параллельно: Время: 347 мс, Память: 1000576 байт Прогон #5:
Последовательно: Время: 6 мс, Память: 40040 байт Параллельно: Время: 3 мс, Память: 40040 байт Последовательно: Время: 192 мс, Память: 360040 байт Параллельно: Время: 69 мс, Память: 360040 байт Последовательно: Время: 1063 мс, Память: 1000576 байт Параллельно: Время: 345 мс, Память: 1000040 байт Прогон #6:
Последовательно: Время: 6 мс, Память: 40040 байт Параллельно: Время: 3 мс, Память: 40040 байт Последовательно: Время: 189 мс, Память: 360576 байт Параллельно: Время: 69 мс, Память: 360040 байт Последовательно: Время: 885 мс, Память: 1000576 байт Параллельно: Время: 308 мс, Память: 1000040 байт Прогон #7:
Последовательно: Время: 6 мс, Память: 40040 байт Параллельно: Время: 3 мс, Память: 40040 байт Последовательно: Время: 178 мс, Память: 360040 байт Параллельно: Время: 68 мс, Память: 360040 байт Последовательно: Время: 878 мс, Память: 1000576 байт Параллельно: Время: 298 мс, Память: 1000040 байт Прогон #8:
Последовательно: Время: 6 мс, Память: 40040 байт Параллельно: Время: 1 мс, Память: 40040 байт Последовательно: Время: 185 мс, Память: 360576 байт Параллельно: Время: 83 мс, Память: 360040 байт Последовательно: Время: 884 мс, Память: 1000040 байт Параллельно: Время: 293 мс, Память: 1000576 байт Прогон #9:
Последовательно: Время: 7 мс, Память: 40040 байт Параллельно: Время: 2 мс, Память: 40040 байт Последовательно: Время: 175 мс, Память: 360040 байт Параллельно: Время: 85 мс, Память: 360040 байт Последовательно: Время: 895 мс, Память: 1000576 байт Параллельно: Время: 327 мс, Память: 1000040 байт Прогон #10:
Последовательно: Время: 6 мс, Память: 40040 байт Параллельно: Время: 2 мс, Память: 40040 байт Последовательно: Время: 178 мс, Память: 360040 байт Параллельно: Время: 56 мс, Память: 360576 байт Последовательно: Время: 928 мс, Память: 1000040 байт Параллельно: Время: 282 мс, Память: 1000576 байт
Среднее время (мс) и расход памяти (байт) для последовательного и параллельного умножения матриц: 100x100: Последовательно: Время: 7 мс, Память: 40001 байт 100x100: Параллельно: Время: 7 мс, Память: 40680 байт 300x300: Последовательно: Время: 241 мс, Память: 360196 байт 300x300: Параллельно: Время: 113 мс, Память: 360216 байт 500x500: Последовательно: Время: 1092 мс, Память: 1000468 байт 500x500: Параллельно: Время: 356 мс, Память: 1000200 байт
На основе предоставленных результатов можно сделать несколько важных наблюдений относительно последовательного и параллельного умножения матриц:
-
Параллельное умножение матриц показывает лучшую производительность по сравнению с последовательным, особенно для матриц большего размера. Это видно из сравнения времени выполнения: например, для матриц 500x500 время сокращается с 1071 мс до 578 мс при использовании 2 потоков и до 356 мс при использовании 4 потоков.
-
Для маленьких матриц (100x100), разница в производительности между последовательным и параллельным умножением не так заметна. Это может быть связано с накладными расходами на создание и управление дополнительными потоками, которые не окупаются на малых объёмах данных.
-
Увеличение числа потоков с 2 до 4 приводит к дальнейшему улучшению времени выполнения в параллельных вычислениях. Это подчеркивает важность выбора оптимального количества потоков для конкретной задачи и конфигурации оборудования.
-
Расход памяти при последовательном и параллельном умножении схож, что указывает на то, что параллельное выполнение не приводит к значительному увеличению потребления памяти. Это положительный момент, поскольку параллельные вычисления часто ассоциируются с более высоким расходом ресурсов.
В целом, эти результаты демонстрируют преимущества использования параллельных вычислений для улучшения производительности, особенно на больших объемах данных. Однако важно учитывать накладные расходы и выбирать количество потоков, оптимальное для конкретной задачи и оборудования.