先说结论,可以是可以,关分支预测会损失>95%的性能,然后顶破天节约不到20%的功耗,这种亏断腿的买卖,谁做谁傻。
关掉分支预测损失的性能主要取决于两个因子,一个是分支指令密度,一个是分支resolve的平均时间。
分支指令的密度,在real silicon上就能测到,在SPECint06 - 17上,用新版本的编译器,大概每隔4.6 - 5.2条指令就有一个分支,其中包括call和direct jump这种非条件分支,但并不影响主要结论。
分支resolve的平均时间,决定了你如果不做分支预测,平均要花多长时间等分支出结果,这个精确统计只能在模拟器上做,real silicon上可以粗略估计,对于Skylake跑SPECint,大概20-30个cycle(因为load-dependent branch的存在,导致这个数字会长于流水线长度)。
也就是说你每发射5条指令,都要等待20-30个cycle,也就是说你关掉分支预测之后,性能会断崖式下跌到开启分支预测状态的3% - 5%。
然后功耗收益呢,这个是可以通过写microbenchmark大致估计的,这个我和隔壁组的同学正在做,手上还没有准确的数据,根据目前的进展估计的话,哪怕关掉整个front-end,功耗收益可能也就不到20%的样子。