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