假设我有两个内存段(每个大小相等,大小约为1kb),一个是只读的(初始化后),另一个是读/写。
在内存性能方面,这些细分市场内存的最佳布局是什么?一个分配,连续的分段或两个分配(通常不连续)。我的主要架构是Linux Intel 64位。
我的感觉是前(缓存更友好)的情况更好。 有没有第二种布局的情况?
答案 0 :(得分:4)
我会将2KB的数据放在4KB页面的中间,以避免靠近页面边界的读写干扰。同样,出于同样的原因,保持写数据分离也是个好主意。
具有连续的读/写块可能比保持它们分离的效率低。例如,存储仅对只读部分感兴趣的代码的数据的高速缓存可以通过来自另一个CPU的写入而变得无效。即使代码未读取可写数据,缓存行也将失效并刷新。通过保持块分离,可以避免这种情况,并且写入可写数据块只会使可写块的高速缓存行无效,并且不会干扰只读块的高速缓存行。
请注意,这只是可读块和可写块之间块边界的问题。如果您的块大小远远大于缓存行大小,那么这将是一个外围问题,但由于您的块很小,只需要几个缓存行,因此线路无效的问题可能很严重。
答案 1 :(得分:2)
使用这么少的数据,它真的不应该太重要。这两个数组都可以很好地适应任何级别的缓存。
答案 2 :(得分:1)
这取决于你对记忆的所作所为。我相当肯定连续(和页面对齐!)永远不会比两个随机放置的段慢,但它不一定会更快。
答案 3 :(得分:1)
鉴于它是英特尔处理器,您可能只需要确保地址不是64k的倍数。如果是这样,来自映射到相同模64k地址的任一部分的负载将在L1中发生冲突并导致L1未命中。还有一个4MB的别名问题,但如果遇到这个问题我会感到惊讶。