以x86體系為代表的CPU已經占有了桌面和服務器處理器的絕大部分份額,而且這個趨勢還在不斷增強。CPU具有兼容性強、易編程、應用資源豐富、價格低廉的優勢,但是在某些領域,CPU存在天然的缺陷,以FPGA、GPU為代表的硬件可以克服CPU的缺陷,因此也擁有自己的市場。
1.1 圖解各類型芯片
從設計軟件進行計算任務的軟件工程人員的角度,可以將芯片分為CPU、GPU、FPGA和ASIC等類型。
對處理器芯片的特性和應用,理論上是軟件人員具有最大發言權。但每一類芯片的使用和理解都不是一件簡單的事情,以CPU為例:即使從事CPU環境的編程設計多年,也很難談得上深入理解了CPU的設計思想。能深入各種芯片編程的軟件人員更是鳳毛麟角,更別談進行分析和比較。另外一個問題是軟件和硬件設計已分離多年,軟件設計人員,很難深入理解芯片的設計思路,即使操作系統的設計人員也一樣。而芯片的設計廠商由于利益相關,往往只宣揚各自的優點,回避缺陷,在測試對比中選擇有利的測試條件,產生對己有利的測試數據。測試數據的真真假假,更加混淆了技術人員的視聽。
在對各種芯片比較和研究的過程中,我們認為不應該沉湎于具體芯片的架構和設計思路,而應該關注芯片的實際應用。有兩個原因支持我們的思路。一個原因是芯片的架構非常繁復,熟悉各種芯片幾乎是不可能的任務。另一個更重要的原因是技術的價值在于應用。不管何種芯片設計或者架構,最終決定芯片價值的是實際的應用。從應用的角度出發,應按照易用性和經濟性兩個維度考察芯片。
易用性指用芯片進行編程的難度以及相關編程資源的獲取難度。這個指標技術人員雖然不怎么關心,但其實對芯片發展有重大,甚至是絕對的重要性。例如在FPGA的編程實踐中,相關的編程資源非常難以獲得,即使獲得也往往是代價巨大。比如常見的JPEG圖片,相關的FPGA編解碼庫往往需要付出數萬美元的成本,這和CPU領域大量的開源庫完全不能相提并論。價格的昂貴還帶來了測試和驗證的繁雜。提供庫資源的廠商往往需要曠日持久的溝通和談判以及簽署協議才能進行驗證工作,這在很多研發項目運作中幾乎是不可承受的。
經濟性指提供相同性能情況下的芯片成本。芯片往往型號眾多,比如FPGA芯片,既有上千美元甚至幾千美元售價的高端型號,也有幾美元計價的低端型號。脫離芯片成本談論性能沒有意義。需要指出的是,成本是綜合的運營成本,而非單獨的芯片購買成本。比如某款芯片如果性能等于CPU十倍,那么它不僅僅是頂替了十顆CPU,而是頂替了十臺服務器的采購成本以及十臺服務器的運營成本,考慮到實際的運營成本往往大于采購成本,后者可能更具有重要性。
1.2 芯片的分類
對常用的處理器芯片進行分類,有一個明顯的特點:CPU&GPU需要軟件支持,而FPGA&ASIC則是軟硬件一體的架構,軟件就是硬件。這個特點是處理器芯片中最重要的一個特征。
上圖可以從兩個角度來說明:從ASIC->CPU的方向,沿著這個方向芯片的易用性越來越強,CPU&GPU的編程需要編譯系統的支持,編譯系統的作用是把高級軟件語言翻譯成機器可以識別的指令(也叫機器語言)。高級語言帶來了極大的便利性和易用性,因此用CPU&GPU實現同等功能的軟件開發周期要遠低于FPGA&ASIC芯片。沿著CPU->ASIC的方向,芯片中晶體管的效率越來越高。因為FPGA&ASIC等芯片實現的算法直接用晶體管門電路實現,比起指令系統,算法直接建筑在物理結構之上,沒有中間層次,因此晶體管的效率最高。
本質上軟件的操作對象是指令,而CPU&GPU則扮演高速執行指令的角色。指令的存在將程序執行變成了軟件和硬件兩部分,指令的存在也決定了各種處理器芯片的一些完全不同的特點以及各自的優劣勢。
FPGA&ASIC等芯片的功能是固定的,它們實現的算法直接用門電路實現,因此FPGA&ASIC編程就是用門電路實現算法的過程,軟件完成意味著門電路的組織形式已經確定了,從這個意義上,FPGA&ASIC的軟件就是硬件,軟件就決定了硬件的組織形式。軟硬件一體化的特點決定了FPGA&ASIC設計中極端重要的資源利用率特征。利用率指用門電路實現算法的過程中,算法對處理器芯片所擁有的門電路資源的占用情況。如果算法比較龐大,可能出現門電路資源不夠用或者雖然電路資源夠用,但實際布線困難無法進行的情況。
存在指令系統的處理器芯片CPU&GPU不存在利用率的情況。它們執行指令的過程是不斷從存儲器讀入指令,然后由執行器執行。由于存儲器相對于每條指令所占用的空間幾乎是無限的,即使算法再龐大也不存在存儲器空間不夠,無法把算法讀入的情況。而且計算機系統還可以外掛硬盤等擴展存儲,通過把暫時不執行的算法切換到硬盤保存更增加了指令存儲的空間。
處理器芯片各自長期發展的過程中,形成了一些使用和市場上鮮明的特點。CPU&GPU領域存在大量的開源軟件和應用軟件,任何新的技術首先會用CPU實現算法,因此CPU編程的資源豐富而且容易獲得,開發成本低而開發周期,而FPGA&ASIC編程需要的資源通常很難獲得,這些資源往往以IP(intellectual property)的方式授予和收費,授予的周期往往很長而且需要簽署法律協議,而費用也很昂貴。導致FPGA&ASIC的開發成本高而且周期很長。
1.3 CPU架構和編程設計
無論是x86體系為代表的繁雜指令系統(CISC)CPU還是精簡指令系統(RISC)CPU,其核心都是執行一套指令系統。x86體系的CPU不斷更新換代,不斷提升主頻,采用更先進的工藝和新架構,目的就是為了更高性能地執行x86指令。因為X86系列的CPU應用廣泛,已經成為事實上的標準,本文所指的CPU特指X86系列的CPU。
從CPU內部結構觀察,大致可分為控制器和執行器,再加上存儲管理部件MMU以及總線接口部件。控制器不斷從存儲器取出指令,進行指令譯碼,執行器從譯碼完成的指令隊列中取出譯碼指令執行。各個功能部件既能獨立工作,又能與其他部件配合工作,下圖給出了CPU各個部件之間的指令操作流水圖。
指令系統是計算機系統發展中的巨大進步。借助指令系統,高級語言的出現成為可能,大大方便了計算機的應用。但是事情的另一面是使用指令系統后,所有的計算任務都要翻譯為指令,執行一個簡單的計算任務可能就需要多條指令完成。從晶體管的角度來看,簡單的計算任務可能就需要眾多的晶體管共同參與。為提升性能,采用指令系統的CPU,其性能設計出發點是增強指令執行的效率。
以前CPU的架構設計一直圍繞如何增強指令執行的效率,為此采取的措施是不斷提升主頻、加多流水線(奔騰首次應用了雙路流水,而現在的CPU往往擁有20以上的流水數目
)以及增加CPU的cache提升取指令的效率(早期奔騰芯片擁有幾十K的緩存,而至強E5的三級緩存超過10MB,甚至可達到30MB)。近幾年,CPU的架構更加重視多核的應用,期望通過多核實現更高的性能。
CPU設計出發點是增強指令的運行性能,因此CPU的核心功能強大,占用的晶體管資源龐大,具有很高的運行效率,因此CPU的多核不可能做到非常多。目前頂級的X86 CPU具有十多個核心,而GPU已經達到幾千個核心。
對編程設計來說,如果線程完全獨立的執行計算任務,線程間數據不存在共享和競爭關系,那么并行效率可以達到線性效果。不過現實中的編程,有很大一類是單任務的并行化,即將一個繁雜的任務通過多核并行執行來加速,那么就面臨兩個困難:一個是將任務并行化之后面臨多線程之間的切換代價。因為CPU核心功能強大,因此操作系統切換線程時需要CPU內部大量的狀態寄存器置位,所以線程之間切換是代價很大的操作(實測中,線程切換大概需要幾十微秒),如果計算任務的執行時間小于這個數字,那么多線程執行對性能提升可能并無收益,甚至可能效率反而下降。
另一個問題是任務執行中數據的依賴關系。如果計算任務中某部分必須利用前面部分的計算結果,即存在數據依賴性,那么就必須等前面部分計算完成才能執行后面的計算,而不可能并行計算。數據依賴是計算中經常遇到的場景,編程設計需要調整代碼結構盡量減少相關性提升并行性。
評論
查看更多