DAS_2023_1/almukhammetov_bulat_lab_5/README.md
2024-01-07 11:16:43 +04:00

232 lines
17 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

Альмухамметов ПИбд-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