232 lines
17 KiB
Markdown
232 lines
17 KiB
Markdown
Альмухамметов ПИбд-42
|
||
|
||
Описание программы:
|
||
|
||
1. Ввод количества потоков: Программа начинается с запроса у пользователя количества потоков, которые будут использоваться в параллельных вычислениях.
|
||
Если введено некорректное значение, используется значение по умолчанию (4).
|
||
|
||
2. Генерация матриц: Программа генерирует три пары квадратных матриц разных размеров (100x100, 300x300, 500x500). Значения в матрицах генерируются случайным образом.1
|
||
|
||
3. Тестирование умножения матриц: Для каждой пары матриц проводится серия из 10 итераций умножения, где каждая итерация включает как последовательное,
|
||
так и параллельное умножение.
|
||
|
||
4. Подсчет времени и использования памяти: Для каждого умножения измеряется время выполнения и потребление памяти. Используется класс Stopwatch для измерения времени и
|
||
GC.GetTotalMemory для оценки использования памяти.
|
||
|
||
5. Вывод результатов: По окончании тестирования программа выводит средние значения времени выполнения и потребления памяти для последовательного и параллельного умножения
|
||
для каждого размера матриц.
|
||
|
||
6. Методы умножения матриц: Реализованы два метода умножения - MultiplyMatricesSequential для последовательного умножения и MultiplyMatricesParallel для параллельного.
|
||
Параллельное умножение использует Parallel.For с заданным количеством потоков.
|
||
|
||
7. Проверка совместимости матриц: Программа проверяет матрицы на совместимость для умножения (число столбцов первой матрицы должно быть равно числу строк второй).
|
||
|
||
8. функции: Включают генерацию матриц (GenerateMatrix), печать матрицы (PrintMatrix) и конвертацию матрицы в формат MathNet.Numerics.LinearAlgebra.Matrix для проверки
|
||
корректности умножения (ConvertToMathNetMatrix).
|
||
|
||
9. Тестирование операций над матрицами: 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 байт
|
||
|
||
На основе предоставленных результатов можно сделать несколько важных наблюдений относительно последовательного и параллельного умножения матриц:
|
||
|
||
1. Параллельное умножение матриц показывает лучшую производительность по сравнению с последовательным, особенно для матриц большего размера.
|
||
Это видно из сравнения времени выполнения: например, для матриц 500x500 время сокращается с 1071 мс до 578 мс при использовании 2 потоков и до 356 мс при использовании 4 потоков.
|
||
|
||
2. Для маленьких матриц (100x100), разница в производительности между последовательным и параллельным умножением не так заметна.
|
||
Это может быть связано с накладными расходами на создание и управление дополнительными потоками, которые не окупаются на малых объёмах данных.
|
||
|
||
3. Увеличение числа потоков с 2 до 4 приводит к дальнейшему улучшению времени выполнения в параллельных вычислениях.
|
||
Это подчеркивает важность выбора оптимального количества потоков для конкретной задачи и конфигурации оборудования.
|
||
|
||
4. Расход памяти при последовательном и параллельном умножении схож, что указывает на то, что параллельное выполнение не приводит к значительному увеличению потребления памяти.
|
||
Это положительный момент, поскольку параллельные вычисления часто ассоциируются с более высоким расходом ресурсов.
|
||
|
||
В целом, эти результаты демонстрируют преимущества использования параллельных вычислений для улучшения производительности, особенно на больших объемах данных.
|
||
Однако важно учитывать накладные расходы и выбирать количество потоков, оптимальное для конкретной задачи и оборудования.
|
||
|
||
Видео:
|
||
https://vk.com/video228053206_456240782 |