突发模式DMA如何加速主存储器和I / O设备之间的数据传输?

时间:2016-06-24 15:25:58

标签: dma

根据维基百科,有三种DMA模式,即突发模式,循环窃取模式和透明模式。 在突发模式下,dma控制器将接管总线的控制。传输完成之前,将暂停需要总线的CPU任务。但是,在每个指令周期中,获取周期必须引用主存储器。因此,在传输过程中,CPU将处于空闲状态,在中断驱动的IO下,与传输工作占用的工作基本相同。 据我所知,循环窃取模式基本相同。唯一的区别是,在这些模式下,CPU在两个连续周期中使用一个,而不是在半身模式下完全空闲。 突发模式DMA是否通过跳过使用中断驱动的I / O所需的获取和解码周期而产生差异,从而在每个时钟周期而不是一个指令周期完成一次传输,从而加快了进程的速度?

非常感谢!

2 个答案:

答案 0 :(得分:1)

  

突发模式DMA如何加速主存储器和I / O设备之间的数据传输?

你声称没有"加速" ,也没有任何"加速" 通常是必要/可能的。数据传输不会比源或目标的较慢速度快。

DMA控制器将几个单独的内存请求合并到偶尔的突发请求中,因此突发模式的好处是减少了内存争用,因为内存仲裁次数减少了。

突发模式与宽存储字相结合可提高内存带宽利用率。例如,对于32位宽的存储器,合并为单个突发的四个连续字节读取可能只导致一个存储器访问周期。

  

在传输完成之前,将暂停需要总线的CPU任务。

"任务" 的概念在此级别的操作中不存在。任何事情都没有"暂停" 。最多CPU必须等待(即插入等待状态)以获得对存储器的访问。

  

但是,在每个指令周期中,获取周期必须引用主存储器。

不正确。指令缓存中的命中将使内存访问变得不必要。

  

因此,在传输过程中,CPU将处于空闲状态,在中断驱动的IO下,与传输工作占用的工作基本相同。

每次缓存命中的错误假设。
显然你误用了术语"中断驱动的IO" 实际意味着使用中断编程的I / O.
等待一个或两个等待周期来执行编程I / O的中断服务程序的 多个 指令是一种荒谬的夸张。

"中断驱动的IO" (正确的含义)不排除使用DMA。

  

据我了解,循环窃取模式基本相同。

然后你的理解是不正确的。

如果DMA所带来的好处是如此微不足道或根本不存在,那么您如何解释DMA控制器的存在,以及使用DMA优于编程I / O的偏好?

  

突发模式DMA通过跳过使用中断驱动I / O时所需的读取和解码周期来实现差异,从而在每个时钟周期而不是一个指令周期完成一次传输,从而加快了进程的速度

将DMA与"中断驱动的I / O" 进行比较是不合逻辑的。见this

使用中断的程序化I / O需要的不仅仅是您声称的 一个 指令。
我不熟悉任何可以读取设备端口的CPU,将该值写入主存储器,触发写指针,并检查块传输是否完整只需 单个 指示。
并且您完全忽略了每个中断(设备为请求数据而发出请求)所需执行的ISR代码(例如保存然后恢复处理器状态)。

答案 1 :(得分:1)

当与许多较旧或更简单的CPU一起使用时,突发模式DMA可以在外围设备能够以比CPU本身提供的速度更快的速度接收数据的情况下加快数据传输速度。例如,在典型的ARM上,像这样的循环:

lp:
  ldr  r0,[r1,r2]  ; r1 points to address *after* end of buffer
  strb r0,[r3]
  lsr  r0,r0,#8
  strb r0,[r3]
  lsr  r0,r0,#8
  strb r0,[r3]
  lsr  r0,r0,#8
  strb r0,[r3]
  adds r2,#4
  bne  lp

对于每组四个字节的传输,可能至少需要花费11个周期(包括五个32位指令获取,一个32位数据获取,四个8位写入,以及循环后该指令的浪费获取)。相比之下,突发模式DMA操作每个组仅需要5个周期(假设接收设备能够快速接收数据)。

由于典型的低端ARM在运行大多数代码时仅在每个其他周期使用总线,因此在每个其他周期获取总线的DMA控制器可以使CPU以几乎正常的速度运行,而DMA控制器每隔一个周期执行一次访问。在某些平台上,有可能让DMA控制器在CPU不执行任何操作的每个周期上执行传输,而在需要总线的周期上给CPU优先级。在这种模式下,DMA性能会有很大的变化(在每个周期运行需要总线的代码时都不会传输数据),但是DMA操作不会对CPU性能产生影响。