假设一个LUT说512KB的64位双类型。一般来说,CPU如何缓存L1或L2中的结构?
例如:我访问中间元素,它是否尝试缓存整个LUT或只是其中的一部分 - 比如说中间元素然后是n个后续元素?
CPU使用什么样的算法来确定它在L2缓存中保留的内容?是否遵循一定的前瞻策略
注意:我假设是x86,但我有兴趣知道其他架构如何工作POWER,SPARC等。
答案 0 :(得分:3)
这取决于您用于LUT的数据结构(查找表?)
缓存是最好的,连续布局的东西是内存(例如数组或std :: vector),而不是散布在周围。
简单来说,当您访问内存位置时,一块RAM(一个“缓存行”值 - 在x86上为64字节)被加载到缓存中,可能会驱逐一些以前缓存的数据。
通常,有几个级别的缓存,形成层次结构。每个级别的访问时间都会增加,但容量也会增加。
是的,有前瞻,这受到相当简单的算法和无法跨越页面边界的限制(在x86上内存页面的大小通常为4KB。)
我建议您阅读What Every Programmer Should Know About Memory。它有很多关于这个主题的很好的信息。
答案 1 :(得分:1)
高速缓存通常形成为高速缓存行的集合。每个缓存行的粒度与缓存行的大小对齐,因此,例如,缓存行为128字节的缓存将具有缓存数据的地址,以便对齐到128字节。
CPU缓存通常使用一些LRU驱逐机制(最近最少使用,如驱逐缓存未命中的最旧缓存行),以及从内存地址到特定缓存行集的一些映射。 (如果您尝试从4k或16M边界上对齐的多个地址读取,则会导致x86中出现许多错误共享错误之一。)
因此,当您有缓存未命中时,CPU将读入包含错过的地址范围的内存缓存行。如果您碰巧读取了缓存行边界,这意味着您将读入两个缓存行。