繁体   English   中英

如果对象大小>缓存行,空间局部性对缓存性能是否有影响?

[英]Does spatial locality matter for cache performance if object size > cache line?

假设我正在存储对象的链接列表,每个对象的大小为64个字节,这也是我的缓存行的大小。 随着时间的推移,我将在链表上进行对延迟敏感的添加,删除和迭代。 我了解性能是由对象是否保留在缓存中决定的,因此对于RAM访问,访问权限约为1纳米,而不是50纳米。

通常建议使用空间局部性来完成此操作,理想情况下将对象存储在连续的内存块中。 这很有用,因为每当我访问内存地址时,处理器实际上就会提取高速缓存行中的数据。 我们希望这些额外的数据成为其他有用的对象,因此我们将所有对象放在一个连续的块中。

我可能会误会,但是如果对象大小> =高速缓存行大小,则似乎无法从这种效果中受益。 一次只能将一个对象带入缓存。

当数据大小小于缓存大小时,要考虑预加载后续项的好处之外的另一个因素是关联性和映射问题。 对于链表,您没有连贯的布局(或至少没有这样的保证),因此与以空间局部性布置数据相比,发生碰撞的可能性要大得多。 最重要的是,尽管我不确定这是否是您甚至应该担心的事情,但链接列表模型确实会带来内存碎片化的风险。

取决于使用情况,访问模式等,对于您正在执行的操作,绝对值得权衡算法效率的相对好处(链接列表中的删除非常便宜,数组中的删除非常昂贵或类似操作)。 如果您要进行大量删除/插入操作,那么算法效率的好处可能远远超过缓存一致性的好处。

为了阐明结合性的概念, 这里值得一提。 基本上,缓存的关联性决定了特定地址可以映射到缓存中的多少个位置。 不同的缓存级别将具有不同的关联性,因此,例如,在大多数情况下,L1缓存是2或4路集关联的,这意味着任何地址都可以映射到缓存中两个(或四个)位置之一。 L2和L3更可能是8(或有时是12或16)方式的关联。

对于Intel / AMD / etc CPU的特定关联性,这是一个更艰难的选择,因为即使Intel员工也很难找到一个好的答案! 我发现的一个示例是Xeon x5660 CPU,它是L1中的4路设置关联指令,L2中的8路设置关联数据,L2中的8路设置关联,以及L3中的16路设置。

现代CPU用于缓存使用等的算法非常惊人,并且不仅限于此处概述的基本知识,因此我认为在实践中您几乎不会从中受到影响。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM