Skip to content

Latest commit

 

History

History
478 lines (374 loc) · 28.5 KB

rdma编程思想.md

File metadata and controls

478 lines (374 loc) · 28.5 KB

RDMA网络编程用户手册1.4版

###术语表

术语释义
Access Layer操作系统底层构架,用来支持访问互联的集群(VPI,InfiniBand,Ethernet,FCoE). 它包括所有支持上层网络协议的基本传输服务、中间件和管理程序
AH(Address Handle)在UD QP中,用来描述远程路径的对象
CA(Channel Adapter)一个InfiniBand链路的终端设备,它执行传输层的功能
CI(Channel Interface)通过网络适配器、相关固件和设备驱动的组合,呈现给Verbs 编程用户的通信管道
CM(Communication Manager)负责建立、维持、释放RC和UC QP服务类型连接的体系;服务ID解析协议 确保了使用UD服务的用户找到支持指定设备的QP;每个终端节点的IB端口都有一个CM.
Compare & Swap通知远程QP读取一个64bit的值,将这个值与提供的比较对象值作比较 ,如果相等,那么就把读取的这个值替换成QP提供的另一个数值。
CQ(Completion Queue)一个包含CQE的队列(先进选出)
CQE(Completion Queue Entry)CQ中的一个记录,它描述了已完成的WR的信息 (状态,大小等)
DMA(Direct Memory Access)允许硬件在不经CPU参与的情况下 将数据块移进和移出内存
Fetch & add通知远程QP读取一个64bit的数值,将它替换为它和QP提供 的待加数的和。
GUID(Globally Unique IDentifier)在一个子网中,唯一标志一个设备或组件的 64bit数字
GID(Global IDentifier)一个128位的标志,用来标志网络适配器上的一个端口, 路由器上或者组播里的一个端口;为了更有效地寻找、通信和路由,IBA在标准IPV6地址的基础上定义了一些额外的 特性和约束,这就形成了GID。
GRH(Global Routing Header)用来在子网间传递数据包和传递组播信息的包头。 包头基于IPv6协议
Network Adapter允许网络中计算机之间传递数据的硬件。
Host一台运行着操作系统,并且控制着一个或多个network adapter的计算机。
IBInfiniBand
Join operation一个IB端口要明确地加入一个多播组,必须向SA发送请求来接收 多播数据包。
lkey在MR注册之后接收到的一个数字,它在本地被WR用来标志内存注册和 相关权限。
LID(Local IDentifier) 子网管理程序指定给终端节点的一个16位地址。每个LID在它所在的子网中是唯一的。
LLE(Low Latency Ethernet) 在CEE(Converged Enhanced Ethernet聚合加强型以太网)基础之上的RDMA服务。CEE允许IB在以太网上传输。
NA(Network Adapter) 一个网络链接的终端设备,它执行传输层功能。
MGID(Multicast Group ID) MGID唯一标志一个IB多播组,它由SM管理。SM将每个MGID都关联一个MLID,并对网络中的IB交换机 进行编程控制,确保加入多播组的所有端口都能接收到数据包。
MR(Memory Region) 已被注册为被允许使用的连续内存缓冲区。为了使网络适配器能利用它们,这些缓冲区需要先被 注册。在注册期间,一个L_Key和R_Key被创建出来用来关联相应的注册缓冲区。
MTU(Maximum Transfer Unit) 端口收发数据包的最大有效负载的数据大小(不包括包头)限度。
MW(Memory Window) 一个被分配的资源,在与已注册的内存中一块特定的区域绑定后,能被远程直接使用。每个MW都有一个 关联的窗口句柄、一些使用权限信息和当前的R_Key
Outstanding Work Request 工作队列中没有被轮询到已完成的WR
pkey(Partition key) pkey标志了端口所属的分区。pkey大概类似于以太网中的VLAN ID。pkey用来指向端口的 pkey表中的一项。SM(subnet manager)将每个端口至少关联一个pkey
PD(Protection Domain) 只有内部成员才能进行交互的域。AH与QP进行交互,MR与WQ进行交互。
QP(Queue Pair) 为了在网络中节点之间传递数据,将独立的WQ打包在一起形成的一个配对 (发送队列和接收队列)。有三种类型的QP:UD 不可靠数据报,UC 不可靠连接,RC 可靠连接。
RC(Reliable Connection) 基于面向连连接的QP传输服务。一个QP与另一个QP相关联,两者之间的信息传输是可靠的 (具体体现在数据的正确性和顺序性)
RDMA(Remote Direct Memory Access) 在不需远程计算机CPU的干预下,对它的内存进行操作。
RDMA_CM(Remote Direct Memory Access Communication Manager) 用来建立可靠性连接和不可靠性数据报传输的API。它为建立连接提供了RDMA传输接口。 此API基于套接字,同时又适用于基于QP的语义:信息传递必须通过专门的RDMA设备, 并且数据传输是基于消息机制。
Requestor 在一个连接中,发起数据传输的一端(通过发送一个请求)
Responder 在一个连接中,回复发起者发送的请求命令的的一端。请求命令可能包括 对回复者内存进行读或写的请求,和要求回复者接收一条信息。
rkey 在MR注册之后接收到的一个数字,对到来的RDMA操作进行许可认证。
RNR(Receiver Not Ready) 在一个基于RC的QP中,两端的连接已经存在,但是RR目前不在接收端。
RQ(Receive Queue) 一个用来存储用户发送的RR的工作队列。
RR(Receive Request) 是一个会被发送到RQ中的WR。它描述了应该把到来的需要写的数据写在哪里。 需要注意的是,一个RDMA写操作会消耗一个RR。
RTR(Ready To Receive) 一种QP的状态,它表示某个RR可以被发送和处理。
RTS(Ready To Send) 一种QP的状态,它表示某个SR可以被发送和处理。
SA(Subnet Administrator) 用来查询和操作子网管理数据的接口。
SGE(Scatter/Gather Elements) 一个结构,指向本地已注册过的内存块的一部分或者整块。结构中的元素包含 内存块的起始地址、大小和lkey(和它相关的权限信息一起)。
S/G Array 在WR里,存放S/G元素的元组。根据使用的操作命令,可以将不同缓冲区的数据收集起来, 并将这些数据当成一个单独的数据流进行发送,或者将一个单独的数据流切分成许多不同的 缓冲区。
SM(Subnet Manager) 设置和管理子网的体系。它的功能包括:获知子网的网络拓扑结构,分配LID, 决定路由策略和设置路由表,一个主的SM或者还有一个从的SM(双机热备模式), 初始化子网中交换机的路由表从而在子网中建立网络通路。
SQ(Send Queue) 用来存储用户发送的SR的队列。
SR(Send Request) 是一个会被发送到SQ中的WR,描述了需要传输的数据有多大、数据的目标位置以及传输的方式 (具体的操作码会确定传输方式)。
SRQ(Share Receive Queue) 是一个保存着接收到的信息的WQE队列,接收到的信息可以来自于任何相关的RC/UC/UD QP. 多个QP可与同一个SRQ关联。
TCA(Target Channel Adapter) 一个不需要支持verb语法的通道适配器,通常用在I/O设备中。
UC(Unreliable Connection) 基于面向连接的QP传输服务,一个QP和另一个QP相联系。QP们没有执行可靠协议,传输过程中 信息可能丢失。
UD(Unreliable Connection) 一种QP传输服务,消息的以包为单位。每个UD QP能和子网中其它的UD QP进行数据的接收和发送。 消息在传递的过程中可能会丢失并且到达顺序可能会混乱。UD QP是唯一支持多播消息的模式。 UD数据包的大小受限于MTU
Verbs 网络适配器的功能的一种抽象描述。使用Verbs,任何应用都能创建和管理用于RDMA数据传输的 对象。
VPI(Virtual Protocol Interface) 允许用户能够改变端口的2层协议。
WQ(Work Queue) SQ或RQ中的一种。
WQE(Work Queue Element) 读音为"wookie",是WQ(工作队列)中的一个元素。
WR(Work Request) 用户提交至WQ(工作队列)的一个请求。

