• 使用Verbs API剖析一个小型ib应用程序


    2 Layers

    一个连接中涉及多个驱动程序,它们存在于内核和用户空间中。
    参见图2。简单地说,大部分连接设置工作都是通过内核驱动程序完成的,
    因为在这方面速度不是一个关键问题。用户空间驱动程序涉及ibv_post_send和ibv_post_recv等函数调用。 它们不经过内核空间,而是通过写入映射内存的一段直接与硬件交互。 避免内核陷阱是减少每个操作的总体延迟的一种方法。
    在这里插入图片描述

    3 Remote Direct Memory Access

    InfiniBand中的一个关键概念是远程直接内存访问(RDMA)。
    这允许一个节点直接访问子网上另一个节点的内存,而不涉及远程CPU或软件层。
    记住如图2b所示的直接内存访问(DMA)的关键概念。
    在DMA中,CPU发送一个命令到硬件开始DMA操作。当操作完成时,DMA硬件与CPU引发中断,表示完成。在InfiniBand中使用的RDMA概念类似于DMA,除了两个节点访问彼此的内存;一个节点是发送方,一个节点是接收方。图3演示了一个InfiniBand连接。在这种情况下,DMA硬件是主机通道适配器(HCA),两个HCA通过交换机相互连接。HCA是ib版的网卡;每个节点的本地硬件促进了通信。这允许一个节点上的HCA使用另一个HCA在远程节点上执行DMA操作。
    在这里插入图片描述

    4 Overview

    ibv_rc_pingpong程序执行以下操作。

    1. 从操作系统中为发送和接收数据预留内存
    2. 从verbs API分配资源
    3. 使用TCP套接字交换ib连接信息
    4. 创建两个ib端口之间的连接
    5. 通过连接传输数据
    6. 确认转移成功完成

    5 Data Transfer Modes

    InfiniBand规范规定了四种不同的连接类型:可靠连接(RC)、不可靠连接(UC)、可靠数据报(RD)、不可靠数据报(UD)。这个程序ibv_rc_pingpong使用了一个简单的RC模型。当前硬件不支持RD。
    可靠和不可靠之间的区别是可以预测的——在可靠的连接中,数据按顺序传输并保证到达。在不可靠的连接中,这两种保证都没有。
    连接类型是严格意义上两个主机之间的关联。在数据报中,主机可以自由地与子网中的任何其他主机通信。

    6 Queue Based Model

    ib硬件通过请求处理来自客户端软件的请求被放入队列中。要在节点之间发送消息,每个节点必须至少有一个三个队列:发送队列(SQ),接收队列(RQ)和完成队列(CQ)。
    在ibv_rc_pingpong程序中使用的可靠连接中,两个不同主机上的队列对会破坏端到端上下文。它们互相发送信息,而且只发送给对方。本文就局限于这种模式。
    队列本身存在于HCA上。然而,libibverb将返回给用户一个与QP相对应的数据结构。虽然库将创建QP,但用户将承担将QP与远程节点“连接”的责任。这通常是通过打开一个带外套接字连接,用标识号交换队列,然后用该信息更新硬件来实现的。
    最近,librdmacm(一个用于连接管理的OFED库)允许用户通过类似POSIX套接字的库调用来创建和连接qp。这些调用超出了本文的范围。

    6.1 Posting Work Requests to Queues

    为了在ib连接(端到端上下文)中发送和接收数据,工作请求,它们成为工作队列条目(WQE,发音为“wookie”)被发布到适当的队列中。这些工作请求指向分散/收集元素的列表(每个元素都有一个与之相关的地址和大小)。这是一种对内存中不连续的缓冲区进行写入和读取的方法。
    内存缓冲区必须注册到硬件;这个过程将在后面解释。在远程主机可以发送任何发送之前,必须将内存缓冲区发送到接收队列。ibv rc pingpong程序在执行开始时向接收队列发送大量缓冲区,然后根据需要重新填充队列。当远程主机发布发送操作时,将处理接收队列条目。
    当硬件处理工作请求时,在CQ上放置一个完成队列条目(CQE,预先声明的“cookie”)。有一个示例代码展示了如何在ibv_ack_cq_events(3)中处理完成事件。

    7 Connecting the Calls

    下表,ibv_rc_pingpong中用于创建连接的函数调用,以及调用它们的顺序。
    
    • 1

    在这里插入图片描述
    该表介绍了在创建连接过程中分配的资源。这些资源将在后面详细解释。
    rdma-core -> rc_pingpong.c
    翻译:https://blog.zhaw.ch/icclab/infiniband-an-introduction-simple-ib-verbs-program-with-rdma-write/

  • 相关阅读:
    【Netty 从成神到升仙系列 四】让我们一起探索 Netty 中的零拷贝
    谈谈什么是数据质量管理
    软件定制开发的步骤与注意事项|小程序搭建|APP定制
    记录一个iOS UITableView 正在刷新的时候修改数据源导致的崩溃
    linux 系统下文本编辑常用的命令
    如何写得一手优雅规范的SpringBoot 接口?
    微服务中「组件」集成
    aosp定制android系统
    在C#中使用NModbus4通信库执行【读】操作
    SGP.22-V.3.1-安全2
  • 原文地址:https://blog.csdn.net/qq_38158479/article/details/127453086