【问题标题】:Stall all memory accesses of an application停止应用程序的所有内存访问
【发布时间】:2019-01-04 11:10:59
【问题描述】:

我想分析使用较慢内存对应用程序的影响,并且需要一种方法来为所有内存访问添加延迟。到目前为止,我调查了英特尔 PIN 和其他软件,但它们似乎对我的需要来说太过分了。有什么工具可以做到吗?

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

【问题讨论】:

  • 我认为您可以降低 BIOS 中的内存时钟并关闭缓存。你在为什么平台编程?
  • x86_64,普通电脑
  • 哪个 CPU 型号?哪个芯片组?可能没有通用的方法来做你想做的事,但个别 CPU 和芯片组可能有方法。
  • 您可能还想看看 cachegrind,一个模拟缓存行为的工具。
  • 我们有 Intel 2630v4、AMD Opteron 6272 和 Intel Xeon E5-2620 CPU。

标签: performance assembly memory x86-64 amd


【解决方案1】:

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

使用模拟器的主要缺点是,即使是好的模拟器也不是完全准确的,它们的准确程度取决于相关代码。在回答“性能如何随延迟而变化”的问题时,与实际性能的某些类型的差异并不是特别成问题,但不能很好地模拟内存访问路径的模拟器可能会产生与现实相去甚远的答案。

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

更好的方法是使用加载结果作为输入和输出(但不修改)的长延迟操作来跟踪每个加载。如果reg 收到加载结果,则可能类似于imul reg, reg, 1(但这只会增加3 个周期,因此如果您想增加很多延迟,您可能会寻找更长的延迟指令)。


1 至少在模拟器建模的事物集中。

【讨论】:

  • push reg / pop reg (在使用红色区域的代码中不安全)或存储/重新加载到每个线程的静态位置会产生更多延迟,但是您会为存储加载/存储端口和存储缓冲区中的更多活动。根据您要学习的内容,可能没问题。
  • 有一些关于负载延迟性能模型的建议,可以仅使用现代 Intel 和 AMD 处理器中可用的硬件性能计数器来实现。它们可以并且已经用于在软件中模拟较慢的加载延迟。与模拟器相比,这些技术基本上具有零性能开销(因为它们根本不进行任何模拟)。它们对于真实硬件也更准确,并且可以在真实硬件上测量仿真误差。问题是还没有人想出这样的模型……
  • ... 用于存储延迟(有一些建议,但它们并没有真正起作用)。因此,目前如果需要模拟较慢的存储延迟,唯一的方法是使用您建议的模拟器。通常,实际程序受加载延迟的影响比存储延迟要大得多。但是在现有和新兴的程序中,存储延迟确实会产生重大影响。我不同意你的第二个建议,因为我认为错误太高了。
  • @HadiBrais - 我或多或少完全忽略了存储延迟,因为这里甚至不清楚你想要什么。您想在存储出现在存储缓冲区之前添加时间吗?这看起来很奇怪,但它可以通过仪器来实现。当存储接近准备好离开缓存行时,是否要为缓存行的 RFO 请求增加时间?这似乎更像你想要的,但我看不出有任何方法可以在没有硬件支持的情况下实现它。
  • 当然,伙计。我在 Intel 上(当前)最喜欢的型号是 this,在 AMD 上查看 thisthis 是模拟写入延迟尝试失败的一个示例(但我并没有不尊重作者,我感谢他们的努力)。
猜你喜欢
  • 1970-01-01
  • 2011-02-06
  • 1970-01-01
  • 1970-01-01
  • 2018-11-04
  • 1970-01-01
  • 1970-01-01
  • 2011-08-26
  • 2010-09-17
相关资源
最近更新 更多