###1 RDMA体系结构概述 ####1.1 InfiniBand InfiniBand(IB)是一种服务器和存储器的互联技术,它具有高速、低延迟、低CPU负载、 高效率和可扩展的特性。InfiniBand的关键特性之一是它天然地支持远程直接内存访问(RDMA) 。InfiniBand能够让服务器和服务器之间、服务器和存储设备之间的数据传输不需要主机的CPU 的参与。InfiniBand使用I/O通道进行数据传输,每个I/O通道提供虚拟的NIC或HCA语义。InfiniBand 提供了多种技术方案,每个端口的速度从10Gb/s(SDR)至56Gb/s(FDR),使用铜轴电缆和光纤进行 连接。InfiniBand的高效率和可扩展性使它在很多领域成为最佳的性能和性价比的服务器内联方案, 这些领域包括:高性能计算、云计算、Web2.0应用、存储、数据库、金融数据中心和应用。InfiniBand 是IBTA组织制定的技术标准。

####1.2 虚拟协议互联(VPI) Mellanox的VPI架构为同时支持IB和Ethernet的网络提供了高性能、低延迟和高可靠性的保障。 VPI的作用体现在适配器和交换机这些设备之间的数据传输。一个VPI适配器可以在每个端口设置为 使用IB语义或者Ethernet语义的传输方式。例如,一个双端口的VPI适配器可以进行如下设置:

  • 一个适配器(HCA)配置两个IB端口;
  • 一个网卡(NIC)配置两个Ethernet端口;
  • 一个适配器同时配置一个IB端口和一个Ethernet端口。

