performance - 访问映射到同一物理地址的虚拟地址是否会受到惩罚?

标签 performance memory-management x86 cpu-architecture mmap

鉴于处理操作的虚拟地址和表示内存中实际位置的物理地址之间的分离,您可以玩一些有趣的技巧:例如创建 circular buffer without a discontinuity at the beginning/end of the allocated space .

我想知道这种映射技巧在这种情况下是否会对数据读取或写入访问造成影响:

  • 对物理页面的访问主要通过相同的虚拟映射进行,但偶尔通过其他映射进行。
  • 对物理页面的访问或多或少均匀地分布在映射到同一物理地址的虚拟地址之间。

我对过去十年左右发布的 x86 芯片特别感兴趣,但也对当代 ARM 和 POWER 芯片感兴趣。

最佳答案

对于80x86(我不知道其他架构):

a) 普通指令/数据/统一缓存是物理索引的(因此不受分页技巧的影响)

b) TLB 被虚拟索引。这意味着(取决于很多因素),对于您的循环缓冲区技巧,您可能会期望比没有循环缓冲区技巧时看到的 TLB 未命中多得多。可能重要的事情包括区域的大小和使用的 TLB 条目类型的数量(4 KiB、2 MiB/1 GiB);如果CPU预取TLB条目(最近的CPU这样做)并且花费足够的时间做其他工作以确保预取的TLB在需要之前到达;如果 CPU 缓存更高级别的分页结构(例如页目录),以避免在 TLB 未命中时获取每个级别(例如,由于页目录被缓存,所以仅显示页表条目;或者 PML4 条目,然后 PDPT 条目,然后 PD 条目,然后页表条目) .

c) 任何 uop 缓存(例如,作为循环流检测器的一部分,或旧的 Pentium 4“跟踪缓存”)实际上都被索引或根本没有索引(例如,CPU 只记住“循环开始时的 uop”)。除非您有多个代码副本,否则这并不重要;如果您确实有多个代码副本,它就会变得复杂(例如,如果重复导致微指令数量超过微指令缓存的大小)。

d) 分支预测实际上是索引的。这意味着,如果您有相同代码的多个副本,它会再次变得复杂(例如,它会增加未正确静态预测的分支的“训练时间”;并且重复可能导致分支数量超过分支预测数量槽并导致更差的分支预测)。

e)返回缓冲区实际上是索引的,但我想不出这有什么关系(重复代码不会增加调用图的深度)。

f) 对于存储缓冲区(用于存储转发);如果存储位于不同的虚拟页面上,那么他们必须假设存储可能有别名,无论是否存在;因此应该不重要。

g) 用于写入组合缓冲区;老实说,我不确定它们是虚拟索引还是物理索引。很可能,如果它可能很重要,那么在它真正重要之前,您就会用完“写入组合槽”。

关于performance - 访问映射到同一物理地址的虚拟地址是否会受到惩罚?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47957559/

相关文章:

java - Java中临时变量的效率

java - 如何在获得可比性能的同时在 Java8 中进行 monadicaly 编程?

performance - 为什么 JSF 多次调用 getter

c - 使用 mingw32 对 posix_memalign 的 undefined reference

c - 缓冲区溢出/溢出解释?

c++ - 在嵌入式 x86 程序集中使用数组?

assembly - 保护模式寻址

c# - WPF DataGrid DataContext 极慢

swift - 防止结合 flatMap 中的自保留循环

Mysql内存设置