Как использовать 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/.

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