类似地,一个VPI交换机可以配置为仅有IB的端口、仅有Ethernet的端口或者有IB端口和Ethernet 端口同时工作。
Mellanox支持的VPI适配器和交换机既支持IB的RDMA也支持Ethernet的RoCE方案。

####1.3 基于聚合以太网的RDMA RoCE是基于以太网(Ethernet)的RDMA的技术标准,它也是由IBTA组织制定的。RoCE为以太网 提供了RDMA语义,并且不需要复杂低效的TCP传输(例如,iWARP则需要)。

RoCE是现在最有效的以太网低延迟方案。它消耗很少的CPU负载,它在数据中心桥接以太网中利用 优先流控制来达到网络的无损连通。自从OFED1.5.1版本开始,Open Fabrics Software就已经对 RoCE有很好的支持。

####1.4 不同RDMA技术的比较 目前,有三种支持RDMA的技术:IB、以太网RoCE、以太网iWARP。这三种技术使用本文中定义的同 一API,但它们有着不同的物理层和链路层。

在以太网解决方案中,RoCE相对于iWARP来说有着明显的优势,这些优势体现在延时、吞吐率和 CPU负载。RoCE被很多主流的方案所支持,并且被包含在Windows服务软件中(IB也是)。

RDMA技术基于传统网络的概念,但与IP网络又有些不同。最关键的不同是RDMA提供了一种消息服务, 利用这种服务,应用程序可以直接访问远程计算机上的虚拟内存。消息服务可以用来进行网络中进程 的通信(IPC)、与远程服务器进行通信和在一些上层协议的协助下与存储设备进行数据传递。上层 协议(ULPs)有很多,例如:iSCSI的RDMA扩展(iSER)、SCSI RDMA协议(SRP)、SMB、Samba 、Lustre、ZFS等等。

