声明:
博主主页:王_嘻嘻的CSDN主页
未经作者允许,禁止转载
本专题部分内容源于《InfiniBand-network architecture》,侵权必删
本章将介绍IB协议中五种类型的消息传输请求,并对其中的RDMA read操作进行详细描述,还介绍了可以由QP的RQ逻辑发布和执行的单一类型的消息传输请求。
在IB网络中,一个消息的传输流程为
软件首先发布一个WR(Work Request)去请求SQ执行Verb,SQ执行对应逻辑,将数据传递至对端RQ;
此外,为了处理RDMA Read Request以及RDMA write with immediate类型的包,本地会准备一个RQ做对应的接收;
软件可以发布到SQ的WR操作类型有以下五类:
Send:从本地指定内存中获取数据,发送给对端RQ,对端RQ顶端的WR将指示RQ接收的数据该存到哪块内存中;
该操作支持所有QP服务类型;
RDMA Read:SQ发起读请求,对端RQ接收请求后,读取指定内存中数据并返回,SQ接收所需数据后,写入本地内存;
仅支持RC和RD;
RDMA Write:将本地数据写到对端指定内存中(RDMA write和Send的区别在于,Send前往对端的数据是由RQ顶端的WR来决定数据的存放位置,但是RDMA Write是由发送方提前将存放位置确定并指示RQ的);
仅支持RC,UC和RD;
Atomic RMW:当某任务需要连续访问同一块内存时,需要保证在这期间禁止别的任务对这一内存进行修改,在IBA中,使用一个状态标志,表示内存数据是否处于不可修改状态;
Memory Window Bind:之后专题会介绍;
IB协议中,上述的操作类型都可以通过报文头部中的BTH(Base Transport Header)的opcode项来标识,如上图:
immediate data:在RDMA write情况下,软件可以在payload最后额外添加immediate data一同传输,而这种操作类型完成后,需要立刻发布Event Queue,以此通知软件,这类特殊包已完成。
当SQ WR在包头中指示了带immediate data时,它将被放在RDMA write last的payload前,IB header后,但是和payload不同,immediate data不需要写入本地内存。
Send操作的流程在之前章节中已经详细描述:IB核心传输引擎Queue Pair
RDMA Write和Send类似,所以不再赘述,本章将描述RDMA Read的过程:
整体流程分为RDMA Read Request 和 RDMA Read Response两部分,前者为HCA向对端指定内存发起读请求,后者为对端CA验证请求合理后,将指定内存中的数据取出并组包,响应给HCA。
如上述步骤2,RDMA Read操作是,软件向SQ发布WR时,需要提供以下内容:
另外,在发出请求之后,请求者QP的SQ可以发出额外的RDMA读请求(或其他类型的消息传输请求),不需要等待之前请求的读数据返回。
但有一个例外:在RD服务类型中,SQ可能不会开始下一个消息传输,直到完全确认前一个消息传输。
如果响应端QP的RQ支持多个未完成的Atomic或RDMA Read操作,则它将接收到的每个请求按先进先出的顺序存储在特定队列中:
- 任何一次针对响应端QP的未完成RDMA读请求的最大数量在连接建立时协商;
- 响应端QP可以将一个连接限制为一个未完成的RDMA读请求,换句话说,这个队列的最小深度可能只有一个条目。
搜索关注我的公众号【IC墨鱼仔】,获取我的更多IC干货分享!