我有一个不寻常的案例,我正在检查一个相对简单的 Java,它应该有很好的预测分支行为,但是 likwid-perfctr 报告了一个巨大的(50%)分支错误预测率。但是,运行时间与错误预测率不一致(CPI 非常低,约为 0.3,前端和后端的停顿率很低)。类似的 C++ 程序没有错误预测,但实际上运行时间稍长。
似乎差异在于 BR_MISP_RETIRED_ALL_BRANCHES 与 BR_MISP_EXEC_ANY 事件。用于计算误判率的前者很大,每个循环一个事件。后者非常小,与预期的误判率一致,也与运行时间一致。
对于我尝试过的其他示例程序,它们确实表现出严重的错误预测(例如,在数组中的随机值上进行分支),这些值非常相似。
有人熟悉这两个计数器的确切含义吗?对于错误预测的分支,“已退休”计数器如何比“执行”计数器大 25 倍 - 当任何分支必须在其退休之前执行时?