我想知道程序I / O与DMA的最大带宽是否有所不同。我的困惑来自以下
如果我们只有一个用于cpu,内存和I / O设备的总线,并且我们正在使用Programmed I / O,那么当我们读取内容时数据是否直接从I / O转移到内存,或者它先进入CPU然后记忆。这意味着如果我们每次传输可以传输10个字节,每次传输需要20毫秒,这是否意味着每秒编程I / O最大带宽是
10 * 20 * 10 ^ -9?
或者我是否需要考虑它首先进入CPU然后再进入CPU内存?
答案 0 :(得分:2)
PIO通常直接进入CPU。即使从内存到内存复制的CISC指令仍然需要在CPU管道上使用指令槽。与RAM读取相比,加载指令可能经历大的总线延迟。如果要复制大量数据,也要考虑循环指令,并且很容易理解为什么DMA更有效。
答案 1 :(得分:1)
如果您的系统布局与您在问题中建议的那样,并且CPU< - >北桥带宽是瓶颈,然后是可能你可以通过DMA比PIO更快地从极高带宽设备获取数据到RAM中。听起来似乎有可能发生在某些系统中,相对于CPU与外部世界的连接而言,设备非常快。
当然,现代x86系统甚至没有a Northbridge,因为内存控制器是片上的。这不会使有关计算机体系结构的问题无效,但它确实使其不那么重要。 IDK其他芯片(如ARM)倾向于做什么。但由于高度集成是常见的(包括SoC(片上系统)),如果单独的Northbridge从非x86世界中消失,我也不会感到惊讶。
PIO和DMA之间的区别主要不在于哪个可以实现最高带宽,而是会使系统速度降低更多。在整个复制期间,运行复制循环或多或少地完全占用CPU核心。在多核CPU之前,这是一个更大的交易。
复制循环也会污染缓存,但是通过特殊的缓存旁路指令可以避免这种情况。
在x86上,in
和out
编程的I / O指令无法正常管道。它们不是像CPUID
那样序列化,而是they do drain the store buffer,并且对乱序执行不是很友好。这是使用常规加载/存储操作的内存映射I / O优于PIO的in
/ out
的一个原因。例如只是写一个设备的IO寄存器来启动DMA传输,或者用于DMA不值得的小传输。