2011-02-06 4 views
2

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

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

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

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

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

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

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

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

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

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

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

ответ

2

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

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

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

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

+0

Спасибо за ваш ответ. Я проверю эти возможности. – cesarsalgado

+0

Интерфейс профилирования, вероятно, является самым прямым способом получения информации, которую вы ищете. Также возможно, что конкретная реализация MPI уже предоставляет отчет об общем объеме сообщений, которые обмениваются. –