【问题标题】:use atomic operations on the PCIe host/device shared memory?在 PCIe 主机/设备共享内存上使用原子操作?
【发布时间】:2022-01-12 17:51:31
【问题描述】:

一些 PCIe 设备(例如 FPGA 卡)可以通过主机的 BAR 公开其物理内存的段,并且主机可以通过内存设备访问内存区域(在 Linux 上,我们可以将设备内存映射到虚拟内存)。我想如果设备本身也运行 Linux,它也可以通过 /dev/mem 映射机制访问这部分内存。

程序可以对(虚拟)内存做的一件事是原子操作,例如“__atomic_sub_fetch”,这在编写高性能代码时可能非常有用。

我的问题是,如果内存来自上面的 PCIe 共享内存(并映射到用户的虚拟内存空间)怎么办?原子操作还成立吗? 考虑到原子操作可能同时来自主机和设备的 CPU,我不知道 PCIe 是否可以保证原子性。如果是,它的性能与常规内存上的相同原子操作相比如何?

我在这里看到了相关问题,而不是直接回答。 PCI Express BAR memory mapping basic understanding

非常感谢!

【问题讨论】:

    标签: c linux atomic shared-memory pci-e


    【解决方案1】:

    OP问题1:我的问题是如果内存来自上面的PCIe共享内存(并映射到用户的虚拟内存空间)怎么办?原子操作还成立吗?

    • 是的。 FPGA 和 CPU 主机软件都可以请求锁定以独占访问内存区域以执行 原子 操作。例如,OpenCL 共享虚拟内存 (SVM) 引入了细粒度的主机-设备同步,它允许主机和设备同时访问共享数据结构,并以原子的粒度进行同步。 strong> 加载/存储指令。这可以实现真正的并发 在存在共享数据结构的情况下,在软件线程和 FPGA 内核之间实现。

    • 话虽如此,通过原子加载/存储操作的并发内存访问的这种同步需要一种机制来确保 CPU 或 FPGA 硬件内核/加速器对共享数据的访问受到保护,不会受到另一方对同一位置的干扰访问,直到 访问已完成(访问的原子性)。

    • 此外,SO here 上的答案说 PCIe 3.0 确实支持某些“锁定事务”。

    • 此外,由于您的问题提到了 FPGA,让我们举一个具体的例子。您还可以了解7 Series FPGAs Integrated Block for PCI Express v3.3原子操作。它提到用于 PCI Express 的 7 系列 FPGA 集成块支持 PCI Express 基本规范 v2.1 中定义的发送和接收原子操作(原子操作)。该规范定义了三种 TLP 类型,允许在多个生产者和/或消费者之间进行高级同步机制。集成块将 atomic Ops TLP 视为非发布内存事务。三种 TLP 类型是:

      • FetchAdd
      • 交换
      • CAS(比较和设置)

    OP问题2:如果是,它的性能与常规内存上的相同原子操作相比如何?

    这取决于。重要因素之一也是数据的大小。例如,在某些应用程序中,如果数组大小较小,则相同的原子操作可以在常规内存系统上执行更好。另一方面,对于具有更大数组大小的 SVM,相同的原子操作可能更好。有时,在 SVM 实现与常规内存相同的运行时性能的情况下,也可以将其视为性能提升,因为 SVM 本身有开销。

    【讨论】:

    • 您所说的对于某些设备可能是正确的,但我不确定对于任何通用 PCIe 设备来说通常是正确的。见my answer
    【解决方案2】:

    我认为答案是“不”。

    __atomic_fetch_add 这样的原子操作(在x86 上)被实现为带有LOCK 前缀的指令。传统上,此前缀会通过断言其他物理 CPU 会尊重的LOCK# 信号来告诉 CPU“锁定”总线。现在,这种原子性全部由缓存一致性协议 (MESI) 处理,该协议规定了缓存层次结构的行为。

    What is processor Lock# signal and how it works?

    关键是这些 CPU 指令仅保护内存不受其他 CPU 影响

    因此,从在其他 CPU 内核上运行的软件的角度来看,您也许可以使用原子指令来提供原子性,但据我所知,PCIe 协议上没有可用的原子原语可以提供针对设备的原子性本身

    见: http://xillybus.com/tutorials/pci-express-tlp-pcie-primer-tutorial-guide-1


    编辑:实际上,我可能错了。 This answer 表示 PCIe 3.0 确实支持某些“锁定事务”。但我不确定 x86 CPU 是否会将针对内存映射 PCIe 地址的 lock inc 指令转换为 PCIe FetchAdd 指令。我很想在这里听到更多的见解。

    【讨论】:

      猜你喜欢
      • 2011-08-10
      • 1970-01-01
      • 2021-07-26
      • 2018-07-14
      • 1970-01-01
      • 2020-12-09
      • 1970-01-01
      • 2014-05-11
      • 2017-01-11
      相关资源
      最近更新 更多