Как измерить объем данных, передаваемых моей программой MPI? - PullRequest
2 голосов
/ 06 февраля 2011

Я экспериментирую с моим алгоритмом распределенной кластеризации (реализованным с помощью MPI) на 24 компьютерах, которые я настроил в качестве кластера с помощью BCCD (Bootable Cluster CD), который можно загрузить по адресу http://bccd.net/.

Я написал пакетную программу для запуска моего эксперимента, которая заключается в том, что мой алгоритм несколько раз менял количество узлов и размер входных данных.

Я хочу знать объем данных, используемых в коммуникациях MPI для каждогозапустить мой алгоритм, чтобы я мог видеть, как изменяется объем данных при изменении ранее упомянутых параметров.И я хочу сделать все это автоматически с помощью пакетной программы.

Кто-то сказал мне использовать tcpdump, но я обнаружил некоторые трудности в этом подходе.

Во-первых, я не знаю, какВызывайте tcpdump в моей пакетной программе (которая написана на C ++ с использованием системы команд для выполнения вызовов) перед каждым запуском моего алгоритма, поскольку tcpdump требует, чтобы другой терминал работал параллельно с моим приложением.И я не могу запустить tcpdump на другом компьютере, так как сеть использует коммутатор.Поэтому мне нужно запустить его на главном узле.

Во-вторых, я видел трафик с помощью tcpdump во время моего эксперимента и не мог понять, какой порт использовался MPI.Кажется, использовать много портов.Я хотел знать, что для фильтрации пакетов.

В-третьих, я попытался захватить целые пакеты и сохранить их в файл, используя tcpdump, и через несколько секунд файл был размером 3,5 МБ.Но весь мой эксперимент занимает 2 дня.Таким образом, конечный файл журнала будет огромным, если я последую этому подходу.

Идеальным подходом было бы собрать только поле размера в заголовке пакетов и суммировать его, чтобы получить общий объем передаваемых данных.Таким образом, файл журнала будет намного меньше, чем если бы я захватывал весь пакет.Но я не знаю, как это сделать.

Еще одно ограничение - у меня нет доступа к диску компьютера.Таким образом, у меня есть только RAM и мой 4 Гб USB-накопитель.Поэтому у меня не может быть огромных лог-файлов.

Я уже думал об использовании какого-либо инструмента трассировки или профилирования MPI, такого как упомянутые в http://www.open -mpi.org / faq /? Category = perftools .До сих пор я тестировал только Sun Performance Analyzer.Проблема в том, что я думаю, что будет трудно установить эти инструменты на BCCD и, возможно, даже невозможно.В дополнение к этому, этот инструмент заставит мой эксперимент закончиться дольше, так как он добавляет накладные расходы.Но если кто-то знаком с BCCD и считает, что использовать один из этих инструментов является хорошим выбором, пожалуйста, дайте мне знать.

Надеюсь, у кого-то есть решение.

1 Ответ

2 голосов
/ 06 февраля 2011

Реализации типа tcpdump не будут работать, если в любом случае есть многоядерные узлы, которые для связи используют память сегмента.

Использование чего-то вроде MPE - это почти наверняка путь. Эти инструменты добавляют очень мало накладных расходов, и некоторые накладные расходы всегда будут необходимы, если вы хотите считать сообщения. Вы можете использовать mpitrace для записи каждого вызова MPI и анализа полученного текстового файла самостоятельно. Кстати, обратите внимание, что MPE явно обсуждается на веб-сайте bccd . MPICH2 поставляется со встроенным MPE, но его можно скомпилировать для любой реализации. Я нашел только очень скромные накладные расходы для MPE.

IPM - еще один приятный инструмент для подсчета сообщений и размеров; вы должны иметь возможность либо анализировать вывод XML , либо использовать инструменты постобработки и просто вручную интегрировать графики (скажем, либо bytes_rx / bytes_tx по рангу, либо размер буфера сообщений / график количества ). Издержки для IPM даже меньше, чем для MPE, и в основном приходятся на завершение работы программы для файлового ввода-вывода.

Если вы действительно сильно беспокоитесь о накладных расходах при любом из этих подходов, вы всегда можете написать свои собственные обертки MPI, используя интерфейс профилирования , который обернет MPI_Send, MPI_Recv и т. Д., И просто посчитает # байтов отправлено и получено для каждого процесса, и в конце выдается только это общее количество.

...