内存和IO带宽之间有什么区别?我们如何测量它们?
内存和io带宽之间的区别是什么?您如何测量它们 我有这么多的假设,请原谅这两部分问题的冗长 这些问题的灵感来自:哈迪在哪里解释: CPU的数据请求不是用来测量内存带宽,而是用来测量i/o带宽 我想知道mem/io带宽之间的差异是否类似于DMA(直接内存寻址)和MMIO(内存映射io)之间的差异,或者两者的带宽是否都是io带宽 我试图用这张图片来帮助形象化:内存和IO带宽之间有什么区别?我们如何测量它们?,io,x86,performance-testing,bandwidth,bus,Io,X86,Performance Testing,Bandwidth,Bus,内存和io带宽之间的区别是什么?您如何测量它们 我有这么多的假设,请原谅这两部分问题的冗长 这些问题的灵感来自:哈迪在哪里解释: CPU的数据请求不是用来测量内存带宽,而是用来测量i/o带宽 我想知道mem/io带宽之间的差异是否类似于DMA(直接内存寻址)和MMIO(内存映射io)之间的差异,或者两者的带宽是否都是io带宽 我试图用这张图片来帮助形象化: (希望我有这个权利)在x86中有两个地址空间:内存和IO。IO带宽是cpu(或dma控制器)到IO设备之间的度量值,然后内存带宽是cpu和
(希望我有这个权利)在x86中有两个地址空间:内存和IO。IO带宽是cpu(或dma控制器)到IO设备之间的度量值,然后内存带宽是cpu和主内存之间的度量值吗?这两种情况下的所有数据都通过内存总线运行?为了清楚起见,我们都同意内存总线的定义是地址和数据总线的结合?如果是这样的话,那部分图像可能有点误导 如果我们可以使用“英特尔性能计数器监视器”(PCM)通过PCM iio程序测量IO带宽,我们将如何测量内存带宽?现在我想知道,如果通过相同的电线,为什么它们会不同?除非我把这一切都搞错了。很多测试代码的github页面有点让人不知所措:
谢谢CPU的
数据请求
事件无法用于测量内存带宽,原因如下:
- 并非来自IIO控制器的所有入站内存请求都由内存控制器提供服务,因为请求也可以由LLC(或在多个套接字的情况下由LLC)提供服务。但是,请注意,在不支持DDIO的英特尔处理器上,IO内存读取请求可能会导致推测性读取请求与LLC查找并行发送到内存
- CPU的
DATA\u REQ\u事件有许多子事件。pcm iio工具测量的入站内存指标不包括所有类型的内存请求。具体来说,它们不包括原子内存读写和IOMMU内存请求,这可能会消耗内存带宽
- 某些子事件统计非内存请求。例如,存在点对点请求(从一个IIO到另一个IIO)
- IO设备可能希望访问与所连接节点不同的NUMA节点上的内存。在这种情况下,它将消耗不同NUMA节点上的内存带宽
有关uncore性能事件的主要信息来源是英特尔uncore手册。在这些手册的介绍章节中,您会发现一些漂亮的数字,显示了处理器的不同单元是如何相互连接的。是的,对于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设备->PCIe总线->系统代理->Ring bus/Mesh->(Home Agent->)DRAM for DMA和L3(假设缓存代理是uncore外部的统一路径,当然在遍历此路径时不会缓存IO)->环形总线/Mesh->系统代理->PCIe总线->用于IO的PCI设备(内存和端口映射)。在NUMA体系结构中,“环总线/网格”段必须扩展,以包括套接字之间的最终QPI/UPI链路。“在x86中有两个地址空间:内存和IO”。是的,但不是以通常描述的方式。有一个传统的“IO地址空间”,由64Ki个单独可寻址的8位“IO端口”组成,并通过特殊的IO指令[输入、输入、输出、输出]专门访问。另一个地址空间是“物理地址空间”,它被细分为允许访问“常规”内存和不同地址范围内的“内存映射IO”。(为了使其更加混乱,在一些工程学科中,每个离开芯片的信号都被视为“IO”,包括DRAM访问。)