我在理解参考的位置方面遇到了问题。任何人都可以帮助我理解它的含义和内容,
答案 0 :(得分:42)
如果您的计算机充满超快速内存,这无关紧要。
但不幸的是情况并非如此,计算机内存看起来像这样:
+----------+
| CPU | <<-- Our beloved CPU, superfast and always hungry for more data.
+----------+
|L1 - Cache| <<-- works at 100% of CPU speed (fast)
+----------+
|L2 - Cache| <<-- works at 25% of CPU speed (medium)
+----+-----+
|
| <<-- This thin wire is the memory bus, it has limited bandwidth.
+----+-----+ <<-- works at 10% of CPU speed.
| main-mem | <<-- The main memory is big but slow (because we are cheap-skates)
+----------+
|
| <<-- Even slower wire to the harddisk
+----+-----+
| harddisk | <<-- Works at 0,001% of CPU speed
+----------+
空间位置
在此图中,CPU越接近CPU,CPU就越快
这与Spacial Locality
有关。如果数据在存储器中靠得很近,则数据具有空间局部性
由于便宜的冰鞋,我们RAM并不是真正的随机访问,它实际上是Slow if random, less slow if accessed sequentially Access Memory
SIRLSIAS-AM。
这就是为什么将相关数据保持在一起很聪明,因此您可以对一堆数据进行顺序读取并节省时间。
时间地点
数据保留在主内存中,但不能保留在缓存中,否则缓存将无法使用。可以在缓存中找到最近使用的数据之一;旧数据被推出。
这与temporal locality
有关。如果同时访问数据,则数据具有强时间局部性
这很重要,因为如果项目A在缓存中(好)而不是项目B(具有强时间局部性到A)很可能也在缓存中。
答案 1 :(得分:4)
答案 2 :(得分:3)
首先,请注意,这些概念不是通用法则,它们是对常见代码行为形式的观察,这些代码行为使CPU设计人员可以优化其系统,从而在大多数程序中表现更好。同时,这些是程序员寻求在程序中采用的属性,因为他们知道内存系统的构建方式,这就是CPU设计人员要优化的内容。
空间局部性是指某些(实际上是大多数)应用程序以顺序或跨步方式访问内存的属性。这通常源于以下事实:最基本的数据结构构建块是数组和结构,两者均在内存中相邻存储多个元素。实际上,许多语义上链接的数据结构(图形,树,跳过列表)的实现都在内部使用数组来提高性能。
由于以下原因,空间局部性可以使CPU改善内存访问性能:
内存缓存机制(例如缓存,页表,内存控制器页面)在设计上已经比单次访问所需的机制更大。这意味着一旦您为从远程内存或较低级别的缓存中获取数据而付出了内存方面的损失,您可以从中消耗的更多数据越多,您的利用率就越高。
当今几乎所有CPU上存在的硬件预取通常涵盖空间访问。每次获取addr X时,预取程序都可能会获取下一个缓存行,并且可能还会获取其他缓存行。如果程序表现出恒定的步幅,则大多数CPU都将能够检测到该步幅并进行推断以预取相同步幅的更多步骤。现代空间预取器甚至可以预测重复出现的步幅(例如VLDP,SPP)
临时位置是指内存访问或可重复自身的访问模式的属性。在最基本的形式中,这可能意味着如果地址X曾经被访问过,那么将来也可能会访问它,但是由于高速缓存已经在一定时间内存储了最近的数据,因此这种形式就没那么有趣了(尽管某些CPU上有一些机制旨在预测哪些行可能很快会再次访问,哪些行则不会)。
一种更有趣的时间局部性形式是,一次观察到的两个(或多个)时间相邻的访问可能再次重复。也就是说-如果您曾经访问过地址A,然后访问了该地址B,不久之后,CPU再次检测到对地址A的访问,则它可能会预测您可能很快会再次访问B,并提前进行预取。 旨在提取和预测这种类型的关系的预取器(时间预取器)通常使用相对较大的存储来记录许多此类关系。 (请参阅Markov预取,以及最近的ISB,STMS,Domino等。)
顺便说一句,这些概念绝不是排他的,程序可以显示两种类型的位置(以及其他更不规则的形式)。有时,两者甚至都在术语时空局部性下分组在一起,以表示局部性的“常见”形式,或者是时间相关性连接空间构造的组合形式(例如地址三角洲总是紧随另一个地址三角洲之后) )。
答案 3 :(得分:0)
参考的时间位置-最近使用过的存储位置更有可能再次被访问。例如,循环中的变量。相同的变量集(内存位置的符号名称)用于循环的某些 i 次迭代。
参考的空间位置-接近当前访问的存储位置的存储位置更有可能被访问。例如,如果您声明int a,b;浮动c,d;编译器可能会为其分配连续的内存位置。因此,如果使用a,那么很可能在不久的将来使用b,c或d。这是32或64字节的缓存行如何提供帮助的一种方式。它们的大小不是4或8个字节(int,float,long和double变量的典型大小)。