X86 CPU体系结构的演变如何影响虚拟函数调用性能?

X86 CPU体系结构的演变如何影响虚拟函数调用性能?,x86,cpu,cpu-architecture,virtual-functions,branch-prediction,X86,Cpu,Cpu Architecture,Virtual Functions,Branch Prediction,几年前,我在学习x86汇编程序、CPU流水线、缓存未命中、分支预测等 这是一个两半的故事。我读到了处理器中冗长管道的所有优点,即指令重新排序、缓存预加载、依赖项交错等 不利的一面是,任何偏离标准的行为都会付出巨大的代价。例如,在早期的千兆赫兹时代,每当你通过指针(!)调用一个函数时,某个AMD处理器就会受到40个周期的惩罚,这显然是正常的 这是一个不容忽视的“别担心”数字请记住,“良好的设计”通常意味着“尽可能多地考虑您的功能”和“在数据类型中编码语义”,这通常意味着虚拟接口 折衷是,不执行此类

几年前,我在学习x86汇编程序、CPU流水线、缓存未命中、分支预测等

这是一个两半的故事。我读到了处理器中冗长管道的所有优点,即指令重新排序、缓存预加载、依赖项交错等

不利的一面是,任何偏离标准的行为都会付出巨大的代价。例如,在早期的千兆赫兹时代,每当你通过指针(!)调用一个函数时,某个AMD处理器就会受到40个周期的惩罚,这显然是正常的

这是一个不容忽视的“别担心”数字请记住,“良好的设计”通常意味着“尽可能多地考虑您的功能”和“在数据类型中编码语义”,这通常意味着虚拟接口

折衷是,不执行此类操作的代码每个周期可能会获得两条以上的指令。这些是编写高性能C++代码时需要考虑的问题,这是重于对象设计和轻量化的问题。


据我所知,随着我们进入低功耗时代,长CPU流水线的趋势正在逆转。我的问题是:

最新一代与x86兼容的处理器是否仍然会因为虚拟函数调用、错误的分支预测等而遭受巨大的惩罚

在早期的千兆赫兹时代,AMD处理器在每次调用函数时都会受到40个周期的惩罚

嗯。。这么大

有一种“间接分支预测”方法,它有助于预测虚函数跳跃,如果一段时间以前存在相同的间接跳跃。对于第一个和预测失误的virt,仍将受到处罚。函数跳跃

支持范围从简单的“当且仅当先前的间接分支完全相同时预测正确”到非常复杂的两级十或数百个条目,检测单个间接jmp指令的2-3个目标地址的周期性交替

这里有很多进化

首先介绍的是奔腾M:。。。间接分支预测器

间接分支预测器

因为间接分支从寄存器加载分支目标,而不是像直接分支那样让它们立即可用,所以它们很难预测。Core的间接分支预测器是一个存储有关前端遇到的每个间接分支的首选目标地址的历史信息的表。因此,当前端遇到间接分支并将其预测为已执行时,它可以要求间接分支预测器将其定向到BTB中分支可能需要的地址

间接分支预测最早是在英特尔的普雷斯科特微体系结构和后来的奔腾M

16-50%的分支机构预测失误是间接的(平均29%)。间接分支预测失误的真正价值在于许多较新的脚本或高级语言,如Ruby、Perl或Python,它们使用解释器。其他常见的间接分支常见的罪魁祸首包括虚拟函数(在C++中使用)和对函数指针的调用

AMD已经采用了其中一些改进;例如,在巴塞罗那和更高版本的处理器中添加间接分支预测器阵列。然而,与核心2相比,K8具有更老且更不准确的分支预测器

3.12旧处理器上的间接跳转 间接跳转、间接调用和返回每次都可能转到不同的地址。这个 间接跳转或间接调用的预测方法是,在比PM和 K10,简单地预测它将到达与上次执行时相同的目标

同样的pdf,第14页

间接跳变预测 间接跳转或调用是具有两个以上可能的 目标。C++程序可以生成间接跳变或调用…虚拟函数。间接跳转或调用在程序集中由 指定寄存器、内存变量或索引数组作为跳转的目标 或调用指令。许多处理器仅为间接跳转或呼叫创建一个BTB条目。 这意味着它将始终被预测到与上次相同的目标。 随着使用多形类的面向对象编程变得越来越普遍, 越来越需要预测具有多个目标的间接呼叫。这是可以做到的 通过为遇到的每个新跳转目标分配一个新的BTB条目。历史 缓冲区和模式历史记录表必须有一个以上的信息位的空间 每次跳跃事件都是为了区分两个以上的可能目标。 PM是第一个实现此方法的x86处理器。p。12仍然 适用于可预测的理论最大周期的修改 完美的是mn,其中m是每个间接跳转的不同目标数,因为 是mn个不同的可能的n长度子序列。然而,这一理论上的最大值是不可能的 如果超过BTB或模式历史表的大小,则无法访问

Agner的手册对许多现代CPU中的分支预测器以及每个制造商(x86/x86_64)CPU中预测器的发展有了更详细的描述

还有很多理论上的“间接分支预测”方法(请看谷歌学者);甚至维基也说了一些关于它的话/

对于来自agner's micro的原子:

间接分支预测 根据我的测试,原子没有间接分支的模式预测器。间接的 预测分支将转到与上次相同的目标

因此,对于低功耗,间接分支预测并不那么先进。Via Nano也是如此:

预计间接跳跃将到达与上一个t相同的目标