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