本文主要是介绍【infiniband】RDMA_CM使用多QP,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
要创建多个QP,可以简单地多次调用`rdma_create_qp`函数,使用相同的`p_ibv_pd`(保护域)但是不同的`rdma_cm_id`和`qp_attr`。不需要多个`p_ibv_pd`来创建多个QP(队列对)。保护域是一个本地资源,可以被多个QP共享。在Infiniband架构中,保护域主要用于资源的隔离和保护。它为多个QP提供了一个共享的上下文环境。
例如:
struct rdma_cm_id *pRdmaCmId1, *pRdmaCmId2; // 为每个QP创建一个RDMA CM标识符
struct ibv_qp_init_attr stQpAttr1, stQpAttr2; // 为每个QP提供各自的队列对初始化属性rdma_create_qp(pRdmaCmId1, p_ibv_pd, &stQpAttr1); // 创建第一个QP
rdma_create_qp(pRdmaCmId2, p_ibv_pd, &stQpAttr2); // 创建第二个QP
一个RDMA连接只能有一个QP,如果想建立多个QP,可能需要创建多个RDMA连接。
要创建多个RDMA(Remote Direct Memory Access)连接,不需要对应多个rdma_event_channel。可以在同一事件通道上创建多个RDMA CM标识符(rdma_cm_id)。每个rdma_cm_id代表一个RDMA连接,包含端点地址信息以及一些包含连接状态的其他信息。
以下代码示例在同一事件通道上创建两个RDMA连接:
struct rdma_event_channel *pstEC = NULL;
pstEC = rdma_create_event_channel();struct rdma_cm_id *pstRdmaCmId1 = NULL;
rdma_create_id(pstEC, &pstRdmaCmId1, NULL, RDMA_PS_IB);struct rdma_cm_id *pstRdmaCmId2 = NULL;
rdma_create_id(pstEC, &pstRdmaCmId2, NULL, RDMA_PS_IB);
在此示例中,pstRdmaCmId1和pstRdmaCmId2代表两个不同的RDMA连接,但它们共享同一个事件通道pstEC,以接收连接事件通知。
ibv_post_recv使用RDMA_CM创建的qp示例:
static void receive_remote(struct rdma_cm_id *id) {......ibv_post_recv(id->qp, &wr, &bad_wr); }
ibv_post_send使用RDMA_CM创建的qp示例:
static void write_remote(struct rdma_cm_id *id) {......ibv_post_send(id->qp, &wr, &bad_wr); }
这篇关于【infiniband】RDMA_CM使用多QP的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!