超線(xiàn)程SMT究竟可以快多少?(AMD?Ryzen版?)
今天,我換一臺(tái)機(jī)器,采用AMD Ryzen。?默認(rèn)情況16核,每個(gè)核2個(gè)threads,共32個(gè)CPUs:
下面編譯內(nèi)核:大約需要53秒。記得昨天用Intel I9 10核20線(xiàn)程需要2分鐘30秒左右。
再來(lái)一遍:這說(shuō)明make clean, drop_caches后時(shí)間也差不多。51秒,53秒左右的正常抖動(dòng)范圍。
現(xiàn)在我們關(guān)閉smt,只保留16個(gè)CPU:具體的關(guān)閉方法就是:
sudo?sh?-c?'echo?off?>?/sys/devices/system/cpu/smt/control'
這樣只剩下16個(gè)CPU,下面來(lái)編譯:時(shí)間57秒,相對(duì)于51、53秒,速度下降不到10%。這說(shuō)明超線(xiàn)程SMT對(duì)編譯內(nèi)核這個(gè)workload的性能的提升絕對(duì)沒(méi)有達(dá)到100%,甚至都沒(méi)有達(dá)到10%。
我們現(xiàn)在重新開(kāi)啟超線(xiàn)程:
?sudo?sh?-c?'echo?on?>?/sys/devices/system/cpu/smt/control
看一下哪個(gè)CPU和哪個(gè)CPU是thread sibling:看起來(lái)CPU0和CPU16是一對(duì),CPU1和CPU17是一對(duì),依次類(lèi)推。剛才我們關(guān)閉SMT是把CPU16-CPU31全關(guān)了,只留下每對(duì)里面的1個(gè)CPU,也就是留下了CPU0-CPU15。
在開(kāi)啟SMT的時(shí)候(假設(shè)藍(lán)色和紅色是一個(gè)CORE里面的兩個(gè)CPU):在關(guān)閉SMT的時(shí)候,等于每對(duì)里面只留1個(gè)CPU:
現(xiàn)在我們換一種關(guān)法,一對(duì)對(duì)關(guān),只留下8對(duì),也就是8個(gè)core:
指令如下:
實(shí)現(xiàn)效果如下:
再重新編譯內(nèi)核:現(xiàn)在耗時(shí)是1分21秒,相對(duì)于所有CPU全開(kāi),下降了很多,時(shí)間增大了59%,當(dāng)然沒(méi)有達(dá)到2倍。再想想昨天的Intel I9,關(guān)閉5個(gè)完整核耗時(shí)是3分10秒,全開(kāi)10核是2分30秒,Intel一半核工作和所有核同時(shí)工作的差距遠(yuǎn)不如AMD那么明顯。
所以可以看出,就內(nèi)核編譯這個(gè)workload而言,AMD的16core相對(duì)于8core,性能的scale會(huì)更加成正比。當(dāng)然AMD開(kāi)關(guān)SMT,對(duì)內(nèi)核編譯這個(gè)workload而言,影響小于10%,而Intel I9的影響有14%。
很多童鞋昨天留言,說(shuō)編譯內(nèi)核有一定的IO bound,另外提到link階段是單線(xiàn)程,還有的童鞋說(shuō)是Intel Turbo的影響,這些我們都認(rèn)為是有一定道理的。但是,我始終堅(jiān)信,profiling是檢驗(yàn)猜想的唯一標(biāo)準(zhǔn),后面有空再寫(xiě)一篇文章來(lái)profiling一些究竟是為什么。