破纪录的IPC和让人喷饭的BUG

上周六上午,《纳秒级优化训练营》继续在远大中心进行。经过周五一天的铺垫,周六上午的知识之旅“渐入佳境”。营员之间,也由陌生变得熟悉,大家畅所欲言,或提问,或评论,房间里的气氛很活跃。

CPU工厂的硬指标

上午的第一讲讲的是时间测量,第二讲是时钟,第三讲是IPC,也就是每个时钟能执行的指令数(Instructions Per Cycle)。

IPC是衡量CPU工厂的硬指标,也是做纳秒级优化时考察代码好坏的常用手段。

测量IPC的最便捷方法是使用Linux上的perf工具,比如perf stat子命令。

周五下午,我便初步介绍过perf和IPC,周六上午继续带领大家使用这个工具“举一反三”。

和前一天一样,大家使用自己喜欢的环境做试验,有的用至强,有的用酷睿,也有人用AMD的Ryzen(锐龙)和EPYC。

在试验的过程中,大家时不时把一些截图发到微信群里。我很鼓励大家这么做。一个真实的实验结果常常胜过很多空泛的理论。

惊人的IPC

试验不总是顺利的,有时可能与预期的不一样。特别是做优化的时候,因为有各种噪声和干扰。

简单说,IPC的值越大越好,代表CPU工厂的效率高。但要提高IPC是不容易的事。

正当大家忙着使用perf测试不同环境和不同场景的IPC时,一位同学报告说测量出IPC超过10。

听到这个信息,我非常惊讶,因为这是不可能的事。每一种CPU微架构都有IPC的理论上限,比如Cortex A76的,IPC理论上限是4。

对于X86 CPU,VTune工具给出的理论上限是4,CPI为0.25, IPC是CPU的倒数,便是4。但我觉得,VTune的信息有待更新,对于最新的微架构,IPC的理论上限应该是6。

无论如何,IPC超过10是闻所未闻,绝对不可能的事。

但很快,截图发到了微信群里,的确是10.83。

上面图中有两个IPC值,一个是大核的,用cpu_core表示,值为10.83;另一个是小核的,用cpu_atom表示,值为0.86。

天才证明

看到10.83这样的结果,我是无论如何不相信的,坚信是哪里出了问题。

根据我多年的经验,多半是出BUG了。但是课堂上时间紧迫,不允许我上调试器分析,因此也不能立刻说出是哪里的问题。也不敢断言这就一定是BUG。听课的同学们,可能也不完全相信是BUG。

正在这僵持的窘境,经常“语出惊人”的李博士给出了一个惊人的猜测:可能是用大核的指令数去除小核的时钟数了。

大核的指令数是10, 758, 210, 141, 大约107亿。

小核的累计时钟数是993, 037, 493,大约9亿。

我看了一下这两组数字,感觉还真有可能是这么搞错了。就在我迟疑的时候,来自长沙的一位同学确认了:用计算器除了一下,还真是10.83。

这一下,全场的人都忍不住笑了,整个会议室笑声一片。

“这怎么搞的呢?”

“perf是常用工具啊,怎么有这么大的BUG呢?”

“这个世界就是草台班子...”

【未完待续】

(写文章很辛苦,恳请各位读者点击“在看”,欢迎转发)

*************************************************

正心诚意,格物致知,以人文情怀审视软件,以软件技术改变人生

扫描下方二维码或者在微信中搜索“盛格塾”小程序,可以阅读更多文章和有声读物

Image

也欢迎关注格友公众号

Image

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值