RDMA利用旁路和零拷贝技术提供了低延迟的特性,同时,减少了CPU占用,减少了内存带宽瓶颈, 提供了很高的带宽利用率。RDMA所带来的关键好处得益于RDMA消息服务呈现给应用的方式,和底层用来 发送和传递这些消息的技术。RDMA提供了基于IO的通道。这种通道允许一个应用程序通过RDMA设备对 远程的虚拟内存进行直接的读写。

在传统的套接字网络中,应用程序要向操作系统申请使用网络资源时,要通过特定的API来管理程序的 相关行为。但是,RDMA使用操作系统仅仅建设一个通道,然后就可以在不需要操作系统的干预下,应用 程序之间就能够进行直接的消息传递。消息可以是RDMA读或写操作,也可以是发送/接收操作。IB和 RoCE也都支持多播模式。

IB在链路层提供的特性有:基于信任的流控制机制用来进行拥塞控制。它也支持使用虚拟局域网(VLs), 虚拟局域网能够使高层协议简单化,并且提供高质量服务。IB在VL中严格保证数据在一条路径中能够 按序到达。IB的传输层提供可靠性和交付性保障。

IB网络层拥有的特性使它能够很简单地在应用程序的虚拟内存之间传递消息,尽管应用参与通信 的应用程序运行在不同的物理服务器上。因此,将IB传输层和软件传输接口组合起来,可以看成是一 种RDMA消息传输服务。包括软件传输接口的整个协议栈,包含了IB消息服务。

最重要的一点是,每个应用程序都能直接访问集群中的设备的虚拟内存。这意味着,应用程序 传输消息时不需要向操作系统发出请求。与传统的网络环境相比,传统网络中共享的网络资源 归操作所有,不能由用户态程序直接使用,所以,一个应用程序必须在操作系统的干预下将数据 从应用程序的虚拟内存通过网络栈传送到网线上。类似地,在另一端,应用程序必须依靠操作 系统获取网线上的数据,并将数据放到虚拟缓冲区中。

TCP/IP/Ethernet是一种子面向字节流的传输方式 ,信息以字节的形式在套接字应用程序之间 传递。TCP/IP本身是不可靠的(传输过程中数据可能丢失或者失序),但是它利用传输控制协议 (TCP)来实现可靠性机制。TCP/IP在所有操作中都需要操作系统的干预,包括网络两终端结点 的缓冲区拷贝。在面向字节流的网络中,没有消息的边界概念。当一个应用想要发送一个数据包, 操作系统把这些字节数据放入内存中属于操作系统的一个匿名缓冲区,当数据传输完毕时,操作 系统把它缓冲区中的数据拷贝到应用程序的接收缓冲区。这个过程在每个包到达时都会重复执行, 直到整个字节流被接收到。TCP负责将任何因拥塞导致的丢包进行重发。

在IB中,一个完整的消息被直接发送到一个应用程序。一旦一个应用程序请求了RDMA的读或写传输, IB的硬件将需要传输的数据按照需要分割成一些数据包,这些数据包的大小取决于网络路径的最大 传输单元。这些数据包通过IB网络,被直接发送到接收程序的虚拟内存中,并在其中被组合为一个 完整的消息。当整个消息都到达时,接收程序会接收到提示。这样,发送程序和接收程序在直到整 个消息被发送到达接收程序的缓冲区之前都不会被打扰中断。

####1.5 主要构件

#####Host Channel Adapter HCA为一个IB终端节点(例如一个服务器)连接到IB网络中提供了连接点。这类似于以太网卡(NIC) ,但比NIC做更多的事情。HCA在操作系统的控制下提供了地址翻译机制,允许应用程序直接使用 HCA。相同地利用这种地址翻译机制,HCA能够在用户态程序下对内存进行使用。应用程序直接使用 虚拟地址进行操作,HCA能将这些虚拟地址翻译为物理地址,这样就实现了消息的有效传输。

#####Range Extenders IB将传输通路加入到WAN中,来实现范围的网络范围的扩展。同时,增加了足够的buffer credit (BBC)来确保在WAN上能够满带宽运行。

#####Subnet Manager IB子网管理器给每个连接到子网中的端口分配一个局部的ID(LID),并且基于这些LID,构建了一 个路由表。IB子网管理器是一个软件定义网络(SDN)的概念,SDN能够消除网络连接的复杂性,使 创建超大规模的计算和存储体系成为可能。

#####Switches IB交换机与标准的网络中的交换中在概念上是相似的,但它的设计是为了迎合IB的性能需求。IB交 换机在IB的链路层实施了流控制,一是为了防止数据包的丢失,二是为了支持拥塞控制和自适应路 由,同时也为了保证良好的服务质量。很多IB交换机都包含一个子网管理器。配置一个IB网络, 至少需要一个子网管理器。

####1.6对现有应用的支持和ULPs(Upper Layer Protocols 上层协议) 基于IP的应用可以在IB网络中运行,需要用到IP over IB(IPoIB)或者Ethernet over IB(EoIB)或者 RDS ULPs。存储型的应用可以利用iSER,SRP,RDS,NFS,ZFS,SMB等等。MPI和网络管理也是支持的ULPs, 但不在本文讨论范围之内。

####1.7参考条目

###2 RDMA编程思想概述 VPI架构允许在用户态下直接对硬件进行访问。Mellanox提供了一个动态链接库,通过verbs的API 对硬件进行访问。本文档包含verbs和与之相关的输出、输出、描述和被暴露在操作系统编程接口的 功能。

标注:此编程手册和它的verbs仅适用于用户态,如果想查看内核态的verbs,可以查看头文件。

使用verbs进行编程可以定制和优化支持RDMA的网络程序。这种定制和优化只有对VPI系统有着丰富 知识和经验的程序员才能胜任。

为了执行RDMA操作,首选需要建立与远程主机的连接和适当的认证。实现这些的机制是队列对(QP) 。与标准的IP协议栈类似,一个QP大概等同于一个套接字(socket)。QP需要在连接两端进行初始化。 连接管理器(CM)用来在QP建立之前进行QP信息的交换。

一旦一个QP建立起来,verbs API就可以用来执行RDMA读/写和原子操作。与套接字的读/写类似的连续 收/发操作也能执行。

####2.1 可以使用的传输操作 #####2.1.1 发送 / 带即时数的发送 发送操作允许你把数据发送到远程QP的接收队列里。接收端必须已经事先注册好了用来接收数据的缓冲 区。发送者无法控制数据在远程主机中的放置位置。

在特定设置下,一个4字节的即时数可以和数据缓冲一起被传送。这个即时数发送到接收端是作为接收 的通知,不包含在数据缓冲之中。

#####2.1.2 接收 这是与发送操作想对应的操作。接收主机被告知接收到数据缓冲,还可能附带一个即时数。接收端应用 程序负责接收缓冲区的维护和注册。

#####2.1.3 RDMA读 从远程主机读取部分内存。调用者指定远程虚拟地址,像本地内存地址一样用来拷贝。在执行RDMA操作 之前,远程主机必须提供适当的权限来访问它的内存。一旦权限设置完成,RDMA读操作就可以在对远程 主机没有任何通知的条件下执行。不管是RDMA读还是RDMA写,远程主机都不会意识到操作正在执行 (除了权限和相关资源的准备操作)。

#####2.1.4 RDMA写 / 带即时数的RDMA写 与RDMA读类似,只是数据写到远程主机中。RDMA写操作在执行时不通知远程主机。然而,带即时数的 RDMA写操作会将即时数通知给远程主机。

#####2.1.5 原子取和加 / 原子比较和交换 这些是RDMA操作的原子操作扩展。

原子取和加操作原子性地将特定虚拟地址中的数加上特定的值。被加之前的数返回给调用者。

原子比较和交换操作原子性地将特定虚拟地址中的数与另一个特定的数加比,如果它们相等,那么另 一个特定的数将会被存在上述的特定虚拟地址中。

