CPU浮點運算和整點運算分別決定其什麼性能?
簡單來講在現代計算機環境下的日常使用中,整點運算性能影響如壓縮與解壓縮,計算機進程調度,編譯器語法分析,計算機電路輔助設計,遊戲AI處理類型的操作。而浮點運算單元主要影響CPU的科學計算性能,如流體力學,量子力學等,而更貼近我們日常能見到的應用就是多媒體相關的應用,如音視頻的編解碼,圖像處理等操作。
ZEN的核心架構圖
而我們通常在測試CPU時使用如Sandra 2018,Super Pi,wPrime,Fritz Chess Benchmark,WinRAR,7-zip,x264 FHD Benchmark等軟件,這些測試軟件就能夠體現處理器理論整數運算單元和浮點運算單元性能的。
在具體使用的軟件中,如壓縮解壓軟件WinRAR,7-zip,程序員使用的GCC編譯器,網絡路由的選擇,遊戲中的AI以及我們日常試用操作系統調度都是整點運算。而我們在使用lightroom等圖像處理軟件,語音識別,的編解碼,以及科學家使用Matlab進行科學計算時都用到了浮點運算能力。
對於玩家最關心的就是這些到底對遊戲有什麼影響。首先CPU承擔著整個計算機中的任務進程分配問題,所以如果遊戲代碼優化不好,進行頻繁的Draw Call操作,會非常消耗CPU任務調度資源。同時現在遊戲AI做操作行為判斷時,也是使用整點運算單元的。而現在很多遊戲加入了防盜版機制,在運行遊戲時頻繁的加解密會消耗浮點運算性能。所以有朋友使用較老的硬件運行新遊戲時,會非常影響遊戲運行幀率。
所以整點運算性能和浮點運算性能都反映了CPU處理數據的能力。但是整點運算性能還反映了控製程序流的的能力。
在計算機中,定點數不一定是整數,而浮點數也不一定是小數。在計算機中,定點數是指小數點固定的數,而浮點數是指小數點不固定的數。在計算機中採用IEEE 754標准進行浮點數的存儲的,他可以精確的的表示某一個數據。
在早期浮點運算單元並沒有一開始就加入到CPU設計中的。但是在計算機中,運算單元都是邏輯電路,由浮點數的定義我們可以知道,在早期僅有整點數運算單元而不帶有浮點數處理單元的處理器上,處理浮點數的階碼、尾數的計算以及規格化就成為了很困難的事情,導致早期CPU在科學計算中依舊非常的緩慢。所以Intel就設計了獨立於8086和8088處理器外的8087數學輔助處理器。到後來隨著計算機不再是科學家的工具,也逐漸進入了公眾視野,Intel在80486DX處理器核心內首次集成了浮點運算單元。
Intel 8087協處理器
Intel Core i7 7700k處理器的CPU-Z信息
早期的Intel x87系列數學運算輔助處理器只是作為一個提高浮點運算速度的處理器,而在現代處理器中,浮點計算功能會通過SIMD(Single Instruction Multiple Data,單指令多數據流)的技術實現並行計算能力。在打開CPU-Z後,開支持指令集一欄可以看到,現代處理器帶有的SSE指令集就有處理浮點運算的能力。而在之後的發展中,也逐漸引入了SSE2,SSE3,SSE4,AVX,FMA等更加適用於現代軟件的擁有強大浮點運算能力的指令集。
那接下來就有問題了,現代處理器加入了很多高度並行化的浮點運算單元,相較以往單純CPU的浮點運算能力有了非常大的飛躍,但是相對於現代的圖形處理器來說,這麼些浮點運算能力是不夠看的,那為什麼不像幾十年前一樣不在CPU中集成浮點運算單元呢??
Nvidia Geforce 256核心照片
對於這個問題,首先大家要了解為什麼會獨立出來圖形處理器這種專有硬件的。在20世紀90年代,計算機多媒體逐漸開始興盛起來,在1998年到1999年間,Intel和AMD的CPU中已經擁有了SSE或3DNow!這樣的SIMD浮點運算指令集。但是隨著電子遊戲的發展,計算機的使用者對於計算機的圖形性能有了更高的要求,但是此時的CPU內浮點運算性能並不滿足需求,所以在此後圖形處理器開始負擔更多的浮點運算工作。
Nvidia CUDA核心工作流程
但圖形處理器的使用者看到如此高效能的浮點運算處理器的時候就在思考如何能讓這類設備承擔除了圖形計算之外的浮點計算性能。乘著GPGPU(General-purpose GPU)概念的逐漸興起,顯卡上的統一渲染架構的出現,也讓這種計算方式真正成為現實。Nvidia在2007年正式發布了CUDA並行計算平台。之後也出現瞭如openCL的通用計算API(應用程序編程接口)。
到此我們突然發現,GPU都來搶CPU的浮點運算飯碗了,但為什麼CPU非但沒有取消浮點運算單元,反而其浮點運算性能越來越強??
AMD推土機架構示意圖
其實並不是沒有人想到這樣的情況,而是已經與產品這麼做了,就是AMD的推土機架構。這個架構放棄了之前的一個核心就由一套整數運算單元和浮點運算單元的組合,而是讓兩個核心共享一個浮點運算單元組成一個簇,而AMD將這種架構叫做CMT,又稱為群集多線程技術,之後又將相對與Intel有優勢的GPU核心集成進CPU中,產生了APU處理器。AMD當時還為此成立了HSA基金會,為解決CPU和GPU的內存統一尋址問題,也提出了hUMA技術並用在了Sony的PS4遊戲機上。
Sony Playstation 4主機,CPU和GPU共享8GB GDDR5內存
那為什麼廠商做了這麼多還是做不到用大規模的GPU取代CPU中的浮點運算單元呢?運算精度才是重點。CPU中的浮點運算單元是為了更高精度浮點運算準備的。如在最新Intel處理器中的AVX指令集可以處理512位擴展數據,這樣大大提升了計算精度和速度。而GPU中的處理器都是為高度並行計算而設計的結構相對簡單的核心,這些核心每一個都是SIMD處理器,但是能夠處理的數據精度是有限的,在Nvidia以及AMD圖形處理器上支持的數據精度大多是單精度和雙精度浮點計算(FP32和FP64),甚至隨著機器學習,深度學習,神經網絡的流行,最新的圖形處理器甚至支持了半精度浮點運算(FP16)。其次,由於在計算精度上相較於CPU中的浮點運算單元不高,所以在這些處理器中也沒有內置數據校驗和數據補償處理的運算單元。所以對於使用GPU進行科學計算的人,需要在編程階段就避免這樣的問題。同時CPU和GPU在設計上就是非常不同的,CPU的浮點單元個數很少,但是單個浮點運算單元所提供的性能是很強的。而GPU中是用過海量的SIMD單元堆砌出來的浮點運算能力。在CPU設計時,還需要設計大量的多級緩存來提高CPU的運算速度。而GPU中通常只為這些SIMD處理單元內置不多的緩存,而提供大量的內存(顯存)。
所以綜合上面的分析,我們可以得出的結論是雖然GPU擁有更強大的浮點運算性能,但是限於其計算單元的設計,統一內存架構的設計,其還是不能完全取代CPU中的浮點運算核心。CPU中的整點運算單元在肩負著如壓縮解壓,編譯器編譯程序,網絡路由,控製程序流等任務同時,其浮點運算核心也依舊在處理著圖像處理,科學計算等需要更高精度計算的任務。