|
1
9
没有什么公式可以应用,你必须衡量 .
同一uarch系列的不同版本上的相同指令可能具有不同的性能。例如
如果不测量或者不知道一些微体系结构的细节,你就不可能预测这些。我们期望FP-math操作不会是单周期延迟,因为它们比整数操作复杂得多。(因此,如果它们是单周期,则时钟速度对于整数运算设置得太低。)
通过在展开的循环中多次重复该指令进行度量。或者
完全地
展开时没有循环,但这样您就可以打败uop缓存并获得前端瓶颈。(例如,解码10字节
https://uops.info/
已经自动化了这个测试
对于每一条(非特权)指令的每一种形式,您甚至可以单击任何表项来查看它们使用了什么测试循环。e、 g.天湖
Agner Fog通过对重复一条指令的大型非循环代码块计时来创建他的指令表(您似乎正在读取)。 https://agner.org/optimize/ . 他的指令表的简介部分简要解释了他是如何测量的,他的微体系指南解释了不同x86微体系结构如何在内部工作的更多细节。不幸的是,在他手工编辑的表格中,偶尔会出现打字错误或复制/粘贴错误。 http://instlatx64.atw.hu/ 也有实验测量的结果。我认为他们使用了一种类似的技术,即重复一大块相同的指令,可能小到可以放入uop缓存。但它们不使用性能计数器来衡量每条指令需要什么执行端口,因此它们的吞吐量数字不能帮助您确定哪些指令与哪些其他指令竞争。 后两个来源已经存在了一个多世纪了uops.info公司,并覆盖一些较老的CPU,尤其是较老的AMD。 为了自己测量延迟,可以将每条指令的输出作为下一条指令的输入。
这个依赖链是7
我通常在Linux静态可执行文件中放入这样一个循环,只会生成一个
Understanding the impact of lfence on a loop with two long dependency chains, for increasing lengths
,增加了使用的复杂性
为了测量吞吐量,您可以使用单独的寄存器,和/或偶尔包含一个异或归零来打破dep链,并让无序的exec重叠。 不要忘了使用perf计数器来查看它可以在哪些端口上运行,这样您就可以知道它将与哪些其他指令竞争。(例如,FMA(p01)和shuffles(p5)根本不争夺Haswell/Skylake上的后端资源,只争夺前端吞吐量。)也别忘了测量前端uop计数:有些指令会解码以增加uop。
例如,如果FP multiply的吞吐量为0.25c(每个时钟4个),那么我们可以在Haswell上同时保持20个(5c延迟)。这比我们拥有的寄存器还多,所以我们可以使用所有16个寄存器,发现实际上吞吐量只有0.5c
更多通常是更好的;仅仅有足够的时间来隐藏延迟可能会因为不完美的调度而减慢速度。如果我们想疯了
在测量的吞吐量和延迟时也有类似的问题
我在Agner Fog的博客上发表了这篇文章:
https://www.agner.org/optimize/blog/read.php?i=415#860
. 我混合了
相关:有关整个代码块(包含不同指令)的静态性能分析,请参阅 What considerations go into predicting latency for operations on modern superscalar processors and how can I calculate them by hand? . (它使用“延迟”这个词来表示整个计算的端到端延迟,但实际上是询问一些小到足以让OoO exec重叠不同部分的事情,因此指令延迟和吞吐量都很重要。)
这个
|
|
Sweepy Dodo · JSON lite的格式化 9 月前 |
|
|
giantjenga · 优化整数向量到二进制向量的转换 10 月前 |
|
Zegarek · Postgresql递归查询未提供预期结果 10 月前 |
|
|
Joe · 为什么这两个查询之间的性能存在如此大的差异? 1 年前 |
|
tic-toc-choc · 在`dplyr中高效使用列表进行过滤` 1 年前 |