LUT和类似器件的L1/L2缓存行为是什么?

4
假设有一个512KB大小的64位双精度类型LUT。一般来说,CPU是如何将该结构缓存到L1或L2中的?
例如:我访问中间元素,它会尝试缓存整个LUT还是只缓存其中一部分 - 比如中间元素和接下来的n个元素吗?
CPU使用什么样的算法来确定它在L2缓存中保存什么?它遵循某种预测策略吗?
注:我假设是x86架构,但我有兴趣知道其他架构如POWER、SPARC等是如何工作的。

3
通常它会在该位置附近加载一个缓存行,在大多数x86处理器上,其大小为64字节。 - ruslik
2个回答

4
取决于您用于LUT(查找表?)的数据结构。
缓存对于在内存中连续布置的事物(例如作为数组或std ::向量)最有效,而不是分散在不同位置。
简单来说,当您访问内存位置时,将加载一块RAM(“高速缓存行”价值-在x86上为64字节),可能会驱逐一些先前缓存的数据。
通常,有几个级别的缓存,形成层次结构。随着每个级别,访问时间增加,但容量也增加。
是的,有前瞻性,受相当简单的算法和无法跨页面边界(在x86上,内存页面通常为4KB)的限制。
我建议您阅读“每个程序员都应该了解内存”的PDF。它有关于此主题的很多很棒的信息。

1

缓存通常由缓存行集合形成。每个缓存行的粒度都与缓存行的大小对齐,因此,例如,具有128字节缓存行的缓存将使其缓存数据的地址对齐到128字节。

CPU缓存通常使用一些LRU驱逐机制(最近最少使用,例如在缓存未命中时驱逐最老的缓存行),并且具有从内存地址到特定缓存行集的某种映射。(如果您尝试从多个对齐在4k或16M边界上的地址读取,则会导致x86中的许多虚假共享错误之一。)

因此,当您发生缓存未命中时,CPU将读取包括未命中的地址范围的内存缓存行。如果您恰好跨越缓存行边界进行读取,则意味着您将读取两个缓存行。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接