• 从零学习 InfiniBand-network架构(七) ——IB协议中数据如何传输


    从零学习 InfiniBand-network架构(七) —— IB协议中数据如何传输


    🔈声明:
    😃博主主页:王_嘻嘻的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:之后专题会介绍;

    Base Transport Header

    请添加图片描述

      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不需要写入本地内存


    RDMA Read操作

    Send操作的流程在之前章节中已经详细描述:IB核心传输引擎Queue Pair
    RDMA Write和Send类似,所以不再赘述,本章将描述RDMA Read的过程:

    1. 首先,CA在本地构建一个信息;
    2. 向SQ发布发送操作,CA通过软件向对端CA通知,本地信息已经可以读取,需要向HCA提供:
      • 本地内存的起始virtual memory address(VA);
      • Remote access key(R_Key),RDMA读权限;
      • 所需读取数据的大小;
    3. 软件关联的CA接收上述信息,并向HCA SQ发布WR;
    4. 执行SQ WQE,SQ会携带2中信息,组成RDMA read请求包;
    5. 对端RQ通过包中R_Key信息,验证该请求是否得到权限;
    6. 如果R_Key验证正确,RQ会从指定内存读取数据,并组成响应包返还给SQ;
    7. SQ收到响应包,并将payload写入内存;
    8. SQ完成全部传输后,创建一个CQE;

      整体流程分为RDMA Read Request 和 RDMA Read Response两部分,前者为HCA向对端指定内存发起读请求,后者为对端CA验证请求合理后,将指定内存中的数据取出并组包,响应给HCA

      如上述步骤2,RDMA Read操作是,软件向SQ发布WR时,需要提供以下内容:

    • QPN;
    • RDMA read操作类型;
    • Scatter buffer list的元素个数;
    • 目标QPN和Q_Key;
    • VA(虚拟地址);
    • R_Key;
    • 数据长度;

      另外,在发出请求之后,请求者QP的SQ可以发出额外的RDMA读请求(或其他类型的消息传输请求),不需要等待之前请求的读数据返回。
      但有一个例外:在RD服务类型中,SQ可能不会开始下一个消息传输,直到完全确认前一个消息传输。


      如果响应端QP的RQ支持多个未完成的Atomic或RDMA Read操作,则它将接收到的每个请求按先进先出的顺序存储在特定队列中:

    • 任何一次针对响应端QP的未完成RDMA读请求的最大数量在连接建立时协商
    • 响应端QP可以将一个连接限制为一个未完成的RDMA读请求,换句话说,这个队列的最小深度可能只有一个条目。




    搜索关注我的公众号【IC墨鱼仔】,获取我的更多IC干货分享!

  • 相关阅读:
    Gitlab 中 Github import 功能存在远程代码执行漏洞
    如何评价自己的研究工作是否有价值
    树状数组总结
    算法篇 滑动窗口 leetCode 无重复字符的最长子串
    【Java集合类面试三十】、BlockingQueue中有哪些方法,为什么这样设计?
    游戏思考20:前缀树用途、实现及优化
    Maxon Cinema 4D 2024:打造独一无二的视觉效果 模拟模块大更新
    c++day3
    Java SE 13 新增特性
    PAT 1024 Palindromic Number(高精度加法)
  • 原文地址:https://blog.csdn.net/sz_woshishazi/article/details/127396675