В рамках работы по созданию отладчика параллельных программ были проведены ряд тестов, в ходе которых проявились некоторые особенности реализации функций передачи данных. Здесь приводится описание тестов, полученные данные и их интерпретация. Тесты проводились на реализациях MPI mpich версии 1.2.1 и LAM 6.5. Отладчик реализован как система мониторинга. Перед компиляцией программы вызовы MPI в исходном коде подменяются на функции-обертки, которые помимо того, что вызывают функции, которые они подменяют, еще и сохраняют данные, необходимые в дальнейшем для анализа поведения программы. Парой таких параметров является время до и после вызова функции. Естественно, что если процессы параллельной программы исполняются на разных узлах вычислительной системы, нельзя говорить об одновременности (неодновременности) происхождения событий т.к. время на узлах системы не может быть синхранизовано с достаточной точностью (без дополнительных затрат, например, увеличением нагрузки на канал связи между узлами вычислительного комплекса). Во избежания этого эффекта все процессы исполнялись на одном узле вычислительной системы. Базовые параметры узла:
Из примеров, поставляемых вместе с пакетом mpich была взята программа вычисления числа π(Pi) через площадь круга. После инициализации процесс с ранком "0" посылает всем процессам сообщение о начале вычислений с помощью функции MPI_Bcast. После получения этого сообщения каждый процесс вычисляет интеграл на своем интервале и результат интегрирования собирается процессом с ранком "0" с помощью функции MPI_Reduce. После вычисления числа π(Pi) всем процессам опять через функцию MPI_Bcast посылается сообщение, получив которое процессы завершают свою работу (код программы).
После подмены функций MPI_Init, MPI_Finalize, MPI_Bcast, MPI_Reduce, запуска
программ и визуализации полученных данных были получены следующие
результаты:
В mpich и LAM функция MPI_Bcast реализована через функции MPI_Send. Следовательно, можно утверждать, что сказанное выше относительно MPI_Bcast верно и для пары MPI_Send, MPI_Recv. Это видно из следующего теста: процессы параллельной программы передают по цепочке друг другу сообщение с помощью функций MPI_Send, MPI_Recv (код программы). Результат запуска программы представлен на следующем диаграмме. |