Все 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»