經常會遇到一些人問我什麼是FPGA,它與集成電路有什麼關係2?它與我們熟知的CPU,GPU又有什麼區別?這裡我試著以我個人的理解對這些問題進行一個簡單的介紹。

FPGA是一種集成電路

所謂集成電路就是將之前使用各種分立元器件(比如電阻,二極體,三極體等) 搭建的電路集成到一塊晶元上就稱之為集成電路。集成電路對於離散晶體管有成本和性能方面的優勢。所以集成電路迅速的替代了離散晶體管電路。而根據處理信號的不同,集成電路可以分為模擬集成電路、數字集成電路、和兼具模擬與數字的混合信號集成電路。FPGA(現場可編程門陣列)主要是處理數字信號(雖然最新的FPGA已集成部分模擬電路,但是FPGA總的功能主要還是在處理數字信號。)

FPGA與一般的數字集成電路有什麼區別呢?

在數字集成電路的世界裡,信號只有0和1兩個狀態,就是我們所謂的二進位。比如高電平就是1,低電平就是0。數字電路有一些基本的門電路,比如與門,或門,非門。我們通過一些簡單的與,或,非操作就可以實現各種數字計算功能。數字電路分析經常會用到真值表,如下所示:

當輸入信號A為0,B為0時,或門的輸出為0,與非門的輸出為1,與或門的輸出為0.由這些簡單的門電路來實現一些複雜的功能。舉個例子,要實現一個加法器,輸入信號分別是A和B。A和B分別為1bit的數字信號,結果是C。C為一個2bit的數字信號,如何來實現這個加法器呢?該計算的真值表如下:

  • 在本位加輸出中,若兩個輸入數相同則是0,不同則是1,所以我們可以用異或門來實現
  • 在進位輸出中,若輸入的兩個數都是1,才輸出1,所以我們可以用與門來實現。 那麼我們的半加器就做出來了:

在實際中,因為涉及到多位數的運算,所以不得不考慮進位,那麼半加器就不能滿足我們的需求了,所以我們要做一個全加器。所謂全加器,就是對二進位執行加法運算的電路,考慮進位。我們來分析分析。

我們直接給出全加器的電路,請讀者根據真值表來分析

我們可以使用2個半加器來實現一個全加器。

要實現八位加法器,當然就要八個全加器,只不過第一個全加器的進位輸入值我們設為0就好啦。

這就是八位加法器,進位輸入我們設置為0,然後A,B就是我要進行加法運算的8bits的二進位數啦。 按照這種思路,我們也可以設計出16位,32位的加法器。

由以上幾個例子可以看出,我們可以通過這幾種基本電路實現很多很複雜的電路。這是就通常所說的專用集成電路(Application-specific integrated circuit)。專用集成電路的缺點是我們要實現任何專用的功能,都需要晶元設計,驗證,生產,測試等很複雜的流程。

FPGA使用了一個更加巧妙的方法來實現各種電路功能。比如上面的8位加法器,輸入為2個8bit的數字,輸出為一個9bit的數字。FPGA使用一種叫做查找表的方式來實現這個功能,查找表相當於一個存儲器,我們通過編譯軟體,將16bit輸入不同情況下的輸出提前計算出來,存儲到查找表中,當輸入信號確定以後,只需查表就可以知道輸出的結果。優點是查找表可以實現任何功能,由軟體將不同輸入情況下的各種結果都提前算出來,存儲到查找表中。

FPGA的另外一個優點就是延遲可控。就像8位加法器,後面的輸出依賴於前面的計算,前面的計算結束以後才能進行後面的計算,加法器位寬越寬,延遲越大。對於查找表則不存在這個問題。

FPGA的這些優點也是有代價的。首先使用FPGA會有資源浪費,我們不可能使用FPGA的所有資源。就像一塊麵包板一樣,我們不可能完全使用它。當然FPGA廠商不斷的在優化他們的演算法,儘可能的將FPGA的潛能都利用起來。比如設計一個加法器需要使個邏輯門電路,但是使用FPGA,或許你需要選擇擁有1000個邏輯門的晶元。這些冗餘的邏輯資源使得FPGA的成本比較高,而且即使不使用的邏輯資源也會有漏電流,所以FPGA的功耗會高於專用集成電路。還有因為FPGA要兼顧靈活性,所以設計不一定會最優,進而影響到設計的性能。比如專用集成電路很容易運行到上GHz,但是FPGA的設計通常都是運行在幾百MHz。

