InfiniBand: скорость передачи зависит от частоты MPI_Test*

Я пишу многопоточное приложение OpenMPI, используя MPI_Isend и MPI_Irecv из нескольких потоков для обмена сотнями сообщений в секунду между рангами через InfiniBand RDMA.

Передача составляет порядка 400–800 КБ, генерируя около 9 Гбит/с для каждого ранга, что вполне соответствует пропускной способности FDR. Простые тесты MPI также показывают хорошую производительность.

Завершение передачи проверяется путем опроса всех активных передач с использованием MPI_Testsome в выделенном потоке.

Достигаемая мной скорость передачи зависит от скорости передачи сообщений, но, что более важно, от частоты опроса MPI_Testsome. То есть, если я опрашиваю, скажем, каждые 10 мс, запросы заканчиваются позже, чем если я опрашиваю каждую 1 мс.

Я ожидаю, что если я буду опрашивать каждые 10 мс вместо каждой 1 мс, я буду проинформирован о завершенных запросах максимум через 9 мс. Я не ожидал, что сами передачи будут задерживать завершение из-за меньшего количества вызовов MPI_Testsome и, таким образом, замедлять общую скорость передачи. Я ожидаю, что MPI_Testsome будет полностью пассивным.

Кто-нибудь здесь знает, почему такое поведение может произойти?


person Jan David Mol    schedule 26.02.2014    source источник


Ответы (1)


Наблюдаемое поведение связано с тем, как реализована последовательность операций в Open MPI. Публикация отправки или получения, независимо от того, выполняется ли она синхронно или асинхронно, приводит к тому, что ряд внутренних операций ставится в очередь. Прогрессия — это в основном обработка этих операций в очереди. Есть два режима, которые вы можете выбрать во время сборки библиотеки: один с асинхронным потоком прогрессии и один без него, причем последний используется по умолчанию.

Когда библиотека скомпилирована с включенным потоком асинхронного выполнения, фоновый поток заботится об очереди и обрабатывает ее. Это позволяет запускать фоновые передачи параллельно с кодом пользователя, но увеличивает задержку. Без асинхронного прогресса операции выполняются быстрее, но прогресс может происходить только тогда, когда пользовательский код вызывает библиотеку MPI, например. находясь в MPI_Wait или MPI_Test и семье. Семейство MPI_Test функций реализовано таким образом, чтобы возвращаться как можно быстрее. Это означает, что библиотека должна балансировать между выполнением действий в вызове, что замедляет его, или быстрым возвратом, что означает, что при каждом вызове выполняется меньше операций.

Некоторые разработчики Open MPI, особенно Джефф Сквайрс, время от времени посещают Stack Overflow. Возможно, он мог бы предоставить более подробную информацию.

Такое поведение вряд ли характерно для Open MPI. Если не используется сильно аппаратная поддержка, MPI обычно реализуется теми же методами.

person Hristo Iliev    schedule 26.02.2014
comment
Спасибо! Я не понимал, что асинхронная прогрессия не используется по умолчанию. Однако у меня работает «btl_openib_async_event_thread» (согласно gdb). Также установлена ​​опция btl_openib_use_async_event_thread. Я начну с перестройки OpenMPI, чтобы посмотреть, смогу ли я более точно контролировать этот аспект. - person Jan David Mol; 26.02.2014
comment
Этот openib асинхронный поток не является асинхронным потоком, о котором я упоминал. Он считывает уведомления из очередей завершения InfiniBand, возможно, обновляя состояние ожидающих событий в очереди выполнения. - person Hristo Iliev; 26.02.2014