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