[原]超线程SMT究竟可以快多少?(AMD Ryzen版 )
2021-10-20 01:32:55 Author: blog.csdn.net(查看原文) 阅读量:39 收藏

昨天我们用Intel I9的10核,每个核2个threads的机器跑了内核的编译:

超线程SMT究竟可以快多少?

今天,我换一台机器,采用AMD Ryzen。 

默认情况16核,每个核2个threads,共32个CPUs:

42da3a6355781df0692d78a0d3825840.png

下面编译内核:

290fe43b5a8ef51f50a1f2df5cc03ff7.png

大约需要53秒。记得昨天用Intel I9 10核20线程需要2分钟30秒左右。

再来一遍:

5cc3ed3efa443d894dc548502f88941c.png

这说明make clean, drop_caches后时间也差不多。51秒,53秒左右的正常抖动范围。

现在我们关闭smt,只保留16个CPU:

41c7ceb1e1f9134a117b5132edde9002.png

具体的关闭方法就是:

sudo sh -c 'echo off > /sys/devices/system/cpu/smt/control'

这样只剩下16个CPU,下面来编译:

8dad085cb1ac7749f5955f3be6543d87.png

时间57秒,相对于51、53秒,速度下降不到10%。

这说明超线程SMT对编译内核这个workload的性能的提升绝对没有达到100%,甚至都没有达到10%。

我们现在重新开启超线程:

sudo sh -c 'echo on > /sys/devices/system/cpu/smt/control

看一下哪个CPU和哪个CPU是thread sibling:

d7103d855baaa1520cf3eed61a6766df.png

看起来CPU0和CPU16是一对,CPU1和CPU17是一对,依次类推。

刚才我们关闭SMT是把CPU16-CPU31全关了,只留下每对里面的1个CPU,也就是留下了CPU0-CPU15。

在开启SMT的时候(假设蓝色和红色是一个CORE里面的两个CPU):

449513a5c9a0b6ba8411bc0851edf875.png

在关闭SMT的时候,等于每对里面只留1个CPU:

de8bb0530f8097d0a3c7dbe36373d126.png

现在我们换一种关法,一对对关,只留下8对,也就是8个core:

a6723935e178e86bc5032e9e8b81723c.png

指令如下:

833582c82afe0b624cf06e08ce8485e0.png

实现效果如下:

65c178c66de8613fda61b3dc9bb9f930.png

再重新编译内核:

089ed932d47e3ef5a150ab31c41f677f.png现在耗时是1分21秒,相对于所有CPU全开,下降了很多,时间增大了59%,当然没有达到2倍

再想想昨天的Intel I9,关闭5个完整核耗时是3分10秒,全开10核是2分30秒,Intel一半核工作和所有核同时工作的差距远不如AMD那么明显

所以可以看出,就内核编译这个workload而言,AMD的16core相对于8core,性能的scale会更加成正比。当然AMD开关SMT,对内核编译这个workload而言,影响小于10%,而Intel I9的影响有14%。

很多童鞋昨天留言,说编译内核有一定的IO bound,另外提到link阶段是单线程,还有的童鞋说是Intel Turbo的影响,这些我们都认为是有一定道理的。但是,我始终坚信,profiling是检验猜想的唯一标准,后面有空再写一篇文章来profiling一些究竟是为什么。


文章来源: https://blog.csdn.net/21cnbao/article/details/120857918
如有侵权请联系:admin#unsafe.sh