####2.2 传输模式 在建立一个QP的时候,有几种不同的传输模式可供选择。每种模式中可用的操作如下表所示。 RD操作在此API中不支持。

#####2.2.1 可靠连接(RC) 一个QP只和一个另外的QP相连。

消息通过一个QP的发送队列可靠地传输到另一个QP的接收队列。

数据包按序交付。

RC连接很类似于TCP连接。

#####2.2.2 不可靠连接(UC) 一个QP只和一个另外的QP相连。

连接是不可靠的,所以数据包有可能会丢失。

传输层不会出错的消息进行重传,错误处理必须由高层的协议来进行。

#####2.2.3 不可靠数据报(UD) 一个QP可以和其它任意的UD QP进行数据传输和单包数据的接收。

不保证按序性和交付性。交付的数据包可能被接收端丢弃。支持多播消息(一对多)。

UD连接很类似于UDP连接。

####2.3 关键概念 #####2.3.1 发送请求(SR) SR定义了数据的发送量、从哪里、发送方式、是否通过RDMA、到哪里。 结构 ibv_send_wr 用来描述SR。

#####2.3.2 接收请求(RR) RR定义用来放置通过非RDMA操作接收到的数据的缓冲区。如没有定义缓冲区,并且有个传输者 尝试执行一个发送操作或者一个带即时数的RDMA写操作,那么接收者将会发出接收未就绪 的错误(RNR)。结构 ibv_recv_wr 用来描述RR。

#####2.3.3 完成队列(CQ) 完成队列包含了发送到工作队列(WQ)中已完成的工作请求(WR)。每次完成表示一个特定的 WR执行完毕(包括成功完成的WR和不成功完成的WR)。

完成队列是一个用来告知应用程序已结束的工作请求的信息(状态、操作码、大小、来源)的机制。

CQ有n个完成队列实体(CQE)。CQE的数量在CQ创建的时候被指定。

当一个CQP被轮询到,它就从CQ中被删除。

CQ是一个CQE的先进选出(FIFO)队列。

CQ能服务于发送队列、接收队列或者同时服务于这两种队列。

多个不同QP中的工作请求(WQ)可联系到同一个CQ上。

结构 ibv_cq 用来描述CQ。

#####2.3.4 内存注册(MR) 内存注册机制允许应用程序申请一些连续的虚拟内存空间或者连续的物理内存空间,将这些内存 空间提供给网络适配器作为虚拟的连续缓冲区,缓冲区使用虚拟地址。

内存注册进程锁定了内存页。(为了防止页被替换出去,同时保持物理和虚拟内存的映射)

在注册期间,操作系统检查被注册块的许可。

注册进程将虚拟地址与物理地址的映射表写入网络适配器。

在注册内存时,对应内存区域的权限会被设定。权限包括本地写、远程读、远程写、原子操作、绑定。

每个内存注册(MR)有一个远程的和一个本地的标志(r_key,l_key)。本地标志被本地的HCA 用来访问本地内存,例如在接收数据操作的期间。远程标志提供给远程HCA用来在RDMA操作期间 允许远程进程访问本地的系统内存。

同一内存缓冲区可以被多次注册(甚至设置不同的操作权限),并且每次注册都会生成不同的标志。

结构 ibv_mr 用来描述内存注册。

#####2.3.5 内存窗口(MW) 内存窗口使应用程序对来自远程的对本地的内存访问有更灵活的控制。内存窗口(MW)作用于以下 应用场景:

  • 想动态地授予和收回已注册缓冲区的远程访问权限,这种方式相比较与将缓冲区取消注册之后 再注册或者重注册,有些更低的性能损耗代价。
  • 想为不同的远程代理授予不同的远程访问权限,或者在一个已注册的缓冲区中的不同范围内授予 那些权限。

内存窗口和内存注册之前的关联操作称为绑定。

不同的MW可以作用于同一个MR(即使有着不同的访问权限)。

