4

假设 LUT 是 512KB 的 64 位双精度类型。一般来说,CPU是如何缓存L1或L2中的结构的呢?

例如:我访问中间元素,它是否尝试缓存整个 LUT 或只是其中的一部分 - 比如说中间元素,然后是 n 个后续元素?

CPU 使用什么样的算法来确定它在 L2 缓存中保存的内容?它是否遵循某种前瞻性策略

注意:我假设 x86,但我有兴趣了解其他架构如何工作 POWER、SPARC 等。

4

2 回答 2

4

这取决于您用于 LUT 的数据结构(查找表?)

缓存在内存中连续布局(例如,作为数组或 std::vectors)而不是分散在各处的事物处于最佳状态。

简单来说,当您访问内存位置时,一块 RAM(在 x86 上为 64 字节的“缓存行”)被加载到缓存中,可能会清除一些以前缓存的数据。

一般有几级缓存,形成层次结构。每个级别都会增加访问时间,但容量也会增加。

是的,有前瞻,它受到相当简单的算法和无法跨越页面边界的限制(在 x86 上,内存页面的大小通常为 4KB。)

我建议您阅读每个程序员应该了解的关于内存的知识。它有很多关于这个主题的重要信息。

于 2010-12-02T22:40:18.007 回答
1

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

CPU 缓存通常使用一些 LRU 逐出机制(最近最少使用,如在缓存未命中时逐出最旧的缓存行),以及从内存地址到特定缓存行集的一些映射。(如果您尝试从对齐在 4k 或 16M 边界上的多个地址读取,这会导致 x86 中的许多错误共享错误之一。)

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

于 2010-12-02T22:54:42.167 回答