Тест некоторых функций MPI

А.А. Романенко, аспирант НГУ, кафедра параллельных вычислений

В рамках работы по созданию отладчика параллельных программ были проведены ряд тестов, в ходе которых проявились некоторые особенности реализации функций передачи данных. Здесь приводится описание тестов, полученные данные и их интерпретация. Тесты проводились на реализациях MPI mpich версии 1.2.1 и LAM 6.5.

Отладчик реализован как система мониторинга. Перед компиляцией программы вызовы MPI в исходном коде подменяются на функции-обертки, которые помимо того, что вызывают функции, которые они подменяют, еще и сохраняют данные, необходимые в дальнейшем для анализа поведения программы. Парой таких параметров является время до и после вызова функции. Естественно, что если процессы параллельной программы исполняются на разных узлах вычислительной системы, нельзя говорить об одновременности (неодновременности) происхождения событий т.к. время на узлах системы не может быть синхранизовано с достаточной точностью (без дополнительных затрат, например, увеличением нагрузки на канал связи между узлами вычислительного комплекса). Во избежания этого эффекта все процессы исполнялись на одном узле вычислительной системы. Базовые параметры узла:

  • CPU - 2xPIII 933MHz
  • RAM - 1GB

Из примеров, поставляемых вместе с пакетом mpich была взята программа вычисления числа π(Pi) через площадь круга. После инициализации процесс с ранком "0" посылает всем процессам сообщение о начале вычислений с помощью функции MPI_Bcast. После получения этого сообщения каждый процесс вычисляет интеграл на своем интервале и результат интегрирования собирается процессом с ранком "0" с помощью функции MPI_Reduce. После вычисления числа π(Pi) всем процессам опять через функцию MPI_Bcast посылается сообщение, получив которое процессы завершают свою работу (код программы).

После подмены функций MPI_Init, MPI_Finalize, MPI_Bcast, MPI_Reduce, запуска программ и визуализации полученных данных были получены следующие результаты:





На диаграммах каждому процессу сопоставлена прямая (сверху вниз - процессы с ранком 0, 1, 2, 3, 4). Линиями отображено время, которое требуется для выполнения функций MPI. Здесь и ниже разными цветами представлены разные функции MPI.
Красный   MPI_Init
Зеленый   MPI_Finalize
Синий   MPI_Send
Желтый   MPI_Recv
Голубой   MPI_Bcast
Розовый   MPI_Reduce
Из полученных графиков можно сделать выводы:
  1. Выход из функции инициализации MPI_Init происходит не одновременно. Таким образом один процесс может начать вычисления раньше, чем другой закончит инициализацию.

  2. Функция посылки данных всем (MPI_Bcast) может завершаться до того момента, как эта же функция будет вызвана другим процессом. Это хорошо видно на всех трех приведенных диаграммах при первом вызове MPI_Bcast. Это может объясняться тем, что управление программе возвращается сразу, как только данные помещаются во внутренний буфер. При этом посылающий процесс не получает подтверждения о том, что посланные данные были получены. Очевидно, что вызов MPI_Bcast принимающего процесса не может завершится раньше, чем данные будут получены.

В mpich и LAM функция MPI_Bcast реализована через функции MPI_Send. Следовательно, можно утверждать, что сказанное выше относительно MPI_Bcast верно и для пары MPI_Send, MPI_Recv. Это видно из следующего теста: процессы параллельной программы передают по цепочке друг другу сообщение с помощью функций MPI_Send, MPI_Recv (код программы). Результат запуска программы представлен на следующем диаграмме.

Представление данных аналогично предыдущим диаграммам. На рисунке отчетливо видно, что функция MPI_Send (синие линии) могут завершаться до вызова функции MPI_Recv (процессы с ранками 0 и 1, 2 и 3).