是否有可用的确定性架构模拟器?
Are there deterministic architecture emulators available?
是否存在确定性(每个运行结果相同)架构模拟器?是为了基准测试compilers/interpreters.
我做 不是 意思是一个模拟器,它只是 运行 在任何模拟架构上运行你的程序,但是会根据以下内容计算 efficiency/speed 索引的东西生成代码的分析(例如,对于每条指令所花费的时间,事物将具有确定性值)。
我可以在真机上计算基准统计数据,但确定性结果会消除我机器的特殊性并让我看到小优化的效果。
Intel 的 IACA 是一种静态分析工具。 What is IACA and how do I use it?. But it only works for a single loop and doesn't model cache effects, only the pipeline. (And it assumes nearly-ideal OoO scheduling, I think, so probably doesn't find ROB-size limits, only front-end vs. execution port vs. loop-carried dependency latency bottlenecks). Plus IACA has some bugs in its cost model (e.g. its unlamination rules for micro-fusion of indexed addressing modes are wrong for Haswell).
AFAIK,没有 cycle accurate x86 模拟器可公开用于任何现代微体系结构。我们只有仿真器,它们甚至不尝试以与任何真实硬件相同的速度 运行,尽可能快,例如 BOCHS 和 qemu。不过,我确信英特尔和 AMD 内部有模拟器软件来验证 CPU 设计并模拟它们的性能。
您可能会为像 BOCHS 这样的解释仿真器中的每条指令分配一个周期成本,并获得一个确定性数字,也可能对高速缓存建模(有高速缓存模拟器)。每次 运行 它都会是一样的,但它不会对应任何真实硬件上的 运行ning 时间!
确定性还不足以让软件调优有趣。现代 x86 CPUs 有很多用于乱序执行的微架构状态。我们通常可以非常接近地预测他们将如何 运行 一个循环 (http://agner.org/optimize/, and other performance links in the x86 tag wiki),但在更大范围内,有许多事情只有供应商知道,所以我们无法编写真正准确的模拟器,即使我们有时间。像 b运行ch-prediction 这样的东西一般都是已知的,但细节还没有被完全详细地逆向工程。但是 b运行ch 预测是使大量流水线 CPU 在实际代码中维持每个时钟接近 3 到 4 个融合域(前端)微指令的关键部分。
如果您想为多核机器建模,事情会变得更加复杂,而 SMT/HT 在共享一个核心的线程之间增加了很多复杂性。它在真实硬件中几乎没有确定性,因为小的时序变化会导致不同的线程越来越不同步。
要真正有用,您需要能够在 Sandybridge、Haswell、Skylake、Bulldozer、Ryzen 和 Silvermont 上测试您的代码。也许具有不同数量的缓存的不同变体,以及 L3 / 内存延迟不同的服务器与桌面。 (多核服务器的非核心延迟明显更差,单线程带宽更低,尽管总带宽更高。)
所以 "the x86 architecture" 的确定性模拟器的整个想法很奇怪。您可以通过为每条指令指定 1 个周期的成本来简单地实现一个,但那是完全不现实的。
是否存在确定性(每个运行结果相同)架构模拟器?是为了基准测试compilers/interpreters.
我做 不是 意思是一个模拟器,它只是 运行 在任何模拟架构上运行你的程序,但是会根据以下内容计算 efficiency/speed 索引的东西生成代码的分析(例如,对于每条指令所花费的时间,事物将具有确定性值)。
我可以在真机上计算基准统计数据,但确定性结果会消除我机器的特殊性并让我看到小优化的效果。
Intel 的 IACA 是一种静态分析工具。 What is IACA and how do I use it?. But it only works for a single loop and doesn't model cache effects, only the pipeline. (And it assumes nearly-ideal OoO scheduling, I think, so probably doesn't find ROB-size limits, only front-end vs. execution port vs. loop-carried dependency latency bottlenecks). Plus IACA has some bugs in its cost model (e.g. its unlamination rules for micro-fusion of indexed addressing modes are wrong for Haswell).
AFAIK,没有 cycle accurate x86 模拟器可公开用于任何现代微体系结构。我们只有仿真器,它们甚至不尝试以与任何真实硬件相同的速度 运行,尽可能快,例如 BOCHS 和 qemu。不过,我确信英特尔和 AMD 内部有模拟器软件来验证 CPU 设计并模拟它们的性能。
您可能会为像 BOCHS 这样的解释仿真器中的每条指令分配一个周期成本,并获得一个确定性数字,也可能对高速缓存建模(有高速缓存模拟器)。每次 运行 它都会是一样的,但它不会对应任何真实硬件上的 运行ning 时间!
确定性还不足以让软件调优有趣。现代 x86 CPUs 有很多用于乱序执行的微架构状态。我们通常可以非常接近地预测他们将如何 运行 一个循环 (http://agner.org/optimize/, and other performance links in the x86 tag wiki),但在更大范围内,有许多事情只有供应商知道,所以我们无法编写真正准确的模拟器,即使我们有时间。像 b运行ch-prediction 这样的东西一般都是已知的,但细节还没有被完全详细地逆向工程。但是 b运行ch 预测是使大量流水线 CPU 在实际代码中维持每个时钟接近 3 到 4 个融合域(前端)微指令的关键部分。
如果您想为多核机器建模,事情会变得更加复杂,而 SMT/HT 在共享一个核心的线程之间增加了很多复杂性。它在真实硬件中几乎没有确定性,因为小的时序变化会导致不同的线程越来越不同步。
要真正有用,您需要能够在 Sandybridge、Haswell、Skylake、Bulldozer、Ryzen 和 Silvermont 上测试您的代码。也许具有不同数量的缓存的不同变体,以及 L3 / 内存延迟不同的服务器与桌面。 (多核服务器的非核心延迟明显更差,单线程带宽更低,尽管总带宽更高。)
所以 "the x86 architecture" 的确定性模拟器的整个想法很奇怪。您可以通过为每条指令指定 1 个周期的成本来简单地实现一个,但那是完全不现实的。