正確認識超線程(HT)技術對計算化學運算的影響
正確認識超線程(HT)技術對計算化學運算的影響
文/Sobereva@北京科音
First release: 2017-Oct-8 Last update: 2022-Oct-4
1 亂談超線程(HT)技術
無數年前就經常看有人在一些討論計算化學的地方鼓吹要在BIOS里關閉超線程(HT)技術,說是會嚴重降低性能。雖然我總在不斷辟謠,避免很多人被以訛傳訛干出關閉HT這樣的傻事情,但是鼓吹關閉HT的言論依然時不時會冒出來。被誤導的人基本都是對HT缺乏最基本的認識,把CPU制造商的好心當驢肝肺。諸如最近有個人,貌似是看到關了HT的時候在任務管理器里看到CPU占用率是100%,而沒關HT的時候占用率是50%,便以為關了HT導致CPU利用率提升,于是開始在群里號召大家要關HT,真是令人無語得很。這里寫一個關于HT小文,結合實際測試數據,希望能夠令讀者正確認識HT對計算化學運算的影響。HT技術早在2002年就被Intel提出了,用在奔4和相應時代的XEON上,如今AMD也開始支持了。HT提出的初衷是提升CPU的多任務執行能力。假設CPU有N個物理核心(即管線完整的CPU核心),如果CPU支持HT技術的話,操作系統則會識別到有2N個邏輯核心。如果操作系統對HT技術已經做過優化(從XP開始就已經做了優化),那么對于執行多任務或者做并行運算的情況,HT技術原理上可以使得CPU的實際執行能力超過原本的N個物理核心。
HT的原理簡單來說就是讓CPU同時執行更多的線程,讓CPU更忙,減少CPU執行單元空閑率,從而盡可能充分壓榨CPU的運算能力。示意圖如下

對于多任務/并行運算,顯然具有N個物理核心的CPU在利用HT時,性能遠遠達不到真正有2N個物理核心但沒有HT技術的CPU,但是比不開HT的時候性能會有所提升。提升多少看具體情況,提升百分之十幾是很常見的。但是,也有很多情況,由于資源爭搶,開了HT后反倒導致計算能力下降。
對于具有HT技術的有N個物理核心的CPU,跑計算化學程序時,一般來說最佳使用方式是:開著HT,但把并行核數設為N。
之所開HT時不建議將并行核數設為邏輯核數,即2N,是因為此時雖然有可能跑得更快,但撐死了也就比N核并行時快百分之十幾,并不顯著,而且此時還有可能由于資源爭搶使得計算速度變得更慢的可能。到底是變得更快還是更慢和程序關系極大,需要實測。另外,并行核數設大時,所需內存量也相應地越大(不是線性關系,具體看程序),還不排除有時候并行核數加倍后當前物理內存不夠跑當前任務的。反之,開著HT,但只用N核來并行,則CPU多出來的一丁點計算能力可以處理一些后臺任務,可充分避免系統在滿載時變得卡頓。
至于一些人鼓吹關閉HT,就顯得很莫名其妙了,明明HT能夠給CPU帶來額外計算能力處理后臺事務,或者用于更快地跑完一些輕量級任務,何故不要?在我看來,不得不關閉HT只有一種情況,也就是使用這臺機子的用戶(們),或者在這臺機子上跑的某些程序,特別愚蠢,非要把2N個邏輯核心都占滿不可(也可能是誤以為這臺機子有2N個物理核心所致),由此可能造成資源爭搶拖慢整體運行效率,因此只能靠關了HT來強行避免。
現在的年輕人可能沒那么強烈的感覺,想當年,民用CPU還都是單核,如果比如一邊壓縮文件,一邊聽mp3的話,音樂就會變得斷斷續續,因為計算資源基本都被壓縮程序給占了,音樂播放器就執行不順暢了。反之,對于有HT技術的CPU,有兩個邏輯核心,CPU能同時執行兩個線程,盡管遠不是兩個物理核心的執行速度,但至少音樂就不會斷斷續續了。雖然現在CPU物理核心數都很多了,PC、筆記本都已經普及4核了,但是得益于HT技術,即便vmware虛擬機里正在用四核跑計算任務,在主機里跑應用程序也不會感到卡頓。但如果把HT關了,此時在主機里的體驗就差多了。
值得一提的是,在許多系統監視器、任務管理器類型的程序里,當所有邏輯核心全占滿的時候,才會顯示CPU利用率100%。因此,開HT時用N個核并行滿載時會顯示50%利用率,而2N個核并行時會顯示100%利用率。前者,即推薦的方式,雖然看起來只利用了50%的CPU,但這50%實際上可以姑且理解為對應于此時CPU真實運算能力的>90%,因此幾乎沒有浪費CPU性能。而有人發現關了HT后CPU利用率成100%了,居然還因此罵HT損失了CPU性能,顯然缺乏對HT的最基本了解,關了HT使得CPU運算能力失去了被壓榨出額外油水的可能。
2 HT對計算耗時的影響
下面,我們通過實際計算化學程序的執行耗時來看看恰當和不恰當利用HT所產生的影響。測試的機子是雙路E5-2696 v3(2*18核=36個物理核心),內存256GB,系統CentOS 7.3 64bit。2.1 Gaussian
首先我們測試Gaussian16 A.03 Linux 64bit版,內存使用量上限設240GB。共涉及以下5個任務DFT SP:含有168個原子的有機體系DFT單點計算。關鍵詞# b3lyp/6-311G*
TDDFT:含有61個原子的Ru配合物的TDDFT計算。關鍵詞#p B3LYP/genecp TD(nstates=30),對Ru和其它原子分別用SDD和6-311G*
MP2 SP:含31個原子的有機體系的MP2單點計算,不利用對稱性。關鍵詞:#p MP2/def2TZVP nosymm
DFT freq:含40個原子的硼-氮納米管的DFT振動分析,不利用對稱性。關鍵詞:#p B3LYP/6-311G* freq nosymm
CCSD(T):CCSD(T)/cc-pVTZ計算苯胺的單點,無對稱性
以下是測試結果:

