Модель подключения InfiniBand

Я не могу понять, какова модель "соединения" с InfiniBand?

В частности, я ищу для передачи RDMA. Конечной целью является запись в RDMA с помощью Immediate, но я начинаю с простого переноса в RDMA.

Если его сравнивают с IP-соединением, вы инициируете соединение, запускаете команды для этого соединения, а затем завершаете соединение.

Если его сравнивают с HTTP-запросом / ответом, вы выполняете автономный запрос, и все.

У каждого из них есть довольно разные API, но я не могу найти шаблоны для них в API.

Например, когда я создаю структуры, необходимые для передачи RDMA, я даю ему информацию об адресе и ключ vaddr/r удаленной памяти... но нигде не могу найти, где дать ему информацию об адресе целевого интерфейса хоста.

Почти каждый пример, который я видел, имеет ужасную коллекцию вызовов C и сложную структуру (OO, люди?), И, кроме того, они либо используют IBConnectionManager, либо используют сокеты для передачи другой информации, еще больше омрачая основу API. Кажется, никто не имеет четкого описания того, что действительно необходимо для выполнения RDMA-Write или RDMA-Write-With-Immediate.

Итак: как мне это сделать?

1 ответ

Infiniband, Mellanox и Open Fabrics Enterprise Distribution, OFED, поддерживают модели подключения, аналогичные TCP/IP и UDP/IP.

Существуют подключенные протоколы, такие как TCP/IP:

  • Надежное соединение, RC
  • Ненадежное соединение, UC, подключено, но надежность не гарантирована

Существует несвязанный протокол, например UDP:

  • Ненадежная датаграмма, UD

С помощью UD вы можете делать многие вещи, такие как UDP, включая широковещательную рассылку, многоадресную рассылку и запись каждого буфера на другой хост.

Чтобы выполнить удаленный прямой доступ к памяти, пишет RDMA, вы используете один из подключенных протоколов. Запись RDMA отличается от того, что обеспечивает TCP/IP, хотя многие люди используют RDMA over Ethernet через RDMA over Converged Ethernet, RoCE (произносится как Rocky), iWarp, Soft RoCE и другие. RDMA пишет, похоже, записывает непосредственно в память удаленного компьютера.

RDMA может записывать данные на удаленные хосты, графические процессоры, устройства хранения данных на высокой скорости, 100 или 200 Гбит на соединение, и вы можете комбинировать соединения. Они делают это без вмешательства ЦП на принимающей стороне.

API, глаголы в терминологии OFED, утомительны. Программа RDMA «Hello World» состоит примерно из 600 строк кода. Частично эта сложность связана с тем, что вы устанавливаете безопасность для записи непосредственно в ОЗУ на другом компьютере, и эта безопасность и управление памятью должны обеспечиваться совместно с операционной системой.

Общий эскиз каждой стороны:

  • Вы создаете домен защиты, PD, в который помещаете ресурсы.
  • Вы создаете области памяти, MR, для буферов, очереди и ресурсов.
  • Вы создаете очереди завершения, CQ (произносится как файлы cookie), чтобы получать выборочные уведомления о происходящих событиях, например: «Я получил буфер», «буфер отправлен» или «операция RDMA завершена».
  • Вы создаете пары очередей, QP. В подключенном протоколе RC или UC это ваш туннель на другую сторону.
  • Вы передаете QP через инициализацию, готовность к приему и, наконец, готовность к отправке.
  • Вы создаете записи рабочей очереди, WQE (произносится как Wookies), которые указывают буферы для передачи или места для размещения полученных данных для передач без RDMA.
  • Теперь вы можете отправлять и получать данные.

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

Когда я начал учиться писать код RDMA для Infiniband, я использовал этот сайт для написания своей первой программы Infiniband: введение...

И фантастический блог Дотана Барака под названием RDMAmojo. Вы найдете имя Дотана на многих страницах руководства по Infiniband Verbs в Linux.

Было предпринято несколько попыток упростить API-интерфейсы Verbs, как Infiniband Verbs, IBV, так и RDMA Verbs. До сих пор ни одна из них по-настоящему не прижилась.

Что касается того, куда поместить информацию об адресе интерфейса целевого хоста, вам каким-то образом придется обмениваться информацией между двумя конечными точками. Существует менеджер подключений Infiniband Verbs, ibv_cm, который, похоже, мало кто использует. Существует менеджер соединений RDMA, RDMA_CM, для поддержки которого опять же предстоит большая работа. Наконец, можно просто открыть сокет TCP/IP, часто с IP over Infiniband, IPoIB, и просто написать сообщение с данными вашего соединения и прочитать сообщение с данными соединения с другой стороны. Многие люди этим пользуются.

Другие вопросы по тегам