2017-04-26 114 views
0

在运行Android/Linux的一个臂的SoC,我观察到以下:缓存读取系统存储器VS CPU读取系统存储器

  1. 分配的存储区域作为未缓存设备DMA输入。 DMA完成后,此存储区的内容被复制到另一个系统存储区。
  2. 为设备DMA输入分配一个内存区域为缓存。 DMA完成后,存储器范围无效,然后将该存储区的内容复制到另一个系统存储区。

分配的内存区大小约为2MB,大于缓存大小(L2缓存大小为256KB)。

方法2是X10大于方法快1

即:方法2的存储器复制操作是X10大于方法快1

我推测,用方法2缓存通过读从系统内存缓存行大小复制时,方法1需要通过总线事务处理大小读取CPU从绕过缓存硬件的系统内存中读取CPU。

但是,我找不到明确的解释。我很欣赏谁能帮助提供详细的解释。

+0

不是简单的“缓存”版本能够通过缓存访问服务所有后续请求的问题,而未缓存版本必须始终通过内存获取数据。您提到的 –

回答

0

有这么多的硬件项目,很难给出具体细节。 SOC决定了很多。但是,您观察到的是现代ARM系统的典型性能指标。

主要因素是。所有的DRAM都由“行”和“列”构成。 DRAM history在DRAM芯片上,可以一次读取整个“行”。也就是说,有一个晶体管矩阵,并且有一个物理点/布线可以读取整行(实际上可能有SRAM来将ROW存储在芯片上)。当你阅读另一个'列'时,你需要'取消/充电'接线来访问新的'行'。这需要一些时间。主要的一点是DRAM可以在大块中快速读取顺序存储器。而且,由于存储器在每个时钟沿都流出,所以没有命令开销。

如果您将内存标记为未缓存,则CPU/SOC可能会发出单个节拍读取。通常这些将在单次读/写期间“预充电”消耗额外的周期,并且许多额外的命令必须被发送到DRAM设备。

SDRAM也有'银行'。银行有一个单独的'ROW'缓冲区(静态RAM /多晶体管存储器),允许您从一个银行读取到另一个银行而不必重新充值/重新读取。银行往往相隔甚远。如果您的操作系统在物理上将“未缓存”的内存分配到与“缓存”区域不同的库中,那么这还会增加额外的效率。它在操作系统中通常分开管理缓存/未缓存的内存(对于MMU问题)。记忆池通常足够远,可以分开放入银行。

+0

:如果您将内存标记为未缓存,则CPU/SOC可能会发出单节拍读取。缓存情况如何?我知道它可能取决于实现,对于数据如何读取(通过缓存控制器)是否有一种常见做法?谢谢 – jazzzz

+0

缓存是一个命中(在缓存中)或未命中。如果它是一个小姐,那么它被放入缓存中,但必须被驱逐。这是通过“方式”机制以及随机或LRU(最近一次使用)更换完成的。但是,对于memcpy(),缓存并不重要。你**不要**重复使用数据,所以缓存没有提供一个写得很好的'memcpy()'的好处。 –

+0

'常见的做法'总是一条缓存线。它通常是一个或两个SDRAM突发读/写大小(不是行长度)。你不需要重新发出命令(预充电),你是顺序读一行。典型的最大DDR bw大约是时钟频率。即,由于命令开销,16bit 500MHz DDR大约为1GB/s。 –