英特尔 PIN:如何查看推测性指令?

Intel PIN: How do I see speculative instructions?

我正在编写一个 PIN 工具,我希望看到 推测性地 执行的指令最终被压缩。

即如果预测了分支方向,推测性地执行了一些指令,解决了分支方向并且显示预测不正确,则执行的指令将被压缩并恢复寄存器文件。

我假设 RTN_AddInstrumentFunction 仅向已停用的指令添加工具函数(即非推测性或推测性并显示为正确的指令)。有没有办法让我使用 PIN 来访问以推测方式执行但随后被压缩的指令?

您不能使用像 PIN 这样的二进制检测工具来做到这一点,只能使用硬件性能计数器。

PIN 只能看到沿着正确执行路径的指令;它通过将内存中的指令添加/修改为 运行 额外代码来工作。但是这个新代码仍然只是 CPU 必须执行的 x86 机器代码,给人一种错觉 运行 按照程序顺序一次执行一条指令。

错误推测的指令对架构没有影响,因此只有对微架构状态具有特殊访问权限的东西(如性能计数器)才能告诉您有关它们的任何信息。


有用于错误预测的性能计数器,例如 perf stat -e branch-misses 用于计算错误预测的分支数。

前端在错误推测的阴影下发出的必须取消的错误 uops 的数量可以从
中得出(在 Skylake 和可能其他 Intel 上) uops_issued.any - uops_retired.retire_slots。两者都计算融合域 uops 并相互匹配 ~ 恰好在没有任何类型的错误推测(分支、内存顺序错误推测 pipelien nukes 或其他任何东西)时。

你不能用 PIN 和 详细信息做到这一点。

但是,您可以使用 gem5 等模拟工具来完成。 Gem5 尤其支持模拟 x86 和报告推测指令。当然,您将获得的结果是 模拟的 ,因此真实硬件的准确性只会与模拟本身一样好。

混合 hardware/simulation 方法是使用英特尔处理器跟踪记录实际应用程序,其中包括有关错误预测分支的信息。然后运行,你的进程在模拟器中再次出现,但是参考关于错误预测分支的元数据来提示模拟器哪些分支被错误预测。

这只(几乎)完全适用于直接或条件分支1,它们只有 1 或 2 个选项,因此错误预测的方向是显而易见的。对于超过两个目标的间接跳跃,您必须猜测哪个目标被错误预测。


1 实际上,当预测变量发生冲突时,您也可能对直接和条件分支的任意地址进行错误预测。