很多人看到現在的CPU市場,都會感嘆AMD在相同的價位,往往會提供更多核心數,線程數的產品,而Intel往往是頻率稍高,但同樣的核心數往往比AMD更貴,Intel為何在核心數上處於劣勢?僅僅是因為Intel認為「多核無用」嗎,還是因為技術原因延緩了Intel擴展多核性能的步伐?那什麼樣的技術問題讓Intel在核心數大戰中數量處於下風?這真的代表Intel競爭力不足了嗎?
擴展多核有哪些益處?
多核CPU很顯然,是一個完整封裝的CPU產品中擁有多個理論上可獨立工作的CPU內核的處理器,這裡的多個內核可同時並行的執行一個任務中的多個線程,或者並發性的在不同的核心上執行不同的任務,每個內核理論上都有專屬於自己的前端取指解碼單元,緩衝區,執行單元,寄存器,緩存以及總線資源,現代多核CPU還擁有可共享的資源,比如最後一級緩存,內存總線等,都是能被一個CPU裡的各個內核共享的,通過特定的總線保持數據的同步和交換以及一致性。
擁有更多核心的好處無疑是可以同時更快的執行某個可以並行或者並發的任務,我們往往想著一條路10個人修需要1個月,20個人就只需要半個月了,或者我們可以更好的同時執行多個不同的任務,比如我們可以把10個單線程滿載的負載,合理分配到10個核心上執行,這樣一定時間內,CPU就可以完成10個任務了。
並行和並發具體怎麼區分?
並發實際上包含了並行,並行更像是並發中的特殊情況,並發可以理解為順序的反義詞,也就是像亂序一般的執行方式,比如要做飯,一邊燒水,等水開的時間你可以去切菜,然後淘米,如果有幾個人,那就多個人在執行這些事情,他們就像是在並發執行那樣,而不是順序的,等著水燒開了才去切菜,然後再去淘米煮飯 並行就像是一個特殊情況,雖然也是同時執行多個任務(線程),但是會強調執行的同時而非順序的問題,比如切菜的時候同時幾個地方在切,比如計算1+2+3+...+100,會同時分成幾個部分同時計算比如1加到20和21加到40,41加到60...這樣的任務可以同時進行,這也更像是循環展開的並行優化方法。
單核處理器就無法執行並發和並行任務了嗎?很多人認為單核處理器就一定只能執行單個任務,與並行和並發毫無關係,實際上現代處理器可以實現ILP和DLP,ILP便是指令級並行,通過分析指令流,只要彼此互相不依賴,就可以同時發射多個指令到執行單元並順利執行然後retire,就實現了多個指令被同時執行的目的,實現了多個指令的並行,循環展開就是一種典型的指令級並行優化方法,ILP的數據並行中也存在DLP,比較典型的實現是SIMD,也被稱為向量並行,單個指令打包多個數據的計算,如SSE,AVX,這樣同時也實現了多個數據的處理。
單核單線程處理器只能同時執行一個線程內的多個指令並行和數據並行,那麼能不能實現多個線程的並發?顯然可以,單核cpu存在多線程,但傳統單核單線程處理器並不在同一時刻運行這些線程 每個線程就緒後都會等待調度器分配cpu給線程 可能過一會又把cpu分配給另一個線程,實際單一時刻永遠只會單線程在跑,這就是單核處理器的並發執行多線程的概念,而之後,處理器加入的同步多線程技術使得一個CPU內核一旦某個線程出現阻塞,便可立即在單個時鐘周期的開銷下調度到另一個線程,並利用其固有的指令隊列,緩衝區資源來利用閒置執行資源進行並發執行,由於這個切換速度很快,看上去就像是"同時"在處理多個線程一樣實現了類似線程並行的效果,也可以這麼說,單核處理器存在多線程的並發,但嚴格來說不能實現多線程的並行,只能實現一個線程內的指令級和數據級並行。
同步多線程的快速切換能力讓程序看上去是多個線程同時執行的,能大幅提高總體執行單元利用率
我們日常生活並行與並發的需求很高嗎?
很多人的理解是,如果我一邊上網,然後聊天,後臺開著音樂播放器,網頁或者本地的電影,這樣就是高並發使用場景了,就非常迫切的需要多核多線程,實際上CPU每秒可以執行數十億個指令周期,一個5GHz的處理器擁有50億個時鐘周期,而前面說到,即使是單個核心,也可以同時執行多個指令和多個數據的處理,實現多線程的並發,這麼一來CPU每秒可以執行的指令和數據量相當龐大,你的日常上網,聊天,看電影可能加起來也就能佔用1個核的資源,CPU即使在一個內核資源的情況下,就可以保證多個前臺輕量日常使用加上很多後臺掛起的程序的系統無縫運行了
系統運行時有數百個進程和上千個線程存在,但不代表你需要一百核處理器
那我們什麼情況下才能充分運用向量並行和多線程並發性能?
往往伺服器的場景使用才能並發多個高負載需求,從而利用多核處理器的多線程高並發性能,日常生活中我們的使用更多的是單個大型任務,通過並行優化從而使得程序變得高度並行,從而讓我們從多核處理器中受益,同時這樣的任務也會充分利用指令級並行和數據級並行的特點,將多核,寬矢量,多發射的現代處理器性能充分發揮出來,如基於光線追蹤的渲染,每條光線的處理可以並行的處理,如大學中進行矩陣計算為基礎的科學運算和AI計算的科研工作,矩陣的乘法加法計算可以並列,分塊的進行,比如影音圖像處理,視頻愛好者和主播的視頻的編碼工作,不同圖像每幀之間,同一幀的不同位置的編碼也可以並行的進行。
那回到最初的問題,既然多核性能能加大處理器的峰值性能,為什麼Intel的核心數沒有那麼多呢?
實際上,用戶要想獲得最佳的性能體驗,不僅需要一個強大的峰值性能,也需要儘可能少的短板,擴展一倍的核心數,固然相當於比過去處理器多出了一倍的執行單元,但提高並行性能如上所述,可以通過寬流水線,多發射,寬矢量指令SIMD來實現,同時通過加深亂序執行性能,分支預測性能和同步多線程SMT性能,在把單個核心的並行和並發潛力發掘後,再去擴寬多核心的實現,所以,從酷睿i系列開始,雖然Intel處理器一直保持四核心八線程,但實際上SIMD矢量位寬從128位到256位再到256位乘加融合,以及最新Icelake的512位乘加融合執行性能,同時亂序執行窗口從128個隊列擴大到Skylake的224個隊列,Icelake還擁有超過300個隊列的亂序窗口和重排緩衝區,AGU埠也不斷增加,可以說,Intel在儘可能挖掘單核心下的並行並發能力後,才去堆核,因為多核的運用協調一致運行的難度更高,能在一個核內完成顯然更為有利於用戶和開發者的使用,所以Intel在不斷優化設計更寬的流水線,更強大的執行單元,更深的緩衝區,而在10nm受阻,微架構的優化進度放緩後,Intel便開始了增加核心數的手段,從8代的6核,到9代的8核,10代的10核,逐漸提高了核心數量,但架構的變化則基本沒有,只有Icelake產品是全新的架構,但依舊為4核心8線程。但無論如何,即使是高度並行的程序,也需要多線程+矢量化雙管齊下,才是最佳的並行性能
多核擴展有哪些挑戰:
很多人可能認為,只要有了對應的總線,放入了對應的核心,多核就能理所應當的運行起來,有人會說Intel怎麼核心堆的這麼慢,其實當代處理器越來越受到ILP wall,memory bound和power wall的限制,性能提升開始實質性變慢,即一味擴大指令級並行度,處理器的亂序窗口和前端解碼無法保證填滿如此多的執行單元,同時功耗密度的提高限制了頻率的增長,而Memory Bound則反映了內存速度與CPU速度的差距,而且會逐漸限制CPU同時處理更多的數據,往往密集計算,CPU的性能被內存帶寬所限制,而日常快速響應的請求,受制於內存的延遲,但也正是因為任務量的變化,處理器開始越來越重視多核的設計,多核時代已經來臨,只不過要想真正做好,需要克服相當多的系統障礙,才能做到最佳的效果。
所以要想真正做到最好的多核體驗,硬體方面需要一個強勁的單核性能作為基礎,同時控制內存系統(包括DRAM和Cache)的延遲,同時要隨著核心數量和數據處理量的提高,儘可能提高內存的帶寬,又要保證此時的延遲不能過高,同時多個核心,尤其是遠端的核心通信的延遲更低,經過的中轉越少越好,同時軟體也需要與時俱進,用戶要有足夠大的數據處理需求,同時誕生更多高性能的常用軟體,而對多核的調用,需要多個層面的軟體開發者和硬體工程師配合才能充分達成,離不開各種高性能庫的應用,這些庫都是精通硬體與軟體的工程師貢獻的,在這種情況下,多核性能才變得真實有效,有利於用戶的實際體驗。而這些周邊配套的發展不是一蹴而就的,需要互相促進,互相發展,同時一些任務註定難以被「並行」,正如一個例子,我們不可能同時將一棟樓的第二層和第三層同時由兩組人進行修建,而只能同時修建第二層,然後才是第三層,而第二層修好,到開始修第三層這部分,就很難並行的施工,這意味著不受並行優化影響的核心頻率值也永恆的重要,而全方位發展的一個代價就是,付出的成本會更高,也就很難過於激進的推進某一個參數,比如單純提高核心數而不顧內存帶寬和因此帶來的延遲增長。
並行的難題也被一個叫 「阿姆達定律」概括,即一個系統中,不可避免有一些資源必須串行訪問,這限制了我們的加速比,這其中的原因與我們沒有能夠並行化處理而只能串行執行的代碼以及存儲器資源,通信效率密切相關,或許有的人會拿一些程序說,已經有程序能充分利用超多CPU核心,但這類高性能應用對應的場景非常少見,真實使用場景中,要想讓用戶獲得最佳的體驗,就只能在通信延遲,內存性能,核心頻率等多方面下功夫,這註定核心數的增加就不能過於激進,同時因為單個核心的矢量處理能力提高,更多核心+更寬SIMD面臨一個問題,那就是是否有如此之多的數據需要或者能夠被並行
通過Matlab運行一個存在並行資源爭奪的計算項目來進行驗證,在測試中通過並行多個2048*2048元素量的向量乘法,FFT和矩陣乘實例進行測試,在配置四通道128GB 3600Mhz內存的i9-10980XE設備上,當擴展到一定程度的核心數後,體現出了阿姆達定律的特徵,即使我們繼續增加了並發核心數(下圖橫軸),但之後取得的效果越發不理想(縱軸為相對單核的加速比,並非實際成績),收益逐漸變差,難以獲得線性擴展能力,
而高密度的計算對於桌面主流平臺,也就是普遍只有雙通道的計算機系統來說,更是一個巨大的挑戰
測試環節
在測試環節,我們通過AMD與Intel的產品的一些對比來看一下,我們需要了解的是,對於超多核心處理器,我們並不能簡單認為核多就一定好,而是根據自己實際負載的特點來選擇產品,無論是Intel,還是AMD產品,都不可能在什麼負載下,核心增長就一定帶來對應的增長,參與對比的3900X與10900K使用一樣的內存,以便應對共同的內存問題,10900K 10核高頻,但也只支持雙通道內存,不可避免的遇到內存資源瓶頸問題,同時我們可以發現,AMD為了應對內存瓶頸,緩存規格相當高,3900X擁有與3950X一樣的三級緩存,擁有AMD 2個CPU Die,4個CCX下的全部64MB L3。
雖然Intel在努力保證處理器均衡發展,瓶頸固然很多時候無法避免,但在苛刻的複雜性能需求下,Intel產品的短板要小很多
最明顯的一個特點,AMD處理器固然核心數量較多,在雙通道桌面平臺甚至提供12和16核產品,但實際其每四個核心為一個CCX,2個CCX為一個CPU die,CCX內四個核心通信速度很快,但只要需求與其他CCX的核心通信,就需要通過CPU上的I/O Die進行中轉路由,延遲便會大幅度提高。
而Intel 10900K 10個核心的直接通信延遲則始終保持在一個穩定較低的範圍(40ns),
(以上數據,數值越低越好)
這還是在核心間直接通信,沒有明顯的一致性和數據競爭需求,而在事務內存負載中,通過一個資料庫常用的B-Tree索引算法,在執行中涉及並發的數據修改對內存一致性和準確性的要求,往往需要加鎖,而加鎖的粒度越大,則會更明顯的影響並發性,其對系統的數據同步和數據一致性有較高要求,這必然涉及複雜的不同核心與其存儲器之間的通信,隨著核心數的增多,會變得越發不容易實現高並發,Intel在9代高端桌面處理器上支持TSX指令集,能大幅提高這類粗粒度鎖算法的性能,但Cometlake-S沒有支持TSX指令集,但這麼一來,即使是與AMD R9 3900X 12核心處理器進行對比,10900K依舊在事務內存吞吐上優勢非常明顯,儘管這類高性能資料庫需求對普通用戶很少見,但也說明Intel處理器在苛刻條件下的適應能力
(以上數據,數值越高越好)
而在普通用戶都熟知的內存延遲上,Intel處理器也的確控制得更好,不僅是內存控制器集成於CPU中的原因,也在於Intel自身設計的IMC效率好於AMD使用的新思IP方案。
正是Intel處理器需要在核心數,頻率,延遲,帶寬,軟體和用戶實際需求中做出最大平衡,所以用戶很難看到Intel在某一方面激進的提高,而是均衡發展,儘管如此,依舊有很多實際的困難沒有被完全克服,但相比AMD來說,Intel在均衡發展上目前做的更好,儘管可能並不能絕對擊敗AMD更多核心的產品,但短板要小得多。
比如在內存瓶頸極高的sisoftware科學分析測試中,同樣遭遇了較大的挑戰,部分項目開啟超線程後成績甚至會不如關閉超線程的情況(數據取相對最大值),在一般矩陣乘項目中,10900K最高在FP32上取得了50%的領先,在FP64上取得了32.5%的領先,而3900X 12核取得的最大優勢在N體模擬FP64項目中,為28%,相對來說,可見3900X的大緩存也起到了一定作用,但在內存資源瓶頸的情況下Intel的表現顯得短板要小一些。npack代表測量求解線性方程組的執行速率的測試,是非常著名的高性能稠密矩陣相關算法的基準測試,其中完成矩陣乘的部分隨著矩陣規模提高,內存帶寬需求也不斷提高,以保證矩陣數據順利進入緩存保證CPU核心計算,通過AVX256 FMA指令完成GEMM計算,不同分塊的矩陣計算過程中需要廣播通信,(vbroadcast指令),Intel處理器執行AVX256 FMA計算每周期理論可以發射兩個256FMA指令並並行一個broadcast指令,而AMD Zen2架構如果並行2個256FMA指令則無法同時發射一個broadcast指令,同時雙通道內存的帶寬瓶頸也在不斷凸顯,可見核心數量並不是簡單的增加就能提高運算能力,多核加速比在10核以上尺度已經遇到瓶頸,10900K和3900X相比各自的8核小兄弟,小於核心數量的提升幅度,但10900K依然保持了最高效的速度。
(以上數據,數值越大越好)
緩存敏感,多線程並行困難項目:
而最終,在多方面穩步前進的謹慎設計下,不僅在密集計算中Intel短板更少,在苛刻環境下表現更佳,在我們日常使用和遊戲中也有更好的表現,如果說日常程序中感知不強的話,在我們常見的網路遊戲中,由於遊戲中對CPU的更多體現在短時響應需求和遊戲數據轉發路由等對延遲敏感且難以並行的負載,對單核性能要求較大,所以10900K的表現非常搶眼,i5-10400使用默認2666內存相比3900X也相差不大
(以上數據,數值越大越好)
在3A大型遊戲中,往往遊戲還會對實際快速建模的渲染與快速響應,遊戲中AI尋路等負載綜合運行,對CPU有更複雜的要求,但GPU瓶頸相對較高,有時CPU到達一定性能程度後,往往就不再是瓶頸,所以有的3A大作不同CPU的表現會很接近,但這不絕對代表CPU就沒有影響,即使在3A大作高特效的情況下,10900K同樣一騎絕塵,10400表現也足夠出色,足夠與3900X媲美甚至反超。
(以上數據,數值越大越好)
總結
所以,儘管Intel處理器往往核心數增加的並不激進,但提高性能的方法很多,我們實際使用的情況下,也非常複雜,不是簡單堆砌執行單元,核心,或者其他某一個參數就能解決的,需要綜合全面的發展,才能確保用戶在各項使用中獲得最好的體驗,尤其是i9-10900K,集合了高效率的微架構,超高的頻率,合適的延遲和合適與主流雙通道內存帶寬的核心數,是一款性能出色且沒有什麼短板的高性能處理器首選,雖然並不能說完全可以克服核心數量與緩存,內存性能以及程序本身的多核擴展帶來的瓶頸,但在大多時候能更好的適合各類家用負載,就算使用場景的性能因素較為複雜,實際使用也都能相對的得心應手,兼顧核心與頻率,更能兼顧更多細節,更好的完成處理任務。
不僅僅如此,更在面對內存瓶頸時,有更高的內存超頻能力,Intel平臺能在不犧牲緩存和內存控制器性能的情況下將內存頻率提高到4000Mhz以上甚至更高,這樣就能帶來更高的內存帶寬和更低的延遲,而AMD平臺要想達到4000Mhz+以上的內存頻率。需要將IF總線頻率放寬到內存頻率一半的模式,這樣實際內存控制器到L3的IF總線頻率反而下降,連帶這部分的帶寬和延遲性能也受損,帶寬提升極為有限而延遲更高,AMD官方數據也證明了這點。
所以AMD的多核處理器在面對內存瓶頸時,也少了一個應對辦法,所以Intel平臺相對AMD平臺依舊有諸多領先之處,也更能為用戶和玩家創造更多可玩性和性能解決方案。