在什麼情況下可以考慮使用FPGA?

現在的晶元都變得越來越複雜,大家為了在一顆晶元上集成更多的電路,往往傾向於採用更加先進的製造工藝。但是先進的製造工藝意味著越來越高的一次流片成本。而對於數字電路設計來說,通常都是有verilog或者VHDL等硬體描述語言,這些設計方法對於專用集成電路和FPGA來說是相同的。所以更多數字晶元設計廠商會利用FPGA來進行原型驗證。當自己的設計在FPGA上驗證成功,設計最終定型,並且生產量比較大,很多廠商會考慮將FPGA設計轉為專用集成電路。經過優化的專用集成電路或具有更小的晶元體積,隨著產量的提高,單顆晶元的成本也會大幅下降。

這是從晶元設計角度來說的。FPGA的另外一個重要應用領域就是高性能計算。在高性能計算領域,主要的競爭對手是CPU和GPU。我們接下來談一談CPU,GPU與FPGA又有什麼區別。

CPU介紹

FPGA是可編程器件,可以更為大家熟知的可編程器件是CPU(中央處理器)。中央處理器主要包括運算器(算術邏輯運算單元,ALU,Arithmetic Logic Unit)和高速緩衝存儲器(Cache)及實現它們之間聯繫的數據(Data)、控制及狀態的匯流排(Bus)。它與內部存儲器(Memory)和輸入/輸出(I/O)設備合稱為電子計算機三大核心部件。CPU又是怎麼樣工作的呢?

前面提到,任何一個複雜的工作都可以分解為很多很簡單的步驟,要運行在CPU上的程序也是經過編譯器,將我們寫的程序轉化為CPU可以執行的幾種簡單指令。不同體系的CPU有不同的指令集。這些指令集列舉了這些CPU可以執行的指令。CPU的運作原理可分為四個階段:提取解碼執行寫回

提取

第一階段,提取,從存儲器或高速緩衝存儲器中檢索指令(為數值或一系列數值)。由程序計數器(Program Counter)指定存儲器的位置。(程序計數器保存供識別程序位置的數值。換言之,程序計數器記錄了CPU在程序里的蹤跡。)

解碼

CPU根據存儲器提取到的指令來決定其執行行為。在解碼階段,指令被拆解為有意義的片段。根據CPU的指令集架構(ISA)定義將數值解譯為指令。一部分的指令數值為運算碼(Opcode),其指示要進行哪些運算。其它的數值通常供給指令必要的信息,諸如一個加法(Addition)運算的運算目標。

執行

在提取和解碼階段之後,緊接著進入執行階段。該階段中,連接到各種能夠進行所需運算的CPU部件。

例如,要求一個加法運算,算術邏輯單元(ALU,Arithmetic Logic Unit)將會連接到一組輸入和一組輸出。輸入提供了要相加的數值,而輸出將含有總和的結果。ALU內含電路系統,易於輸出端完成簡單的普通運算和邏輯運算(比如加法和位元運算)。如果加法運算產生一個對該CPU處理而言過大的結果,在標誌暫存器里可能會設置運算溢出(Arithmetic Overflow)標誌。

寫回

最終階段,寫回,以一定格式將執行階段的結果簡單的寫回。運算結果經常被寫進CPU內部的暫存器,以供隨後指令快速存取。在其它案例中,運算結果可能寫進速度較慢,但容量較大且較便宜的主記憶體中。某些類型的指令會操作程序計數器,而不直接產生結果。這些一般稱作「跳轉」(Jumps),並在程式中帶來循環行為、條件性執行(透過條件跳轉)和函式。許多指令會改變標誌暫存器的狀態位元。這些標誌可用來影響程式行為,緣由於它們時常顯出各種運算結果。例如,以一個「比較」指令判斷兩個值大小,根據比較結果在標誌暫存器上設置一個數值。這個標誌可藉由隨後跳轉指令來決定程式動向。在執行指令並寫回結果之後,程序計數器值會遞增,反覆整個過程,下一個指令周期正常的提取下一個順序指令。