#####2.3.6 地址向量(Address Vector) 地址向量用来描述本地节点到远程节点的路由。

在每个UC/RC的QP中,都有一个地址向量存在于QP的上下文中。

在UD的QP中,每个提交的发送请求(SR)中都应该定义地址向量。

结构 ibv_ah 用来描述地址向量。

#####2.3.7 全局路由头部(GRH) GRH用于子网之间的路由。当用到RoCE时,GRH用于子网内部的路由,并用是强制要使用的。强制使用 GRH是为了保证应用程序即支持IB又支持RoCE。

当全局路由用在基于UD的QP时,在接收缓冲区的前40字节会包含有一个GRH。这个区域是专门用来存储 全局路由信息的,为了回应接收到的数据包,会产生出一个合适的地址向量。如果GRH用在UD中, 接收请求(RR)应该总是有额外的40字节用来存储GRH。

结构 ibv_grh 用来描述GRH。

#####2.3.8 保护域(PD) 一种集合,它的内部元素只能与集合内部的其它元素相互作用。这些元素可以是AH,QP,MR和SRQ。

保护域用来队列对(QP)与内存注册和内存窗口想关联,这是一种授权和管理网络适配器对主机系统 内存的访问。

PD也用来将基于不可靠数据报(UD)的QP关联到地址处理(AH),这是一种对UD目的端的访问控制。

结构 ibv_pd 用来描述保护域。

#####2.3.9 异步事件 网络适配器可能会发送异步事件来通知子网管理器(SW)系统中发生的事件。

有两种异步事件: **附属事件:**在私有对象(CQ,QP,SRQ)中发生的事件。这些事件会被发送到特定的进程。 **非附属事件:**在全局对象(网络适配器,端口错误)中发生的事件。这些事件会被发送到所有进程 。

#####2.3.10 分散聚合(Scatter Gather) 用分散聚合元素来分散和聚合数据。这些元素包括:

地址:本地数据缓冲区的地址,缓冲区是数据聚合的终点或者是数据分散的源头。 大小:数据的大小会写到这个地址或者从这个地址读取。 L_key:注册到这个缓冲区的MR的本地标志。 结构 ibv_sge 用来描述分散聚合元素。

#####2.3.11 轮询(Polling) 轮询CQ中的完成信息是为了获取已提交的WR(发送或者接收)的详细信息。

如果我们在WR中发现一个异常状态的完成,接下来的完成都会异常(同时WQ会被移至错误状态)。

每个没有完成(被轮询到)的WR都属于待处理状态。

只有在WR完成之后,发送/接收缓冲区才可能被使用/再使用/释放。

应该经常检测完成状态。

当一个CQE被轮询,那么它就被从CQ中移除。

轮询通过 ibv_poll_cq 操作来实现。

####2.4 典型应用 本文档提供了两个程序代码的示例:

  • 第一份代码,RDMA_CM_example,使用了VPI verbs API,演示了如何实现可靠性连接(RC): 发送,接收,RDMA读,和RDMA写等操作。
  • 第二份代码,多播示例,使用了RDMA_CM verbs API,演示了多播的不可靠数据报(UD).

一个典型应用程序的结构如下所示。在程序示例中功能的每步实现用粗体字显示。

1.获取设备列表;

首先,你必须检索得到本机的可用IB设备列表。列表中的每个设备都包含一个名字和GUID。 例如设备名字可以是:mthca0,mlx4_1。

示例程序中的实现在 7.1.4 resources_create.

2.打开要请求的设备;

遍历设备列表,通过设备的GUID或者名字选择它并且打开它。

示例程序中的实现在 7.1.4 resources_create.

3.查询设备的工作能力;

设备的工作能力能使用户了解已打开设备支持的特性(APM,SRQ)和能力。

示例程序中的实现在 7.1.4 resources_create. https://www.bbsmax.com/A/GBJrNrDBJ0/