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