我目前正在分析二进制搜索的实现。使用一些特殊指令来衡量这一点,我注意到代码有大约20%的错误预测率。我很好奇是否有任何方法可以检查我可能因此丢失多少个周期。这是一个基于MIPS的架构。
答案 0 :(得分:4)
每次迭代会丢失0.2 * N个周期,其中N是在错误预测的分支之后刷新管道所需的周期数。假设N = 10则表示您在聚合时每次迭代丢失2个时钟。除非你有一个非常小的内部循环,否则这可能不会成为显着的性能损失。
答案 1 :(得分:1)
在CPU的文档中查找。如果你无法专门找到这些信息,那么CPU管道的长度是一个相当不错的估计值。
鉴于它是MIPS并且它是一个300MHz的系统,我猜它是一个相当短的管道。可能是4-5个阶段,因此每次误预测的成本为3-4个周期可能是一个合理的猜测。
答案 2 :(得分:1)
在有序CPU中,您可以计算出大致的误预测成本,作为误预测数量和误预测成本(通常是管道某些部分的函数)的乘积。
但是,在现代out-of-order CPU上,通常无法进行这种通用计算。飞行中可能存在大量指令 1 ,其中只有一些指令被错误预测所冲刷。周围的代码可能是一个或多个相关指令链的延迟限制,或者它可能是资源上的吞吐量限制,如执行单元,重命名吞吐量等,或者它可能介于两者之间。
在这样的核心上,即使在表现计数器的帮助下,每次误预测的惩罚也很难确定。你可以找到专属于这个主题的entire papers:在整个基准测试中找到一个平均9到35个周期的惩罚大小:如果你看一些小的代码,范围会更大:惩罚零很容易证明,你可以创建一个惩罚在100周期内的场景。
这会让你离开,只是试图确定二元搜索中的错误预测成本?一个简单的方法就是控制错误预测的数量并衡量差异!如果您设置基准输入具有一系列行为,从始终遵循相同的分支模式开始,一直到具有随机模式,您可以绘制错误预测计数与运行时降级。如果你这样做,请分享你的结果!
1 在现代大核(例如x86,ARM和POWER架构提供的核)的情况下,数百个指令正在进行中。
答案 3 :(得分:0)
查看有关该信息的规格,如果失败,请运行十亿次并将其计入程序外部(停止观察某些内容。)然后运行它,不要错过并进行比较。