【问题标题】:In Infiniband, what mapping in PCIe-BAR, the internal buffer of Infiniband card or the remote computer's RAM?在 Infiniband 中,PCIe-BAR、Infiniband 卡的内部缓冲区或远程计算机的 RAM 中的映射是什么?
【发布时间】:2013-12-07 06:45:57
【问题描述】:

我们知道,Infiniband 允许 RDMA - 直接访问远程计算机的内存。

众所周知,PCI-Express(端点)设备,包括 PCIe 卡 Infiniband,能够以两种方式进行通信:

  • IO 端口(输入/输出) 已弃用
  • MMIO(BAR - 内存映射 IO:mov)

但是 BAR (MMIO) 中究竟显示了什么? (使用 PCIe 卡 Infiniband 时):

  • 自己的内部缓冲存储卡 Infiniband?
  • 远程计算机的 RAM 的一部分(目前正在使用 RDMA 复制数据的 RAM 部分)?

当我使用 Infiniband 时,PCIe-BAR、Infiniband 卡的内部缓冲区或远程计算机的 RAM 中的映射是什么?

【问题讨论】:

    标签: c memory-mapping pci-e infiniband rdma


    【解决方案1】:

    HCA 的 MMIO 空间的确切内容和使用将取决于供应商,也可能取决于卡。实现 RDMA 以使卡及其驱动程序设置直接对应于远程映射内存的 MMIO 区域似乎确实是一种简单的方法。但是,将 MMIO 区域视为一个与远程内存相同的区域仅在一定的抽象级别上才是正确的,可能在Infiniband verbs library (pdf) 层或更高层。

    在该级别之下,由主机 A 上的应用程序发布的 RDMA 写入遍历的协议栈将类似于:

    1. 在 A 上执行的代码会移动到 MMIO 地址。
    2. A 的 CPU 插槽上的内存管理硬件将地址识别为 PCIe MMIO 和 如果 HCA 插入适当的插槽,则将请求直接从 CPU 插槽发送到 PCIe,或者作为 DMI 数据包或类似的数据包发送到南桥,然后将 PCIe 转到 HCA。
    3. HCA 从 PCIe 数据包中解包 RDMA 有效负载,并执行它需要做的任何事情来处理将该信息发送到 Infiniband 结构。这很可能涉及在 HCA 本身的一些小内存中缓冲负载一小段时间,然后在 IB 数据包中发送 RDMA 请求。

    在遍历 IB 结构后,有效载荷在 B 上遵循大致相反的一系列步骤:

    1. B 的 HCA 接收 IB 数据包并解包有效负载。
    2. HCA 可能会在构建 PCIe 数据包时将有效负载缓冲一小段时间。
    3. PCIe 数据包在到达 B 的 DMA 控制器之前穿过 B 的主板,可能会一路转换为 DMI 或其他格式。
    4. B 的 DMA 控制器仲裁将有效负载写入固定用于此类 RDMA 事务的 B 系统内存区域。

    使 RDMA 比竞争技术更快的关键步骤是 B4。在发生任何 RDMA 读取或写入之前,B 上的 Infiniband 驱动程序和动词库会设置一个内存区域,以便 B 的 DMA 控制器能够安全地对其进行写入,而无需任何进一步的上下文切换或操作系统或驱动程序处理。这意味着除了有线传输增加了任何延迟(通常在微秒级)之外,接收端的处理给事务增加了非常少的延迟。此步骤和 A 上相应的 MMIO 映射也允许零拷贝传输,其中任何一方都不必在内核和用户空间之间复制感兴趣的内存,以在 HCA、驱动程序和应用程序之间进行中间处理。

    这是一个很好的链接,描述了如果您调用 IB 动词,它在软件级别上的外观:

    http://thegeekinthecorner.wordpress.com/2010/09/28/rdma-read-and-write-with-ib-verbs/

    【讨论】:

    • 非常感谢! 1. “但是,将 MMIO 区域视为一个与远程内存相同的区域仅在一定的抽象级别上是正确的,可能在 Infiniband 动词库 (pdf) 层或以上。” 即我可以使用简单的指令 MOV(汇编程序)写入映射到用户空间的 MMIO 区域,然后数据会传输到远程服务器,Infiniband 卡将使用 DMA 控制器将数据写入 RAM,或者我必须使用(必须)只有特殊说明ibv_post_send()?
    • 2. “1. 在 A 上执行的代码将 mov 移动到 MMIO 地址。” 是映射到所有远程内存的 MMIO,还是仅映射到 MMIO一小部分,还是只映射 Infiniband 卡的一小部分临时缓冲区?
    • 这两个问题的答案将取决于供应商,我敢打赌,他们都不会在比 ibv_post_send 更低的级别发布您需要的信息。在内部,ibv_post_send 或位于它下面的驱动程序调用可能正在执行类似一系列简单的汇编 MOV 到 MMIO 地址的操作。不过我不认为这是有保证的,根据我在其他硬件公司的经验,IB HCA 供应商可能更愿意不公布他们是如何做到的,以便他们有一定的灵活性来改变他们的驱动程序或卡的下一个版本工作。
    • 我可能错了,制造商没有公布他们的设备是如何工作的。您可以通过查看此处的 libibverbs 源代码找到您需要的内容:openfabrics.org/downloads/libibverbs,像 openfabrics.org/downloads/mlx4 这样的 OpenFabrics 驱动程序或infiniband.sourceforge.net 上的文档。祝你好运。
    【解决方案2】:

    PCI/PCIe 卡上的 BAR 必须在启动时由操作系统(或 BIOS)的 PnP 子系统初始化,因此它们应该在卡实际使用之前很久就指向可用内存。因此,该内存必须在卡内。然后 PCI 控制器使这些内存区域可用于 CPU 的地址空间。

    【讨论】:

    • 谢谢。但在运行时,我们可以通过 PCI-Express 配置空间更改 BAR(从/到 BAR 映射的地址)的转换。那我们能不能把远程RAM映射到本地物理地址空间呢?
    • 此外,我们已经能够在运行时热插拔或连接 Infiniband,也就是说,比系统启动晚得多。
    • 是的,热插拔允许启动后配置,但即便如此,在将设备添加到系统时必须填充 BAR,而这种情况发生在设备实际被进程用于连接的情况下到远程计算机并启动 RDMA。
    • 如果我已经很好地理解了 RDMA 的含义,并且如果它的工作方式与常规 DMA 相同,那么您不需要将远程内存用于您的地址空间。 RDMA 负责在没有 CPU 干预的情况下在两台计算机之间交换内存块(这是 DMA 控制器的作用)。您始终可以看到您的本地内存,如果您需要读取或写入远程内存,您可以通过发出 RDMA 请求来实现。
    • “RDMA 是什么意思,如果它的工作方式与常规 DMA 相同” - 但对于 DMA,我们需要映射内存(任何设备的示例映射内存:以太网,图形卡等...)。并且 DMA 控制器仅通过使用系统寻址(或在 x86 上相同 - 总线寻址)将数据从 CPU-RAM 复制到设备的映射缓冲区(GPU-RAM)。如果我们对每个 RDMA 数据包都使用临时复制到 Infiniband 卡的硬件缓冲区,那么它已经不是零复制了。
    猜你喜欢
    • 2018-11-20
    • 2017-02-04
    • 2014-08-09
    • 1970-01-01
    • 2016-04-26
    • 2014-02-15
    • 1970-01-01
    • 2011-08-28
    • 2018-05-28
    相关资源
    最近更新 更多