【问题标题】:How to compare the performance between two codes by static analyzing?如何通过静态分析比较两个代码之间的性能?
【发布时间】:2021-12-14 09:23:43
【问题描述】:

我最近在学习llvm。

我有一个 C 代号cal.c。现在,我对这段代码应用了两个不同的优化过程,并生成了两个不同的 IR 代码 - cal1.llcal2.ll

我如何比较它们之间的性能?

我尝试比较指令数和指令成本,但它们都不是很好的功能。 我认为指令数和性能、指令成本和性能之间没有关系。

那么,我如何比较两个 IR 之间的性能?

我不需要知道运行时间。 我只想知道哪个更快。

【问题讨论】:

  • 你是对的,这些尺寸之间几乎没有任何相关性。至于其他的……很难。真的,真的很困难,而且随着 CPU 变得越来越复杂,难度也在逐年增加。有时您可以通过利用代码的特殊特征来简化问题。例如如果两者中的一个总是与另一个相同加上一个内存屏障。祝你好运。
  • 如果不在给定的目标架构上生成低级程序集,您就无法判断哪个 IR 更快,并且结果将非常依赖于目标处理器。确实,例如,某些指令在 AMD 处理器上很慢,而在 Intel 上却很快,而两者都是 x86-64 架构。在某些情况下,即使是指令的顺序和它们所解决的问题也很重要。有一些工具可以估计生成的汇编代码的速度,但是它们还不是很好。此外,它们无法考虑与运行时相关的事件(例如缓存未命中和分支未命中)。
  • 我知道很难通过静态来衡量运行时间。但我只想比较两个 IR 之间哪个更快。我计算总成本的方式是使用来自 llvm 名称的模块 - cost model.cpp。在我看来,这个模块可以根据目标硬件来衡量成本。
  • 如果看哪个更快不取决于估计速度,那么它必须取决于其他东西。我唯一能想到的就是比较分析,以确定一个人做了另一个人所做的一切,然后做更多的事情,这使得它变慢了。您的问题并未涉及您的代码具有哪些属性可以进行这种比较分析,因此在某种程度上,您提出了一个问题并隐藏了可以用来回答的信息。

标签: performance llvm compiler-optimization


【解决方案1】:

这是一个难题,通常比仅在实际硬件上运行代码并测量哪个更快更难。它或多或少归结为使用“笔和纸”模拟硬件。您将需要目标系统的详细模型,包括管道和缓存行为等内容,然后使用此模型计算每条执行指令的成本。

【讨论】:

    【解决方案2】:

    llvm-mca 尝试通过重用 LLVM 编译器的 CPU 管道模型来静态估计汇编代码的性能:

    $ llvm-mca -mcpu=skylake foo.s
    Iterations:        300
    Instructions:      900
    Total Cycles:      610
    Total uOps:        900
    

    正如其他人所提到的,由于缺乏缓存和分支预测器模型、CPU 管道模型的不精确等,估计会不精确(通常非常不精确)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-09-02
      • 2010-10-07
      • 2021-07-08
      • 2010-12-02
      • 2022-11-22
      • 2017-05-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多