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

17 KiB
Raw Permalink Blame History

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