2

连接到多个连接时如何使用 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 分配给属于具有不同保护域的不同连接 ID 的不同 QP,或者换句话说,不同的连接可以具有相同的保护域?

4

2 回答 2

3

单个 SRQ 或 PD 不能在多个进程之间共享。SRQ 的目的是减少当单个进程有许多 QP 时需要发布的接收数量。在进程之间共享一个 SRQ 并没有什么意义。当您向 SRQ 发布接收时,缓冲区必须来自其中一个进程的地址空间。然后,如果不同进程的 QP 上的接收使用了该工作请求,则该进程将无法访问它接收到的数据(因为缓冲区属于不同的进程)。

您当然可以在单个进程中的多个线程之间共享 SRQ 和所有其他动词数据结构。

唯一可以在多个进程之间共享的动词对象是 XRC 域 (XRCD)。见ibv_open_xrcd()等。

于 2014-10-10T16:11:11.210 回答
0

最新版本的 perftest 应该有使用 SRQ 的示例代码:https ://www.openfabrics.org/downloads/perftest/ 。

RDMAMojo 还解释了如何创建使用 SRQ 的队列对:http ://www.rdmamojo.com/2012/12/21/ibv_create_qp/ 。

于 2014-09-10T23:14:32.030 回答