技术标签: RDMA
目录
原文:https://www.rdmamojo.com/2013/02/15/ibv_poll_cq/ (强烈建议去看原文)
ibv_poll_cq()从完成队列(CQ)轮询WC(工作完成),非阻塞函数。
[工作完成] 表示 WQ(工作队列)中的WR(工作请求) 以及与CQ相关联的所有已发布到该工作队列的未发出信号的WR(工作请求)均已完成。
(A Work Completion indicates that a Work Request in a Work Queue, and all of the outstanding unsignaled Work Requests that posted to that Work Queue, associated with the CQ are done.)
任何发送和接收请求 以及以错误结束的发送请求,将在处理结束后生成WC(工作完成)。
(Any Receive Requests, signaled Send Requests and Send Requests that ended with an error will generate a Work Completion after their processing end.)
当[工作请求]结束时,会将[工作完成]添加到与此工作队列相关联的CQ的尾部。 ibv_poll_cq()检查CQ中是否存在[工作完成],并按其输入顺序从CQ的顶部弹出(FIFO)。从CQ弹出[工作完成]后,无法将其返回给CQ。
应该以比产生WC更快的速度消费CQ中的WC,防止CQ队列溢出,如果发生CQ溢出,将触发异步事件IBV_EVENT_CQ_ERR,并且无法再使用CQ。
Name | Direction | Description |
---|---|---|
cq | in | 从ibv_create_cq()返回的CQ |
num_entries | in | 期望从CQ读取的WC数 |
wc | out | 从CQ读取的WC数num_entries的数组。(Array of size num_entries of the Work Completions that will be read from the CQ) |
结构ibv_wc描述了wc的属性。
struct ibv_wc {
uint64_t wr_id;
enum ibv_wc_status status;
enum ibv_wc_opcode opcode;
uint32_t vendor_err;
uint32_t byte_len;
uint32_t imm_data;
uint32_t qp_num;
uint32_t src_qp;
int wc_flags;
uint16_t pkey_index;
uint16_t slid;
uint8_t sl;
uint8_t dlid_path_bits;
};
这是struct ibv_wc的完整说明:
wr_id | 与WR对应关联的64 bit值 (The 64 bits value that was associated with the corresponding Work Request) |
status | Status of the operation. The value can be one of the following enumerated values and their numeric value: 操作状态。该值可以是下列枚举值及其数字值之一:
|
opcode | The operation that the corresponding Work Request performed. This value controls the way that data was sent, the direction of the data flow and the valid attributes in the Work Completion. The value can be one of the following enumerated values: 相应的工作请求执行的操作。此值控制数据的发送方式、数据流的方向以及“工作完成”中的有效属性。该值可以是下列枚举值之一:
|
vendor_err | 供应商特定的错误,如果completion 因错误而结束,则会提供更多信息。一旦WC以错误结束,该值向RDMA设备的供应商提供有关失败原因的提示。 |
byte_len | 传输的字节数。与incoming Send或 RDMA Write with immediate operations的接收队列有关。该值不包括立即数的长度(如果存在)。与RDMA读取和原子操作的“发送队列”相关。对于不与SRQ关联的UD QP的接收队列,或者对于与UD QP关联的SRQ,该值等于消息的有效负载加上为GRH保留的40个字节。传输的字节数是消息的有效负载加上为GRH保留的40个字节(无论是否存在GRH) (The number of bytes transferred. Relevant if the Receive Queue for incoming Send or RDMA Write with immediate operations. This value doesn't include the length of the immediate data, if such exists. Relevant in the Send Queue for RDMA Read and Atomic operations.For the Receive Queue of a UD QP that is not associated with an SRQ or for an SRQ that is associated with a UD QP this value equals to the payload of the message plus the 40 bytes reserved for the GRH.The number of bytes transferred is the payload of the message plus the 40 bytes reserved for the GRH, whether or not the GRH is present) |
imm_data | (可选)以网络顺序的SEND或RDMA WRITE操作码中的32 bit 数字,与有效载荷一起发送到远程端,并放置在[接收工作完]( Receive Work Completion)成中,而不是在远端内存缓冲区中。如果设置了IBV_WC_WITH_IMM,则此值有效 |
qp_num | 已完成的WR的本地QP的号码。与和SRQ相关的[接收工作完成](Receive Work Completions)相关. (Local QP number of completed WR. Relevant for Receive Work Completions that are associated with an SRQ) |
src_qp | Source QP number (remote QP number) of completed WR. Relevant for Receive Work Completions of a UD QP |
wc_flags | Flags of the Work Completion. It is either 0 or the bitwise OR of one or more of the following flags:
|
pkey_index | P_Key index. Relevant for GSI QPs |
slid | Source LID (the base LID that this message was sent from). Relevant for Receive Work Completions of a UD QP |
sl | Service Level (the SL LID that this message was sent with). Relevant for Receive Work Completions of a UD QP |
dlid_path_bits | Destination LID path bits. Relevant for Receive Work Completions of a UD QP (not applicable for multicast messages) |
以下测试(opcode & IBV_WC_RECV)将指示 来自接收队列的完成状态。(The following test (opcode & IBV_WC_RECV) will indicate that the status of a completion is from the Receive Queue.)
对于UD QP的[接收工作完成](receive Work Completions),无论是否设置了IBV_WC_GRH位,数据均从已发布的接收缓冲区的偏移量40开始。
并非所有wc属性始终有效。如果完成状态不是IBV_WC_SUCCESS,则仅以下属性有效:
Value | Description |
---|---|
正数 | 从CQ读取的WC数及其值在wc中返回。如果该值小于num_entries,则表示CQ中没有更多的工作完成。如果此值等于num_entries,则CQ中可能会有更多的工作完成 |
0 | CQ为空 |
负数 | 尝试从CQ读取WC(工作完成)时发生故障 |
从CQ轮询WC(工作完成)(在轮询模式下):
struct ibv_wc wc;
int num_comp;
do {
num_comp = ibv_poll_cq(cq, 1, &wc);
} while (num_comp == 0);
if (num_comp < 0) {
fprintf(stderr, "ibv_poll_cq() failed\n");
return -1;
}
/* verify the completion status */
if (wc.status != IBV_WC_SUCCESS) {
fprintf(stderr, "Failed status %s (%d) for wr_id %d\n",
ibv_wc_status_str(wc.status),
wc.status, (int)wc.wr_id);
return -1;
}
那工作完成(WC)到底是什么?
工作完成意味着相应的工作请求已结束,缓冲区可以(重新)用于读取,写入或释放。
ibv_poll_cq()是否引起上下文切换?
否。Work Completions的轮询根本不会导致上下文切换;它不会导致上下文切换。这就是为什么RDMA技术可以实现极低的延迟(低于1 usc)的原因。
Is there a limit to the number of Work Completions that can we polled when calling ibv_poll_cq()?
调用ibv_poll_cq()时可以轮询的[工作完成](Work Completions 数量是否有限制?
没有,你想读多少都行。
我调用了ibv_poll_cq(),它填充了我提供给它的所有数组。我能否知道CQ中还有多少工作完成?
不,你不能。
我从UD QP的接收队列中获得了工作完成(WC),并且进展顺利。我从内存缓冲区中读取了数据,但数据不正确。为什么?
也许您查看了数据的起始偏移量0。对于UD QP的任何工作完成,无论是否存在GRH,数据都将放置在相关内存缓冲区的偏移量40中。
什么是GRH,为什么我需要它?
全局路由头(GRH)提供的信息对于将消息发回给此消息的发件人(如果来自其他子网或来自多播组)最有用。
I've got completion with error status. Can I read all of the Work Completion fields?
否。如果“工作完成”状态表明存在错误,则仅以下属性有效:wr_id,status,qp_num和vendor_err。其余属性未定义。
我从CQ上Read了一个WC,但我不需要,我可以将其退还给CQ吗?
不,你不能。
我可以阅读属于特定工作队列的工作完成吗?(Can I read Work Completion that belongs to a specific Work Queue?)
不,你不能。
如果添加的工作完成(WC)数量超过CQ的size,将会发生什么情况?
CQ将超限,并且CQ(以及与之关联的所有QP)将进入错误状态。
文章浏览阅读376次。很多小伙伴都用过Lambda表达式和linq表达式,用起来也得心应手,但是有的小伙伴对匿名对象的查询与接收比较迷茫,(没有定义相应的实体),怎么在where()里面进行条件筛选呢?常规用法我就不说了,我们来说一下匿名对象怎么操作。我们先看一下Lambda表达式的形式:Lambda表达式说明x=>x*x返回参数值的平方x=>{r..._list>查询里面的数据并取值
文章浏览阅读3.9k次,点赞11次,收藏20次。操作系统考研真题进程在操作系统内核程序临界区不能进行调度与切换,在普通临界区能够调度与切换?什么是临界资源?什么是临界区_为什么访问普通临界区可以发生进程调度
文章浏览阅读5.6k次,点赞2次,收藏15次。[海思]–Hi3516a–GPIO(用户层)控制篇海思Hi3516aGPIO用户层控制篇gpio 玩过单片机的人都应该很熟悉了,然而在linux中,gpio操作属于内核层的范畴,用户想要直接配置gpio的模式和读取gpio的状态是比较困难的一件事情。那么本文主要讲述如何利用海思sdk已有的资源来实现用户层的gpio操作_海思sdk用户层控制gpio
文章浏览阅读185次。Jdk+Tomcat6+SQLSERVER数据库。开发家庭收支管理系统(大作业/毕业设计)开发环境: Windows操作系统。
文章浏览阅读658次。说明:很长时间了,一直用XShell,但是总是用鼠标操作,后来想用其他方式代替鼠标,一想肯定有快捷方式等,这里就先记下一遍有用的博文,转自:http://sundful.iteye.com/blog/704079XShell是一款Windows下非常优秀的远程连接Linux主机的工具,是我平常使用不可缺少的工具。今天没事看了下XShell的帮助,找到了一些很实用的技巧,分享给大家。复制和粘贴由于..._xshell查看json文件怎么跳转底部
文章浏览阅读3.8k次,点赞2次,收藏17次。深度优先搜索概念深度优先搜索和广度优先搜索一样,都是对图进行搜索的算法,目的也都是从起点开始搜索直到到达指定顶点(终点)。深度优先搜索会沿着一条路径不断往下搜索直到不能再继续为止,然后再折返,开始搜索下一条候补路径。具体而言步骤1A为起点,G为终点。一开始我们在起点A上。步骤2将可以从A直达的三个顶点B、C、D设为下一步的候补顶点。步骤3从候补顶点中选出一个顶点。优先选择最新成为候补的点,如果几个顶点同时成为候补,那么可以从中随意选择一个。步骤4此处B、C、D同时成为候补,所以_python深度优先搜索算法
文章浏览阅读1.2w次。3DES又称Triple DES,是DES加密算法的一种模式,它使用3条56位的密钥对数据进行三次加密。3DES(即Triple DES)是DES向AES过渡的加密算法(1999年,NIST将3-DES指定为过渡的加密标准),加密算法,其具体实现如下:设Ek()和Dk()代表DES算法的加密和解密过程,K代表DES算法使用的密钥,M代表明文,C代表密文,这样:3DES加密过程为:C_3des的加密过程为des加密-
文章浏览阅读2.2k次,点赞4次,收藏9次。今天,我想让您对下一个 25 个出色的开源软件。您可以安装它,并且几乎开箱即用!_开源软件
文章浏览阅读2k次。# 计算经过仿射变换新的boxes # boxes表示原始坐标点,target_point表示经过仿射变换后新的坐标点 pts = np.float32(boxes).reshape([-1, 2]) # 要映射的点 pts = np.hstack([pts, np.ones([len(pts), 1])]).T target_point = np.dot(RotateMatrix, pts) # 映射后的坐标 //src_point表示原图的坐标点,resu..._怎么通过变化矩阵求坐标
文章浏览阅读588次。麻雀算法优化BP神经网络SSA-BP温度预测完整的代码,方可运行;可提供运行操作视频!适合小白!_麻雀算法优化bp神经网络
文章浏览阅读453次。如题专区:PostgreSQL 与 MySQL 相比,优势何在?以下文章列举了更为直观的对比图:作者:动力节点在线链接:https://www.zhihu.com/question/20010554/answer/743955463来源:知乎著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。本文是转载文章。MySQL相对于PostgreSQL的劣势:PostgreSQL主要优势: 1. PostgreSQL完全免费,而且是.._pl/pgsql与sql语言相比,优势有哪些?
文章浏览阅读796次,点赞4次,收藏25次。在IDEA中搭建SSM框架:Maven项目搭建开发环境:JDK1.8、MySQL、Maven3.6开发工具:IDEA 2018.3.1一、搭建基于Maven的web项目1.创建新项目2.选择Maven,JDK,项目原型3.填写项目组织标识符、项目标识符4.配置Maven5.填写项目信息6.点击finish后,如果项目本地路径不存在,IDEA会提..._idea使用maven搭建ssm框架