停止应用程序的所有内存访问

时间:2019-01-04 11:11:00

标签: performance assembly memory x86-64 amd

我想分析在应用程序上使用慢速内存的影响,并且需要一种手段来增加所有内存访问的延迟。到目前为止,我研究了英特尔PIN码和其他软件,但对于我所需要的东西,它们似乎有些过分。有没有这样做的工具?

是否在每次LOAD / STORE之前在应用程序的二进制代码中添加NOP操作?

1 个答案:

答案 0 :(得分:3)

您最好的选择是在x MARSSx86Sniper之类的x86模拟器下运行应用程序。使用这些模拟器,您可以平滑地更改建模的内存延迟或系统 1 的任何其他参数,并查看应用程序性能如何变化。这是学术界常用的方法(通常将对通用计算机进行建模,而不是对x86进行建模,从而使您可以访问更多的模拟器实现)。

使用模拟器的主要缺点是,即使是好的模拟器也不是完全准确的,其准确程度取决于所讨论的代码。回答“性能如何随延迟变化”的问题时,某些类型的实际性能差异并不是特别有问题,但是,对内存访问路径没有很好建模的模拟器可能会产生与现实不符的答案。 >

如果您真的不能使用仿真,则可以使用任何二进制重写工具(例如PIN)来检测内存访问位置。 nop是一个不好的选择,因为它执行得非常快,因为您不能在内存加载结果和nop指令之间添加依赖项。后一个问题意味着它只会在每个负载的位置添加额外的“工作”,但是工作与负载本身无关,因此不会模拟增加的内存延迟。

一种更好的方法是在每个负载之后进行长时间等待操作,该操作将负载的结果用作输入和输出(但不对其进行修改)。如果imul reg, reg, 1收到了加载结果,则可能类似于reg(但这只会增加3个周期,因此,如果要增加很多延迟,您可能会寻找更长的延迟指令)。


1 至少在模拟器建模的一组事物之内。