【发布时间】:2019-12-03 21:01:24
【问题描述】:
内存和io带宽有什么区别,如何衡量?
我有这么多假设,请原谅这两个部分问题的冗长。
这些问题的灵感来自:What is the meaning of IB read, IB write, OB read and OB write. They came as output of Intel® PCM while monitoring PCIe bandwidth,Hadi 解释道:
DATA_REQ_OF_CPU 不用于测量内存带宽,而是用于测量 i/o 带宽。
我想知道 mem/io 带宽之间的差异是否类似于 DMA(直接内存寻址)和 MMIO(内存映射 io)之间的差异,或者两者的带宽是否都是 io 带宽?
我正在尝试使用这张图片来帮助可视化:
(希望我有这个权利)在 x86 中有两个地址空间:内存和 IO。 IO带宽是cpu(或dma控制器)到io设备之间的度量,然后内存带宽将在cpu和主内存之间吗?这两个场景中的所有数据都通过内存总线运行?为了清楚起见,我们都同意内存总线的定义是地址和数据总线的组合?如果是这样,图片的那部分可能会有点误导......
如果我们可以利用 pcm-iio 程序通过英特尔® 性能计数器监视器 (PCM) 测量 IO 带宽,我们将如何测量内存带宽?现在我想知道如果通过相同的电线运行它们为什么会有所不同?除非我只是把这一切都错了。很多这个测试代码的github页面有点压倒性:https://github.com/opcm/pcm
谢谢
【问题讨论】:
-
是的,内存带宽通常是 DRAM 本身或 CPU内存连接的理论最大值。 I/O 带宽通常是指特定的 I/O 设备,但您当然可以谈论将 CPU 连接到外部世界的所有 PCIe 链路上可能的聚合 I/O 带宽,例如来自多个视频卡、100G NIC 和/或 SSD。在现代 x86 上,内存控制器内置在 CPU 中,因此从 I/O 到 DRAM 的侧通道不会绕过 CPU。不过,DMA 会绕过任何特定的 CPU 内核。
-
图片若无误,则具有误导性。链接是:L3 -> Ring bus/Mesh -> (Home Agent ->) iMC for CPU => DRAM, PCI device -> PCIe bus -> System Agent -> Ring bus/Mesh -> (Home Agent ->) DRAM for DMA and L3 (假设Cache Agent是uncore外的统一路径,当然遍历这条路径时IO不会被缓存) -> Ring bus / Mesh -> System Agent -> PCIe bus -> PCI device for IO (内存和端口映射)。在 NUMA 架构中,必须扩展“环形总线/网格”段以包括套接字之间的最终 QPI/UPI 链接。
-
"在 x86 中有两个地址空间:内存和 IO"。是的,但不是通常描述的方式。有一个传统的“IO 地址空间”,由 64Ki 可单独寻址的 8 位“IO 端口”组成,并通过特殊 IO 指令 [IN,INS,OUT,OUTS] 独占访问。另一个地址空间是“物理地址空间”,它被细分以允许访问“常规”内存和不同地址范围内的“内存映射IO”。 (为了更容易混淆,在某些工程学科中,离开芯片的每个信号都被视为“IO”,包括 DRAM 访问。)
标签: io x86 performance-testing bandwidth bus