IB程序设计流程

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

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
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值