同樣使用36核,關閉HT后,某些測試的耗時比開HT時有輕微的縮短,但變化甚微,可忽略不計,而CCSD(T)的耗時還反倒有所增高。因此,刻意去關HT純粹多此一舉,如果此時系統里還有人跑一些其它任務,那么肯定是開著HT的時候Gaussian總耗時最低。
從G16開始,開發者鼓勵用%CPU代替%nproc來指定并行計算時用的核心。原先%nproc并沒有指定用哪些CPU核心,只是指定了總數目,具體用的CPU核心由操作系統自動調度。而%CPU則可以指定只用哪些邏輯核心來跑任務(即做了綁定,也即設置了affinity),核心序號從0開始,因此%CPU=0-35代表只使用1~36號邏輯核心來并行。測試發現用%CPU=0-35和%nproc=36的耗時基本也沒有太大區別,因此也沒必要刻意用%CPU。
還測試了%CPU=36-71的情況,為省時間只測了DFT SP任務,耗時和%CPU=0-35完全一樣。最后還測了%CPU=0-71/2,這代表72個邏輯核心里,使用0,2,4,6,8,10,12...70號核心,共36個核來執行,數據可見這種情況下計算速度最慢。究其原因,應當是出現了算Gaussian用的邏輯核心正好對應于相同物理核心的情況,此時顯然會造成嚴重資源爭搶。我們假設0,36、1,37、2,38...35,72這樣每一對邏輯核心實際上對應于一個物理核心,則運算任務分給0或36號邏輯核心時,實際上都是第一個物理核心在執行。而當這兩個邏輯核心都有任務在跑時,則這個物理核心被剝削,一個人同時干兩件事。%CPU=0-71/2方式運行的情況極為別扭,其中序號為偶數的邏輯核心都會被利用,因此0,36這兩個對應于同一個物理核心的邏輯核心都被利用了,造成了嚴重資源爭搶,而1,37這兩個對應于同一個物理核心的邏輯核心則完全閑著沒事干,造成了極大的資源浪費,性能不爛才怪。
使用%nproc=36的時候,由于操作系統已經對HT優化過,所以并不會(或極少)出現兩個Gaussian線程正好全都塞給一個物理核心計算的情況。但更多核數并行時,一個物理核心跑兩個Gaussian線程就免不了了。
前面說%CPU可以將Gaussian的線程與CPU內核綁定,這系統源監視器中可以看到。比如%CPU=0,會看到一直都是一個核心在跑:


