2014-03-14 74 views
17

here数据缓存和指令缓存是什么意思?

指令和数据具有不同的访问模式,并获得 的存储器的不同区域。因此,对于 指令和数据具有相同的高速缓存可能并不总是成功。

因此,拥有两个高速缓存很常见:一个指令高速缓存, 只存储指令,以及一个只存储数据的数据高速缓存。

知道指令和数据之间的区别很直观,但现在我不能确定在这种情况下的区别吗?什么构成数据并被放入数据高速缓存以及构成指令并放入指令高速缓存中?

我知道ARM程序集。是否需要STR,LDR,LDMFSTMFD使用数据缓存?但从技术上说STRLDR,LDMFSTMFD都是说明,所以我这就是为什么我很困惑。 “数据”必须与“指令”一起存在吗?数据是否被认为是.data部分的内容?

例如LDR R1, =myVar那么LDR会进入指令缓存并且myVar的内容会进入数据缓存?还是不是那样工作?

指令和数据有不同的访问模式 有人可以详细说明吗?

这个评论我在一个有用的岗位上做出了突出我的难处理解:

“我们的想法是,如果一个指令已经从内存中加载,这是 可能马上就会被再次使用”,但只有知道下一个 指令的方法是读取它。这意味着内存读取(您不能说 它已经在缓存中,因为新的指令是红色的)。所以我 还是看不到点?假设LDR指令刚刚发生,所以现在 LDR位于数据缓存中。也许另一个LDR指令会发生, 也许它不会,我们不能确定,所以我们不得不实际读取下一个 指令 - 从而破坏了缓存的目的。

回答

8

指令提取可以分块完成,假设大部分时间你将要连续运行很多指令。所以指令提取可以更有效率,每个事务可能有少量或更多的时钟开销,然后内存的数据准备就绪的延迟,然后是事务大小的每个总线宽度的时钟。例如,8个单词或指令可能是5 + n + 8个时钟,这比一次一个指令(5 + 1 + 1)* 8更有效。另一方面,数据不是很好的一个假设,即数据将在很多时间被顺序读取,所以额外的周期可能会受到影响,只能获取所要求的数据(直到内存或总线的宽度为这是一个免费赠品)。

在ARM上,我知道关于L1缓存的I和D是分开的,它们被组合在一起。 L1不在axi/amba总线上,并且可能比L2有更高的访问效率,并且超出了amba/axi(开销的几个周期加上时间加上每个事务的每个总线宽度数据一个时钟)。

对于被标记为可缓存的地址空间(如果mmu处于打开状态),L1和L2结果将获取缓存行而不是单个数据项,也可能超过I个数据的获取量取指令。

您的每条ldr和ldm指令都会导致数据循环,如果地址可缓存,则可以进入L2和L1缓存(如果尚未存在的话)。指令本身也是如果在可高速缓存的地址将进入L2和L1缓存(如果尚未存在的话)。 (是的,有很多旋钮来控制可缓存的内容,而不是想要进入这些细微差别,为了讨论的缘故,所有这些指令提取和数据访问都是可缓存的)。

如果您有循环或再次运行该代码,您可能希望保存刚刚在缓存中执行的指令。此外,高速缓存行中的指令也将从更高效的访问节省的开销中受益。但是如果你只通过一小部分缓存线来执行,那么总体来说这些周期是浪费的,如果这种情况发生得太多,那么缓存会让事情变得更慢。

一旦有东西在缓存中,下次读取(或根据设置写入)时,缓存副本就是使用的缓存副本,而不是慢速内存中的副本。最终(取决于设置)如果某个项目的缓存副本由于写入(str,stm)而被修改,并且某些新访问需要保存在缓存中,则旧缓存将被逐出缓存并从中写入缓存发生缓存。你没有这个指令的问题,指令基本上是只读的,所以你不必将它们写回到慢速内存,理论上缓存副本和慢速内存副本是相同的。

ldr r1,=myvar 

将导致PC相对负载

ldr r1,something 
... 
something: .word myvar 

LDR指令将是一个高速缓存行的一部分取,一个取指令(与一群多个指令一起)。这些将被保存在手臂的L1缓存的一部分以及L2的共享部分(如果启用等)。当最终执行该指令时,某事物的地址将经历数据读取,如果该区域中的缓存在该读取中启用,则该地址也将进入L2和L1缓存(D部分)(如果尚未存在的话)。 如果您循环并且立即再次运行该指令,那么理想情况下该指令将位于L1缓存中,并且访存时间总计非常快。这些数据也将在L1缓存中,并且还会有少量时钟可供读取。

上面提到的5 + n + 8,一些开销时钟数量(5只是一种可能性,它可以根据设计和并行发生的变化而变化)。 N取决于较慢的内存速度。 n对于dram来说非常大,所以缓存l2和l1要快得多,这就是为什么缓存存在以减少每个dram访问的大量时钟周期的原因,是否有效。

+0

如果您看看arm处理器的TRM(技术参考手册)并从arm获取AMBA/AXI规格,则可以看到每种访问类型涉及多少个步骤。请参阅axi总线控制线,以指示访问权限,权限,可缓存与否等。 –

+0

“指令读取可以分块完成”是另一种说法,高速缓存线通常比单个指令大吗? – Celeritas

+0

是的,缓存行比单个指令大,否则会有什么意义呢? –

4

指令高速缓存将包含从内存中提取的用于执行的高速缓存行。数据高速缓存将包含从内存中获取的缓存行,以便作为数据加载到寄存器中。

+1

你能举个例子吗?例如'LDR R1,= myVar'那么LDR会进入指令缓存,并且myVar的内容会进入数据缓存? – Celeritas

+0

是的,那会发生什么。 –

+0

缓存'LDR'指令有什么意义?以某种方式更快地转换操作码的方式? – Celeritas

3

指令高速缓存只是更快访问指令的另一级存储器。它不是CPU的发条/内部部件/读取 - 解码 - 执行逻辑的一部分 - 但是您可以将其命名。

当一个人说的指令缓存,他们的意思是,这是非常接近CPU内存级别明智的,所以当CPU需要在地址X加载指令,它相比于其他一些地址Y.

CPU的速度非常快内部不会缓存指令。

指令和数据有不同的访问模式有人可以详细说明吗?

例如它是令人难以接受的更新(改写)的指令和它是不常见的。所以如果你设计一个指令缓存,你可以优化它的读取。另外指令是连续的,所以如果cpu在N处访问指令,那么它很可能也会访问N + 1处的指令。然而,这两个属性对于数据缓存来说可能不那么重要,或者数据缓存必须更加详细。

-1

考虑到例如臂。为简单起见让我们假设:

  • VA-> PA为1:1映射
  • MMU属性被设置为缓存-能够和股票能够
  • 只有L1I和L1D和L2D缓存

当内核执行时,PC有一个VA(以下简称为PA)。此时没有人知道PA是否有数据或指令。而且,由于这是该地址首次被击中,所以不会有任何缓存分配。因此,硬件将在L1 I cache,L1D和L2D中查找,并且什么也找不到。

它穿过MMU步行(MMU不能TLB也找到地址),并最终获取从最终的存储内容。现在我们有来自PA的内容,其可以是数据指令

分配在我缓存

任何数据基于从PC的地址被认为是指令,并将我缓存自动分配是牵强。解码单元尚未使用。如果解码单元发现它的无效指令,那么它将无论如何中止,因此中止/异常逻辑将驱逐/无效来自I缓存的指令。预取引擎也可以参考上面使用的PA来获取下几条指令。

分配在d缓存

一旦解码单元计算出它的加载或存储,并传递控制到LoadStore单元,该数据被向/从L1D高速缓存中检索分配。

因此,下一次下一个地址来PC和它遵循通过同一链条,当前地址被引用/在与内容检查L1I用于指令,只要有一击,当前地址的内容被取出从TLB