我想分析使用较慢内存对应用程序的影响,并且需要一种方法来为所有内存访问添加延迟。到目前为止,我研究了英特尔 PIN 和其他软件,但它们似乎对于我的需要来说太过分了。有没有什么工具可以做到这一点?
在每次 LOAD/STORE 之前在应用程序的二进制代码中添加 NOP 操作是否可行?
最好的选择是在 x86 模拟器下运行应用程序,例如 MARSSx86 或 Sniper。使用这些模拟器,您可以平滑地改变建模的内存延迟或系统的任何其他参数1,并查看应用程序性能如何变化。这是学术界的常见方法(通常会建模通用机器,而不是 x86,这使您可以访问更多模拟器实现)。
使用模拟器的主要缺点是,即使是好的模拟器也不是完全准确的,它们的准确程度取决于相关代码。在回答“性能如何随延迟变化”的问题时,与实际性能的某些类型的差异并不是特别成问题,但不能很好地模拟内存访问路径的模拟器可能会产生与现实相去甚远的答案。
如果您确实无法使用模拟,您可以使用任何二进制重写工具(例如 PIN)来检测内存访问位置。
nop
将是一个糟糕的选择,因为它执行得非常快,因为您无法在内存加载结果和 nop 指令之间添加依赖关系。后一个问题意味着它只会在每个负载的位置添加额外的“工作”,但该工作独立于负载本身,因此不会模拟增加的内存延迟。
更好的方法是在每个加载后执行一个长延迟操作,该操作使用加载的结果作为输入和输出(但不修改它)。如果
imul reg, reg, 1
收到了负载的结果,也许会像 reg
那样(但这只会增加 3 个周期,因此如果您想添加大量延迟,您可能会寻找更长的延迟指令)。
1 至少在模拟器建模的一组事物中。