CPU的優缺點

CPU的ALU等部件都是專用電路,進行了專門的優化,所以CPU通常可以跑到很高的速度。而且CPU中有比較器等專用計算單元,CPU很適合有很多判斷的應用場景,也就是通常所說的控制部分。

CPU的缺點就是只有幾個數量有限的算術邏輯單元,而且每次指令都要有相應的指令讀取,結果存儲等步驟。而往往高速緩存的讀取和存儲也是限制CPU性能的重要方面。舉個例子,把CPU看做一個工廠,CPU有有限的幾個能力很強的工人,這些工人做事情很快。問題是工人數量有限,而且工人每次要把貨物搬到自己的操作台,操作完成後又要把貨物搬離自己的操作台。

GPU介紹

GPU是圖形處理器的簡稱。大家熟知的GPU就是我們通常俗成為顯卡的東西,是為了視頻遊戲而產生的(至今其主要驅動力還是不斷增長視頻遊戲市場),在三維遊戲中常常出現的一類操作是對海量數據進行相同的操作,如:對每一個頂點進行同樣的坐標變換,對每一個頂點按照同樣的光照模型計算顏色值。GPU的眾核架構非常適合把同樣的指令流並行發送到眾核上,採用不同的輸入數據執行。在2003-2004年左右,圖形學之外的領域專家開始注意到GPU與眾不同的計算能力,開始嘗試把GPU用於通用計算(即GPGPU)。之後NVIDIA發布了CUDA,AMD和Apple等公司也發布了OpenCL,GPU開始在通用計算領域得到廣泛應用,包括:數值分析,海量數據處理(排序,Map-Reduce等),金融分析等等。

GPU和CPU有很多相同之處:兩者都有匯流排和外界聯繫,有自己的緩存體系,以及數字和邏輯運算單元。一句話,兩者都為了完成計算任務而設計。

兩者的區別在於存在於片內的緩存體系和數字邏輯運算單元的結構差異:CPU雖然有多核,但總數沒有超過兩位數,每個核都有足夠大的緩存和足夠多的數字和邏輯運算單元,並輔助有很多加速分支判斷甚至更複雜的邏輯判斷的硬體;GPU的核數遠超CPU,被稱為眾核(NVIDIA Fermi有512個核)。每個核擁有的緩存大小相對小,數字邏輯運算單元也少而簡單(GPU初始時在浮點計算上一直弱於CPU)。簡單來說,GPU就是海量精簡版的CPU的集合。GPU採用SIMD(Single Instruction Multiple Data)架構。就是說海量的GPU上運行相同的指令,這樣就減少了指令的讀取,同時將大量數據的讀取操作進行合併,大幅提升數據讀取效率。

CPU擅長處理具有複雜計算步驟和複雜數據依賴的計算任務,如分散式計算,數據壓縮,人工智慧,物理模擬,以及其他很多很多計算任務等。GPU更適合處理處理海量數據,數據之間沒有相互依賴關係,相對獨立,GPU可以對大量數據進行並行計算。

形象的比喻,GPU的工廠里有大量工人,每個工人的能力都不是很強,他們都做相同的事情,每個工人的工作沒有直接的關係。

FPGA在高性能計算中的應用

FPGA適合於應用到CPU和GPU折中的應用中。即數量並行量不是那麼大,判斷不是那麼多的應用。FPGA適合深度的流水線演算法。前一個計算單元的計算結果直接進入下一個邏輯運算單元。FPGA還適用於MISD的應用,即單一數據需要用許多條指令平行處理,這種情況下用FPGA做一個MISD的架構就會比GPU有優勢。

另外,相較於高性能的CPU以及GPU,FPGA的功耗就顯得小很多。


推薦閱讀:
查看原文 >>
相关文章