上周六上午,《纳秒级优化训练营》继续在远大中心进行。经过周五一天的铺垫,周六上午的知识之旅“渐入佳境”。营员之间,也由陌生变得熟悉,大家畅所欲言,或提问,或评论,房间里的气氛很活跃。
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呢?”
“这个世界就是草台班子...”
【未完待续】
(写文章很辛苦,恳请各位读者点击“在看”,欢迎转发)
*************************************************
正心诚意,格物致知,以人文情怀审视软件,以软件技术改变人生
扫描下方二维码或者在微信中搜索“盛格塾”小程序,可以阅读更多文章和有声读物
也欢迎关注格友公众号