IB程序设计流程
以ibv_ud_pingpong为例
文章目录
1. 声明控制结构体
1.1全局结构体
struct pingpong_context {
struct ibv_context *context; //ibv设备上下文
struct ibv_comp_channel *channel; //event事件通道
struct ibv_pd *pd; //保护域
struct ibv_mr *mr; //内存注册
struct ibv_cq *cq; //完成队列
struct ibv_qp *qp; //QP任务队列
struct ibv_ah *ah; //address handler
void *buf; //缓存地址
int size; // 数据大小
int rx_depth; //接收队列中未完成任务的最大数量
int pending; //?
struct ibv_port_attr portinfo; //端口信息
};
1.2目标地址结构体
struct pingpong_dest {
int lid; //目标lid
int qpn; //目标qp序号
int psn; //?
union ibv_gid gid; //?
};
2. 主函数执行流程
2.1准备工作
声明变量
获取参数
2.2 正式工作
2.2.1 获取设备
获取设备列表 dev_list = ibv_get_deivce_list(NULL)
获取指定设备 ib_dev = dev_list[i]
- 也可以通过
ibv_get_device_name(dev_list[i])获取指定设备名称,与给定名称进行比较,获取指定名称设备
2.2.2 初始化全局结构体(核心)----pp_init_ctx
static struct pingpong_context *pp_init_ctx(struct ibv_device *ib_dev, int size,
int rx_depth, int port,
int use_event)
初始化结构体
struct pingpong_context *ctx;
ctx = malloc(sizeof *ctx); //为结构体开辟空间
初始化用户指定参数
ctx->size = size;
ctx->rx_depth = rx_depth;
初始化缓存
ctx->buf = memalign(page_size, size + 40); //分配指定大小内存作为缓冲区
if (!ctx->buf) {
fprintf(stderr, "Couldn't allocate work buf.\n");
goto clean_ctx;
}
/* FIXME memset(ctx->buf, 0, size + 40); */
memset(ctx->buf, 0x7b, size + 40); //将缓存区域size+40范围内都设置为0x7b
初始化设备
ctx->context = ibv_open_device(ib_dev);
if (!ctx->context) {
fprintf(stderr, "Couldn't get context for %s\n",
ibv_get_device_name(ib_dev));
goto clean_buffer;
}
初始化事件通道
if (use_event) {
ctx->channel = ibv_create_comp_channel(ctx->context);
if (!ctx->channel) {
fprintf(stderr, "Couldn't create completion channel\n");
goto clean_device;
}
} else
ctx->channel = NULL;
初始化保护域(protection domain)
/*
* QP,AH,MR和SRQ等组件通常只能和与自己同类的组件进行交互,而保护域就是负责进行不同类的组件之间的交互。
* PD可以将QP和MR以及MW进行绑定,以此使得网卡可以访问主机内存,并对这一过程进行控制
* PD还能再UD传输中将QP与AH进行绑定,以此控制对于UD传输目标的访问。
*/
ctx->pd = ibv_alloc_pd(ctx->context);
if (!ctx->pd) {
fprintf(stderr, "Couldn't allocate PD\n");
goto clean_comp_channel;
}
向保护域中注册缓存区
ctx->mr = ibv_reg_mr(ctx

本文详细介绍了InfiniBand(IB)编程流程,从获取设备、初始化全局结构体到建立连接,涵盖QP状态转换、接收和发送队列的设置,以及事件通知和完成队列的轮询。主要涉及关键概念如保护域(PD)、内存注册(MR)、完成队列(CQ)、队列对(QP)和地址处理(AH)。
最低0.47元/天 解锁文章
421





