我正在编写一个PIN工具,我想在其中查看最终被压扁的推测性执行指令。
即,如果预测了一个分支方向,则推测性地执行了一些指令,解决了分支方向并且预测被证明是不正确的,然后执行的指令将被挤压并恢复寄存器文件。
我假设RTN_AddInstrumentFunction
只向已停用的指令添加一个工具函数(即非推测性或推测性且被证明是正确的(。有没有办法让我使用 PIN 来访问推测性执行但随后被压扁的指令?
不能使用PIN 等二进制检测工具执行此操作,只能使用硬件性能计数器执行此操作。
PIN只能看到正确的执行路径上的指令;它的工作原理是在内存中添加/修改指令来运行额外的代码。 但是这个新代码仍然只是CPU必须执行的x86机器代码,给人一种按程序顺序一次运行一条指令的错觉。
错误推测的指令没有体系结构效果,因此只有对微体系结构状态具有特殊访问权限的内容(如性能计数器(才能告诉您有关它们的任何信息。
有用于错误预测的性能计数器,例如perf stat -e branch-misses
来计算错误预测的分支数。
前端在错误投机的阴影下发布的必须取消的不良 uop 数量可以从uops_issued.any
-uops_retired.retire_slots
中得出(在 Skylake 和可能的其他英特尔上(。 两者都计算融合域 uop 并相互匹配 ~恰好在没有任何类型的错误推测(分支、内存顺序错误推测 pipelien nukes 或其他任何东西(时。
你不能用PIN做到这一点,彼得已经很好地涵盖了细节。
但是,您可以使用 gem5 等模拟工具执行此操作。特别是 Gem5,它既支持模拟 x86,也支持报告推测指令。当然,你会得到的结果是模拟的,所以真实硬件的准确性只会和模拟本身一样好。
混合硬件/仿真方法是使用英特尔处理器跟踪记录实际应用程序,其中包括有关错误预测分支的信息。然后在模拟器中再次运行您的进程,但参考有关错误预测分支的元数据,以向模拟器提示哪些分支被错误预测。
这(几乎(仅适用于直接或条件分支 1,它们只有1或 2 个选项,因此错误预测的方向是显而易见的。对于具有两个以上目标的间接跳跃,您必须猜测哪个目标被错误预测。
1事实上,当预测变量中存在冲突时,您也可以对直接分支和条件分支的任意地址进行错误预测。