Как использовать SRQ с разными соединениями в libibverbs
Как использовать SRQ при подключении к нескольким соединениям. скажем, есть три соединения, а именно процесс 0, 1 и 2. для создания SRQ нам нужно вызвать
struct ibv_srq *ibv_create_srq(struct ibv_pd *pd, struct ibv_srq_init_attr *srq_init_attr);
для вышеупомянутого вызова нам нужно предоставить домен защиты, насколько мне известно, домен защиты выделяется отдельно для каждого соединения посредством вызова
ibv_alloc_pd(id->verbs)
в котором идентификатор создается для каждого канала. в основном, мой вопрос заключается в том, как назначить SRQ разным QP, принадлежащим разным идентификаторам соединений с разными доменами защиты, или, другими словами, разные соединения могут иметь один и тот же домен защиты?
2 ответа
Один SRQ или PD не может использоваться несколькими процессами. Смысл SRQ состоит в том, чтобы уменьшить количество приемов, которые необходимо опубликовать, когда один процесс имеет много QP. И разделение SRQ между процессами не имеет смысла. Когда вы отправляете получение в SRQ, буфер должен исходить из адресного пространства одного из процессов. Затем, если получатель в QP другого процесса использовал этот рабочий запрос, этот процесс не сможет получить доступ к данным, которые он получил (так как буфер принадлежит другому процессу).
Конечно, вы можете совместно использовать SRQ и все другие структуры данных глаголов между несколькими потоками в одном процессе.
Единственный объект глаголов, который может использоваться несколькими процессами, - это домен XRC (XRCD). Увидеть ibv_open_xrcd()
и т.п.
Последняя версия perftest должна иметь пример кода для использования SRQ: https://www.openfabrics.org/downloads/perftest/.
RDMAMojo также объясняет, как создавать пары очередей, использующие SRQ: http://www.rdmamojo.com/2012/12/21/ibv_create_qp/.