这个问题和它的答案,最近被标记为史诗般的答案,让我产生了疑问;我可以根据CPU分支预测失败来衡量Windows中运行的应用程序的性能吗?我知道存在一些静态分析工具,这可能有助于优化代码以在分支预测情况下获得良好的性能,手动技术可以通过简单地进行更改和重新测试来提供帮助,但我正在寻找一种自动机制,它可以在一段时间内报告分支预测失败的总数,我希望一些Visual C的Profiler工具可以帮助我。
就这个问题而言,所讨论的应用程序要么是用本机编译器(如Visual C for Windows)构建的,要么是用其他本机编译器(如GCC、FreePascal、Delphi或TurboAssembler)构建的。可执行文件可能根本没有任何调试信息。我想知道我是否可以检测和统计分支预测失败,也许是通过一些windows服务(如WMI)读取内部CPU信息,或者也许是通过完全在运行Windows的虚拟化环境中运行(如使用VirtualBox),然后在VirtualBox中运行我的测试应用程序的完全虚拟化Windows环境,并对虚拟CPU进行运行时分析。或者其他我不知道的技术,所以这个问题。
是的,我谷歌了。唯一看起来有希望的是AMD的这个PDF。第18页提到了一些非常接近我想做的事情,但似乎是为那些在原始评估硬件平台上没有任何操作系统的人写的:
5.1.分支机构。适用性。条件分支预测失误可能是具有大量决策逻辑的代码中的一个重要问题。
当选择真或假路径的可能性是随机的或接近 50-50 的拆分时,条件分支可能会被错误预测。分支预测硬件无法“学习”模式,并且无法正确预测分支。收集。收集此表中的事件以衡量分支预测性能:
分支使用以下公式计算分支的执行率和每个分支的指令数比率:分支执行率=执行_Branches/Ret_instructions分支执行比率=执行_Branches/Branches
每个分支的指示数=执行指令/Ret_inructions/Branches
更新:我想我可以说我正在寻找一种方法来读取Intel Core i7 PMU模块或其他CPU的等效功能。看起来英特尔VTUNE(从Adrian的评论来看)非常接近我的要求。
VTune性能分析仪可以做到这一点!顺便说一句,如果您正在研究这些主题,请查看英特尔出版社的“优化食谱”。
注:注释陈述了相同的答案,但有一些不确定性,我使用了 VTune,并测量了英特尔 CPU 的分支预测率。所以我100%确定。
这是VTune的链接
这是这本书的链接
如果语句更多地依赖于分支预测,而v表查找更多地依赖分支目标预测,那么
分支目标预测(BTP)与分支预测(BP)不同。我知道BTP会找到分支将跳转到的位置,而BP只是决定可能采取哪个分支。 BTP依赖BP吗,如果BTP不使用BP来预测哪个分支被采用,它怎么可能知道分支的目标呢? 我不明白为什么会有这么大的差异?一旦分支被预测为被占用,找到目标并不像读取指令中的地址一样简单吗?
从这里我知道Intel这些年实现了几种静态分支预测机制: > 80486年龄:始终未取 Pentium4年龄:向后取/向前不取 由于Intel不再在其文档中明确陈述动态预测机制,所以GCC的builtin_expect()只能做的就是从hot Path中移除不太可能的分支。 我不熟悉CPU的设计,也不知道Intel现在的静态预测器到底用了什么机制,但我还是觉得Intel最好的机制应该是清楚地记录他
编辑:我的困惑出现了,因为通过预测哪个分支,你肯定也在有效地进行目标预测?? 这个问题与我关于这个主题的第一个问题有内在联系: 分支预测与分支目标预测 无限循环 语句 或语句 语句的“then”子句结尾(跳过子句) 非虚函数调用 从函数返回 虚函数调用 函数指针调用 语句(如果编译为跳转表) 语句 语句(如果编译成一系列语句) 循环条件测试 和运算符 三元运算符 null 如果我有以下代码: (B
我的代码经常调用具有多个(不可预测的)分支的函数。当我分析时,我发现这是一个小瓶颈,大部分CPU时间用于条件JMP。 考虑以下两个函数,其中原始函数有多个显式分支。 这是一个新函数,我试图在其中删除导致瓶颈的分支。 然而,当我分析新代码时,性能只提高了大约20%,而且调用本身(对mem_funcs数组中的一个func)花费了很长时间。 第二个变量仅仅是一个更隐含的条件吗,因为CPU仍然无法预测将要
我目前正在查看CPU管道中可以检测分支错误预测的各个部分。我发现这些是: 分支目标缓冲区(BPU CLEAR) 分支地址计算器(BA CLEAR) 跳转执行单元(不确定此处的信号名称??) 我知道2和3检测到什么,但我不知道BTB中检测到什么预测失误。BAC检测BTB错误地预测了非分支指令的分支,BTB未能检测到分支,或者BTB错误预测了x86 RET指令的目标地址。执行单元评估分支并确定它是否正