声明:
博主主页:王_嘻嘻的CSDN主页
未经作者允许,禁止转载
本专题部分内容源于《InfiniBand-network architecture》,侵权必删
本章将介绍IBA技术中最核心的信息传输引擎,队列的概念(QP,Queue Pair)、请求报文、响应报文、报文序列号(PSN),简单介绍QP服务类型和verb layer API,最后将描述一个详细的信息传输示例。
在每个CA中会实现若干QP,数量最多可达**16M(2^24)**QPs,之所以叫Queue pair,是因为每个QP由两个队列组成,发送队列(Send Queue)和接收队列(Receive Queue)。
SQ生成的每个请求包都包含一个PSN,收到请求数据包后,RQ将验证数据包是否与期望的PSN (ePSN)一致。
与之对应的,RQ生成的每个响应包都包含一个PSN,该PSN将它与从远端SQ接收到的请求包关联,SQ收到每个响应包时, 将验证包的PSN是否与之前发出的请求相关联。
在IBA中,主要根据信息的传播需求、场景不同,以及对信息重要性的不同,分为以下几种类型:
每种服务类型的具体区别与特点将在后续专题中进行介绍:占位符。
软件接口与HCA接口是非直接关联的,软件应用的调用称为verb layer。可以将verb layer想象成松散的API (可以看作函数调用),并由每个操作系统供应商以特定方式实现。对于每个verb,规范定义了:
verb layer可以通过访问HCA的硬件接口(例如寄存器组)来完成期望的动作,verb layer还有以下特性:
在使用QP进行发送或接收信息前,软件会先创建一个QP,并提供一些其在发送、接收过程中需要用到的特征。QP Context大致会包含以下内容(每个内容的具体含义暂不展开介绍):
本文以RC服务类型的QP举例,详细描述了QP是如何传输一个数据包的
假设QP已创建,且:
注意:这里只举例了报文第一包发送与响应过程,后续包的过程稍有不同,但整体类似。
SQ开始处理顶层条目,WQE指定一个多包发送操作,将5KB消息从HCA本地内存发送到对端CA的QP;
SQ检查QP Context中的PMTU来决定请求报文的最大数据大小,在本例中,SQ会选择前2KB数据作为第一个请求报文发送;
SQ在第一包的Opcode内容中填入Send first,向对端RQ表示,该包是第一发送包,并填入PSN=100,同时根据QP context内容设置目标QP;
注:RQ在接收到send last的报文前,都不知道报文的真实长度;
SQ将请求包转发到端口X进行传输时,向端口提供基本LID地址的偏移量,以替代包的SLID;
SQ将第一个请求包内的DLID设置为目标CA端口的QP的DLID,DLID来自QP Context;
SQ根据QP context内容设置服务等级(Service Level);
如果请求操作中存在全局ID,SQ需要在第一包中插入GRH(但在本例中不需要);
Send操作的第一个请求包被发送到网络层,然后转发到HCA端口(X)的链路层。此外,SQ还做以下工作:
a) 将nPSN从100更新到101,这是将在发送的下一个请求包中插入的PSN。
b) 等待收到“Send First”请求包的对应Ack包。
c) 形成下一个请求包发送到链路层进行传输。
当从网络层接收到第一个报文后,端口的链路层将:
a) 在端口的base LID上加入偏移,并将此LID插入在请求报文中的SLID中;
b) 如果目标CA和源CA不在同一子网下,会生成一个128-bits的SGID;
c) 在配置过程中,SM设置了端口的SLtoVLMappingTable属性表,将16个可能的SL值映射到特定的链路层传输缓冲区。SM还建立了一个仲裁方案,为每个传输缓冲区分配一个重要级别。定义了传输缓冲区以什么顺序将数据包传输到端口的物理层;
d) 请求包被发布到链路层选择的传输缓冲上;
e) 当该VL传输缓冲区进行报文传输时,端口的链路层将请求报文转发给端口的物理层进行传输。数据包的VL字段标识了各自的VL接收缓冲区,该缓冲区将在与该端口连接的物理链路的另一端接收数据包。
从X链路层端口流出的请求报文将根据serdes的规范,编码为10-bits的串行流;
请求包经过一个或多个链路,最后到达目标端口。每个交换机查找内部转发表,并根据包内的DLID确认向何处转发;
目标QP端口对从物理层收到的数据解串行化,恢复8-bits数据流,并传递给链路层;
链路层解析包内的DLID项,确定数据前往哪个端口,并将数据传输到数据包指示的VL接收缓冲区,紧接着,请求包转发至网络层,网络层根据DestQP项将数据传递到对应RQ;
RQ将请求包的PSN与ePSN比较,确定是否出现丢包(如果PSN为之前请求包范围内的PSN,代表是一个重复包,不需要响应其动作,但要回复ack);
RQ将检查包的opcode,确认是否需要WQE将报文写入CA Y的本地内存中。如果opcode是send或RDMA write,WQE则需要完成此动作。如果RQ当前没有发布WQE,则需要返回对端SQ一个RNR NAK包;
进一步确认opcode,本例中为send first,不能是send middle,send last;
RQ返回一个ack包,并使用顶端的WQE确认将payload写入本地内存何处;
Payload使用散列缓冲链表写入CA本地内存中,同时RQ向WQE更新下一包需要写入的内存地址;
最后,RQ更新期望PSN(ePSN=101);
当RQ成功接收send first包,返回ack包的过程如下:
RQ将ack包发送到网络层,然后转发至端口的链路层;
Ack包不包含payload,但是包含opcode和确认扩展传输头(AETH)字段,opcode表示这是一个Ack报文,AETH表示Ack报文的类型:positive Ack或negative Ack (Nak)。如果是Nak包,Nak的原因也会被指出;
Ack的目标QP会被写入QPN;
Ack包中的SL和请求包中的SL一致,SLID和DLID与请求包中相反;
CA Y的端口根据SL查表确定,Ack包需要发布到哪个VL传输缓存;
当该VL缓存区传输时,将Ack包从链路层传给对应的物理层;
和之前物理层的处理一样,数据将被串行化,通过传输介质后,由另一端的物理层解串;
对端链路层解析包中的DLID,确定该传输到哪个端口;
链路层将接收到的ack包放至对应的VL接收缓存区,进一步转发至网络层;
网络层将ack包发送给对应SQ,QP与上一步发送请求报文的QP一致;
SQ验证是否是ack包,检查PSN是否和send first包的PSN一致;
搜索关注公众号【IC墨鱼仔】,获取我的更多IC干货分享!