如何在连接到多个连接时使用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)
其中为每个频道创建了id。 基本上,我的问题是如何将SRQ分配给属于具有不同保护域的不同Connection ID的不同QP,或者换句话说,不同的连接可以具有相同的保护域?
答案 0 :(得分:2)
单个SRQ或PD无法在多个进程之间共享。 SRQ的目的是减少单个进程有许多QP时需要发布的接收数量。在流程之间共享SRQ并不是真的有意义。将接收发布到SRQ时,缓冲区必须来自其中一个进程的地址空间。然后,如果对不同进程的QP的接收使用了该工作请求,则该进程将无法访问它已收到的数据(因为缓冲区属于不同的进程)。
您当然可以在一个进程中在多个线程之间共享SRQ和所有其他谓词数据结构。
可以在多个进程之间共享的唯一动词对象是XRC域(XRCD)。见ibv_open_xrcd()
等。
答案 1 :(得分:0)
最新版本的perftest应该有使用SRQ的示例代码:https://www.openfabrics.org/downloads/perftest/。
RDMAMojo还解释了如何创建使用SRQ的队列对:http://www.rdmamojo.com/2012/12/21/ibv_create_qp/。