是否存在确定性(如同每次运行的结果)架构模拟器这样的事情?它是测试编译器/解释器的基准。
我不意味着一个模拟器只是在任何模拟架构上运行你的程序,而是基于对生成的代码的分析来计算效率/速度索引的东西(例如,东西)对于每条指令所花费的时间,它将具有确定性值。)
我可以在真实机器上计算基准统计数据,但确定性结果会消除我机器的特殊性,让我看到小优化的效果。
答案 0 :(得分:2)
英特尔的IACA是一种静态分析工具。 What is IACA and how do I use it?。但它只适用于单个循环,并不模拟缓存效果,只模拟管道。 (并且它假设几乎理想的OoO调度,我认为,所以可能没有找到ROB大小限制,只有前端与执行端口相比,循环携带的依赖性延迟瓶颈)。另外,IACA在其成本模型中存在一些缺陷(例如micro-fusion of indexed addressing modes are wrong for Haswell的解除规则)。
AFAIK,没有任何周期准确的 x86模拟器可供任何现代微架构公开使用。我们只有模拟器甚至没有尝试以与任何真实硬件相同的速度运行,尽可能快,如BOCHS和qemu。我确信英特尔和AMD内部都有模拟器软件来验证CPU设计并模拟其性能。
您可以为解释仿真器(如BOCHS)中的每条指令分配一个周期成本,并获得一个确定性数字,也可以为缓存建模(有缓存模拟器)。每次运行它都会是一样的,但它不会与任何真实硬件上的运行时间相对应!
确定性远远不足以使调整软件变得有趣。现代x86 CPU具有许多用于无序执行的微体系结构状态。我们经常可以预测它们将如何运行循环(http://agner.org/optimize/以及the x86 tag wiki中的其他性能链接)非常接近,但是在更大范围内,有很多东西只有供应商知道才能知道因此,即使我们有时间,也无法编写真正准确的模拟器。像分支预测这样的事情在一般意义上是已知的,但细节尚未完全反向设计。但是,在实际代码中,分支预测是使每个时钟接近3到4个融合域(前端)uop的高度流水线CPU维持的关键部分。
如果你想为多核机器建模,事情变得更加复杂,而SMT / HT在共享核心的线程之间增加了很多复杂性。它在真实硬件中几乎没有确定性,因为小的时序变化会导致不同的线程越来越不同步。
为了真正有用,您希望能够在Sandybridge,Haswell,Skylake,Bulldozer,Ryzen以及Silvermont上测试您的代码。也许是具有不同缓存量的那些变体的不同变体,以及L3 /内存延迟不同的服务器与桌面。 (即使总带宽较高,多核服务器的非核心延迟也会明显变差,单线程带宽也会降低。)
所以“x86架构”的确定性模拟器的整个想法很奇怪。你可以简单地制作一个,只需给每个指令一个周期的成本,但那是完全不现实的。