После того, как мы написали два варианта программы попробуем сравнить их быстродействие и посмотреть, стоила ли овчина выделки. Ниже приведена сводная таблица тестов последовательной программы, параллельной программы, выполняемой на одном компьютере и параллельной программы, выполняемой на двух и четырех компьютерах. Во всех случаях параметры задачи и общий размер разностной сетки были одинаковы.
Вариант запуска | Кол-во CPU | Время счета |
---|---|---|
Последовательная программа | 1 | 3 мин. 35 сек. |
Параллельная программа запуск без MPI (./diffp) | 1 | 3 мин. 36 сек. |
Параллельная программа запуск с MPI (mpirun ./diffp) | 1 | 4 мин. 36 сек. |
Параллельная программа | 2 | 2 мин. 13 сек. |
Параллельная программа | 4 | 0 мин. 56 сек. |
Тест показал, что запуск в среде MPI параллельной программы на одном процессоре занимает больше времени. Это вполне ожидаемый результат, поскольку в этом случае появляются накладные расходы на взаимодействия между процессами, хотя в действительности процесс был один. Выполнение параллельной программы без использования среды MPI показывает примерно то же быстродействие, что и обычная последовательная программа.
Данный тест проведен в предположении неизменности размера нашей разностной сетки. Другими словами, мы стремились на одних и тех же данных получить наибольшее быстродействие. Во всех тестах общая расчетная область имела размер 4000x6000 ячеек.
Как уже говорилось ранее, кластер может использоваться не только для увеличения скорости счета, но и для увеличения доступной оперативной памяти. Поэтому имеет смысл протестировать параллельную задачу в условиях, когда размер локальной сетки на каждом из узлов кластера будет равен исходному, то есть 4000x6000, то есть мы увеличиваем доступную память в N раз, где N - количество вычислительных узлов.
На момент написания этого раздела мне был доступен тестовый кластер, состоящий из трех компьюьеров с двухядерными процессорами и 1 Гб памяти на борту. Поскольку два массива REAL*8 размером 4000x6000 занимают в памяти примерно 366 Мб, то, несмотря на двухядерность, во избежанеие проблем с памятью (свопинг и все такое...), я не стал запускать по два процесса на одной машине, и сравнил быстродействие последовательной программы, запущенной на одном процессоре и быстродействие параллельной программы с троекратным увеличением общего объема данных, запущенной на трех процессорах. Результаты теста получились такими:
Размер матрицы (общий) | Кол-во CPU | Время счета |
---|---|---|
4000x6000 | 1 | 3 мин. 35 сек. |
4000x18000 | 3 | 4 мин. 37 сек. |
Результат тоже впечатляющий. Действительно, увеличение объема данных (размера разностной сетки) в 3 раза при использовании трехпроцессорного кластера потребовало расчетного времени всего в 1.3 раза больше.
Эффект, как говорится, на лицо!