Все MPI-операции типа «точка-точка» осуществляются через сеть
трехмерного тора. При этом имеются две следующие стратегии
маршрутизирования пакетов.
- Маршрутизация по закрепленному маршруту (deterministic routing)
- Пакеты от отправителя к получателю всегда направляются по одному
и тому же пути. Преимущество этого подхода состоит в том, что
порядок пакетов всегда поддерживается без привлечения дополнительной
логики. Однако, такой механизм может привести к появлению
активных участков в сети (network hot spots),
если одновременно происходит несколько коммуникаций
типа «точка-точка», а их маршруты пересекаются
в некоем вычислительном узле.
- Адаптивная, или динамическая, маршрутизация (adaptive routing)
- Различные пакеты от отправителя к получателю посылаются по разным путям.
Конкретный маршрут определяется на этапе исполнения в зависимости
от текущей нагрузки сети. Подобный подход обеспечивает более
сбалансированную загрузку сети, но привносит задержку доставки данных
(latency penalty).
Выбор типа маршрутизации определяется протоколом коммуникации.
Реализация MPI на Blue Gene/P поддерживает три вида протоколов,
которые мы сейчас рассмотрим.
- Краткий протокол (MPI short protocol)
- Используется для коротких сообщений (менее 224 байт),
состоящих из единственного пакета. В этом случае всегда
используется маршрутизация по закрепленному маршруту.
- Жадный протокол (MPI eager protocol)
- Применяется для сообщений среднего размера. Отправитель
посылает сообщение без предварительной проверки
того, что принимающая сторона готова к его получению.
Протокол тоже использует маршрутизацию по закрепленному маршруту.
- Протокол с предварительной установкой контакта (MPI rendezvous protocol)
- Большие (более 1200 байт) сообщения посылаются с использованием
этого протокола. Сначала установливается соединения между
отправителем и получателем, и только после этого принимающая
сторона обращается к механизму прямого доступа к памяти
(direct memory access, DMA), чтобы забрать данные у посылающей.
Протокол использует динамическую маршрутизацию,
и оптимизирован для максимальной пропускной способности.
Понятно, что первоначальное установление связи приводит
к увеличению задержки доставки данных (latency).
Реализация библиотеки MPI на Blue Gene/P поддерживает переменную окружения
DCMF_EAGER, значение которой можно задать при обращении к
mpirun. Она устанавливает размер сообщения в байтах, при
превышении которого будет будет использован протокол с предварительной
установкой контакта.
Приведем самые общие руководящие принципы по выбору значения порога.
- Уменьшите значение порога выбора протокола
(т.е. rendezvous-протокол будет использован, начиная
с меньших значений размеров сообщений), если
- большое число маленьких сообщений перегружают сеть;
- жадные сообщения приводят к появлению искусственных активных участков сети
(artificial hot spots);
- программа не очень сильно зависит от задержки доставки данных
(latency-insensitive).
- Увеличьте значение порога выбора протокола
(т.е. rendezvous-протокол будет использован,
начиная с больших значений размеров сообщений), если
- большая часть взаимодействий происходит между соседними
или близкими в смысле манхэттенской метрики узлами;
- преимущественно используются длинные сообщения;
- для сообщений средних размеров необходимо минимизировать
интервал задержки доставки данных.
При программировании с использованием MPI необходимо придерживаться
следующих рекомендаций.
- Совмещайте коммуникации и вычисления, используя неблокирующие
вызовы MPI_Irecv() и MPI_Isend(),
что позволит устройству прямого доступа к памяти
(direct memory access, DMA) работать в фоновом режиме.
Замечание: сети коллективных операций
и барьеров не используют DMA-механизм, в этом случае
операции не могут быть выполнены в фоновом режиме.
- Избегайте дисбаланса нагрузки. Эта рекомендация применима
ко всем параллельным системам, но особенно актуальна для
Blue Gene/P, когда задача должна масштабироваться до
тысяч процессоров.
- Избегайте буферизованных MPI_Bsend()- и
синхронных MPI_Ssend()-посылок, так как
первая требует выделения дополнительной памяти, что замедляет приложение,
а вторая имеет нелокальную сементику завершения.
- Вызывайте функции инициации получения данных (MPI_Irecv())
как можно раньше, желательно до отправки сообщения.
Т.е. рекомендуется, чтобы к моменту обращения отправителем к
MPI_Isend() принимающая сторона уже была готова
принять сообщение.
- Избегайте векторных и непоследовательных типов данных.
Несмотря на то, что определяемые пользователем типы данных
позволяют в MPI элегантно организовать пересылку сложных структур данных,
как правило, это идет в ущерб эффективности.
Более того, MPI-реализация на Blue Gene/P использует
аппаратные инструкции сохранения и загрузки четверных слов,
и для оптимальной производительности данные должны
быть расположены в памяти последовательно и правильно выровнены.
Сеть трехмерного тора эффективна при коммуникациях
с соседями, а для операций типа «многие-к-одному»,
«один-ко-многим» и «многие-ко-многим» более
эффективно использовать специальную сеть, которая объединяет все
вычислительные узла в дерево, и где каждая compute-карта может служить его
корнем.
Реализация MPI использует именно эту сеть, а не сеть трехмерного тора, для
коллективных операций.
Текст составлен на основе материала 2-го издания книги
«IBM System Blue Gene Solution: Blue Gene/P Application Development»