如果關掉HT,使用36核的話,那么36核一直都會滿載著,也不會有頻繁調度的問題。而原理上說,開HT,但是還用36核,有可能因為36個線程在72個邏輯核心之間分配的頻繁切換(甚至兩個線程塞給同一個物理核心對應的邏輯核心)而導致性能損失。不過,之所以沒必要關HT,一方面是因為在G16里直接用%CPU就已經可以避免頻繁調度導致的潛在的性能損失問題,其二,根據上面的測試數據,并未觀測到關閉HT或使用%CPU綁定核心帶來的明顯性能提升。關了HT還導致沒有額外富余出來的閑余計算資源用于處理后臺和用戶的一些雜務。
2.2 ORCA
為了讓“應當關閉HT”的言論進一步破產,這里再測試另一個主流量化程序ORCA 4.0.1.2。此程序通過MPI并行,和Gaussian的OpenMP并行機制差異明顯。測試的任務有兩個,一個是CCSD(T)/cc-pVTZ計算苯胺,另一個是RI-PWPB95/def2-QZVPP計算前述的硼-氮納米管。結果如下:開HT,用36核
CCSD(T):14min
RI-PWPB95:22m58s
關HT,用36核
CCSD(T):14min
RI-PWPB95:22m50s
開HT,用72核
CCSD(T):19min29s
RI-PWPB95:31m25s
由數據可見,開HT時并行核數超過物理核心數依然導致性能猛降。刻意關HT幾乎沒有帶來絲毫益處。
2.3 GROMACS
這里再測試用戶最多的分子動力學程序GROMACS的情況。版本是2016.3,體系是三萬六千原子的蛋白質+水體系,跑100ps動力學。GROMACS的mdrun可以通過-pin on來強制要求CPU核心與mdrun線程綁定,類似于%CPU。下面來看測試結果開HT,用72核: 87.053 ns/day 99.252s
開HT,用36核: 77.363 ns/day 111.684s
開HT,用36核,-pin on:81.582 ns/day 105.908s
關HT,用36核: 83.199 ns/day 103.85s
關HT,用36核,-pin on:83.164 ns/day 103.893s
這回發現,開HT且啟用全部邏輯核心并行的時候,性能比只用物理核心時計算性能略有提升,這一定程度體現出量化程序和MD程序在算法、程序特征上的差異。但是注意,即便是GROMACS,啟用全部邏輯核心也并非總能令性能更好,需要根據具體任務進行測試。但如果你懶得測試,索性就用物理核心數并行就完了,注意此時一定要用-pin on,肯定會令性能有所提升,有時提升還挺大。至于關HT,沒什么意義,盡管可能令性能有可以忽略不計的提升。關HT時用不用-pin on對結果就沒有影響了。
2.4 Multiwfn
再來看看用最流行的波函數分析程序Multiwfn的3.4.1(dev)版在不同情況下的計算速度。這里對一段碳納米管計算電子密度的拉普拉斯函數的格點數據,格點數200*200*200。
開HT, 用36核:84s
開HT, 用72核:91s
關HT, 用36核:83s
再次證明,開HT時用超過物理核心數并行時在多數情況會造成性能下降,而關HT完全是多此一舉。
也值得注意的是,有的CPU滿載時能達到的頻率和開不開HT有明顯關系。比如AMD EPYC 7R32,我實測發現開HT的話全核滿載頻率平均在3.0GHz,關閉HT的話能達到3.3GHz,并行核數等于物理核心數時后者表現出的性能更好。這種情況確實關了HT有益,這臺機子我也是關了HT用。大家可以針對自己用的CPU實測一下開不開HT的時候滿載頻率,如果沒什么差異的話就沒必要刻意關HT。