以x86體系為代表的CPU已經(jīng)占有了桌面和服務(wù)器處理器的絕大部分份額,而且這個(gè)趨勢(shì)還在不斷增強(qiáng)。CPU具有兼容性強(qiáng)、易編程、應(yīng)用資源豐富、價(jià)格低廉的優(yōu)勢(shì),但是在某些領(lǐng)域,CPU存在天然的缺陷,以FPGA、GPU為代表的硬件可以克服CPU的缺陷,因此也擁有自己的市場(chǎng)。
1.1 圖解各類型芯片
從設(shè)計(jì)軟件進(jìn)行計(jì)算任務(wù)的軟件工程人員的角度,可以將芯片分為CPU、GPU、FPGA和ASIC等類型。
對(duì)處理器芯片的特性和應(yīng)用,理論上是軟件人員具有最大發(fā)言權(quán)。但每一類芯片的使用和理解都不是一件簡(jiǎn)單的事情,以CPU為例:即使從事CPU環(huán)境的編程設(shè)計(jì)多年,也很難談得上深入理解了CPU的設(shè)計(jì)思想。能深入各種芯片編程的軟件人員更是鳳毛麟角,更別談進(jìn)行分析和比較。另外一個(gè)問(wèn)題是軟件和硬件設(shè)計(jì)已分離多年,軟件設(shè)計(jì)人員,很難深入理解芯片的設(shè)計(jì)思路,即使操作系統(tǒng)的設(shè)計(jì)人員也一樣。而芯片的設(shè)計(jì)廠商由于利益相關(guān),往往只宣揚(yáng)各自的優(yōu)點(diǎn),回避缺陷,在測(cè)試對(duì)比中選擇有利的測(cè)試條件,產(chǎn)生對(duì)己有利的測(cè)試數(shù)據(jù)。測(cè)試數(shù)據(jù)的真真假假,更加混淆了技術(shù)人員的視聽(tīng)。
在對(duì)各種芯片比較和研究的過(guò)程中,我們認(rèn)為不應(yīng)該沉湎于具體芯片的架構(gòu)和設(shè)計(jì)思路,而應(yīng)該關(guān)注芯片的實(shí)際應(yīng)用。有兩個(gè)原因支持我們的思路。一個(gè)原因是芯片的架構(gòu)非常繁復(fù),熟悉各種芯片幾乎是不可能的任務(wù)。另一個(gè)更重要的原因是技術(shù)的價(jià)值在于應(yīng)用。不管何種芯片設(shè)計(jì)或者架構(gòu),最終決定芯片價(jià)值的是實(shí)際的應(yīng)用。從應(yīng)用的角度出發(fā),應(yīng)按照易用性和經(jīng)濟(jì)性兩個(gè)維度考察芯片。
易用性指用芯片進(jìn)行編程的難度以及相關(guān)編程資源的獲取難度。這個(gè)指標(biāo)技術(shù)人員雖然不怎么關(guān)心,但其實(shí)對(duì)芯片發(fā)展有重大,甚至是絕對(duì)的重要性。例如在FPGA的編程實(shí)踐中,相關(guān)的編程資源非常難以獲得,即使獲得也往往是代價(jià)巨大。比如常見(jiàn)的JPEG圖片,相關(guān)的FPGA編解碼庫(kù)往往需要付出數(shù)萬(wàn)美元的成本,這和CPU領(lǐng)域大量的開(kāi)源庫(kù)完全不能相提并論。價(jià)格的昂貴還帶來(lái)了測(cè)試和驗(yàn)證的繁雜。提供庫(kù)資源的廠商往往需要曠日持久的溝通和談判以及簽署協(xié)議才能進(jìn)行驗(yàn)證工作,這在很多研發(fā)項(xiàng)目運(yùn)作中幾乎是不可承受的。
經(jīng)濟(jì)性指提供相同性能情況下的芯片成本。芯片往往型號(hào)眾多,比如FPGA芯片,既有上千美元甚至幾千美元售價(jià)的高端型號(hào),也有幾美元計(jì)價(jià)的低端型號(hào)。脫離芯片成本談?wù)撔阅軟](méi)有意義。需要指出的是,成本是綜合的運(yùn)營(yíng)成本,而非單獨(dú)的芯片購(gòu)買(mǎi)成本。比如某款芯片如果性能等于CPU十倍,那么它不僅僅是頂替了十顆CPU,而是頂替了十臺(tái)服務(wù)器的采購(gòu)成本以及十臺(tái)服務(wù)器的運(yùn)營(yíng)成本,考慮到實(shí)際的運(yùn)營(yíng)成本往往大于采購(gòu)成本,后者可能更具有重要性。
1.2 芯片的分類
對(duì)常用的處理器芯片進(jìn)行分類,有一個(gè)明顯的特點(diǎn):CPU&GPU需要軟件支持,而FPGA&ASIC則是軟硬件一體的架構(gòu),軟件就是硬件。這個(gè)特點(diǎn)是處理器芯片中最重要的一個(gè)特征。
上圖可以從兩個(gè)角度來(lái)說(shuō)明:從ASIC->CPU的方向,沿著這個(gè)方向芯片的易用性越來(lái)越強(qiáng),CPU&GPU的編程需要編譯系統(tǒng)的支持,編譯系統(tǒng)的作用是把高級(jí)軟件語(yǔ)言翻譯成機(jī)器可以識(shí)別的指令(也叫機(jī)器語(yǔ)言)。高級(jí)語(yǔ)言帶來(lái)了極大的便利性和易用性,因此用CPU&GPU實(shí)現(xiàn)同等功能的軟件開(kāi)發(fā)周期要遠(yuǎn)低于FPGA&ASIC芯片。沿著CPU->ASIC的方向,芯片中晶體管的效率越來(lái)越高。因?yàn)镕PGA&ASIC等芯片實(shí)現(xiàn)的算法直接用晶體管門(mén)電路實(shí)現(xiàn),比起指令系統(tǒng),算法直接建筑在物理結(jié)構(gòu)之上,沒(méi)有中間層次,因此晶體管的效率最高。
本質(zhì)上軟件的操作對(duì)象是指令,而CPU&GPU則扮演高速執(zhí)行指令的角色。指令的存在將程序執(zhí)行變成了軟件和硬件兩部分,指令的存在也決定了各種處理器芯片的一些完全不同的特點(diǎn)以及各自的優(yōu)劣勢(shì)。
FPGA&ASIC等芯片的功能是固定的,它們實(shí)現(xiàn)的算法直接用門(mén)電路實(shí)現(xiàn),因此FPGA&ASIC編程就是用門(mén)電路實(shí)現(xiàn)算法的過(guò)程,軟件完成意味著門(mén)電路的組織形式已經(jīng)確定了,從這個(gè)意義上,F(xiàn)PGA&ASIC的軟件就是硬件,軟件就決定了硬件的組織形式。軟硬件一體化的特點(diǎn)決定了FPGA&ASIC設(shè)計(jì)中極端重要的資源利用率特征。利用率指用門(mén)電路實(shí)現(xiàn)算法的過(guò)程中,算法對(duì)處理器芯片所擁有的門(mén)電路資源的占用情況。如果算法比較龐大,可能出現(xiàn)門(mén)電路資源不夠用或者雖然電路資源夠用,但實(shí)際布線困難無(wú)法進(jìn)行的情況。
存在指令系統(tǒng)的處理器芯片CPU&GPU不存在利用率的情況。它們執(zhí)行指令的過(guò)程是不斷從存儲(chǔ)器讀入指令,然后由執(zhí)行器執(zhí)行。由于存儲(chǔ)器相對(duì)于每條指令所占用的空間幾乎是無(wú)限的,即使算法再龐大也不存在存儲(chǔ)器空間不夠,無(wú)法把算法讀入的情況。而且計(jì)算機(jī)系統(tǒng)還可以外掛硬盤(pán)等擴(kuò)展存儲(chǔ),通過(guò)把暫時(shí)不執(zhí)行的算法切換到硬盤(pán)保存更增加了指令存儲(chǔ)的空間。
處理器芯片各自長(zhǎng)期發(fā)展的過(guò)程中,形成了一些使用和市場(chǎng)上鮮明的特點(diǎn)。CPU&GPU領(lǐng)域存在大量的開(kāi)源軟件和應(yīng)用軟件,任何新的技術(shù)首先會(huì)用CPU實(shí)現(xiàn)算法,因此CPU編程的資源豐富而且容易獲得,開(kāi)發(fā)成本低而開(kāi)發(fā)周期,而FPGA&ASIC編程需要的資源通常很難獲得,這些資源往往以IP(intellectual property)的方式授予和收費(fèi),授予的周期往往很長(zhǎng)而且需要簽署法律協(xié)議,而費(fèi)用也很昂貴。導(dǎo)致FPGA&ASIC的開(kāi)發(fā)成本高而且周期很長(zhǎng)。
1.3 CPU架構(gòu)和編程設(shè)計(jì)
無(wú)論是x86體系為代表的繁雜指令系統(tǒng)(CISC)CPU還是精簡(jiǎn)指令系統(tǒng)(RISC)CPU,其核心都是執(zhí)行一套指令系統(tǒng)。x86體系的CPU不斷更新?lián)Q代,不斷提升主頻,采用更先進(jìn)的工藝和新架構(gòu),目的就是為了更高性能地執(zhí)行x86指令。因?yàn)閄86系列的CPU應(yīng)用廣泛,已經(jīng)成為事實(shí)上的標(biāo)準(zhǔn),本文所指的CPU特指X86系列的CPU。
從CPU內(nèi)部結(jié)構(gòu)觀察,大致可分為控制器和執(zhí)行器,再加上存儲(chǔ)管理部件MMU以及總線接口部件??刂破鞑粩鄰拇鎯?chǔ)器取出指令,進(jìn)行指令譯碼,執(zhí)行器從譯碼完成的指令隊(duì)列中取出譯碼指令執(zhí)行。各個(gè)功能部件既能獨(dú)立工作,又能與其他部件配合工作,下圖給出了CPU各個(gè)部件之間的指令操作流水圖。
指令系統(tǒng)是計(jì)算機(jī)系統(tǒng)發(fā)展中的巨大進(jìn)步。借助指令系統(tǒng),高級(jí)語(yǔ)言的出現(xiàn)成為可能,大大方便了計(jì)算機(jī)的應(yīng)用。但是事情的另一面是使用指令系統(tǒng)后,所有的計(jì)算任務(wù)都要翻譯為指令,執(zhí)行一個(gè)簡(jiǎn)單的計(jì)算任務(wù)可能就需要多條指令完成。從晶體管的角度來(lái)看,簡(jiǎn)單的計(jì)算任務(wù)可能就需要眾多的晶體管共同參與。為提升性能,采用指令系統(tǒng)的CPU,其性能設(shè)計(jì)出發(fā)點(diǎn)是增強(qiáng)指令執(zhí)行的效率。
以前CPU的架構(gòu)設(shè)計(jì)一直圍繞如何增強(qiáng)指令執(zhí)行的效率,為此采取的措施是不斷提升主頻、加多流水線(奔騰首次應(yīng)用了雙路流水,而現(xiàn)在的CPU往往擁有20以上的流水?dāng)?shù)目
)以及增加CPU的cache提升取指令的效率(早期奔騰芯片擁有幾十K的緩存,而至強(qiáng)E5的三級(jí)緩存超過(guò)10MB,甚至可達(dá)到30MB)。近幾年,CPU的架構(gòu)更加重視多核的應(yīng)用,期望通過(guò)多核實(shí)現(xiàn)更高的性能。
CPU設(shè)計(jì)出發(fā)點(diǎn)是增強(qiáng)指令的運(yùn)行性能,因此CPU的核心功能強(qiáng)大,占用的晶體管資源龐大,具有很高的運(yùn)行效率,因此CPU的多核不可能做到非常多。目前頂級(jí)的X86 CPU具有十多個(gè)核心,而GPU已經(jīng)達(dá)到幾千個(gè)核心。
對(duì)編程設(shè)計(jì)來(lái)說(shuō),如果線程完全獨(dú)立的執(zhí)行計(jì)算任務(wù),線程間數(shù)據(jù)不存在共享和競(jìng)爭(zhēng)關(guān)系,那么并行效率可以達(dá)到線性效果。不過(guò)現(xiàn)實(shí)中的編程,有很大一類是單任務(wù)的并行化,即將一個(gè)繁雜的任務(wù)通過(guò)多核并行執(zhí)行來(lái)加速,那么就面臨兩個(gè)困難:一個(gè)是將任務(wù)并行化之后面臨多線程之間的切換代價(jià)。因?yàn)镃PU核心功能強(qiáng)大,因此操作系統(tǒng)切換線程時(shí)需要CPU內(nèi)部大量的狀態(tài)寄存器置位,所以線程之間切換是代價(jià)很大的操作(實(shí)測(cè)中,線程切換大概需要幾十微秒),如果計(jì)算任務(wù)的執(zhí)行時(shí)間小于這個(gè)數(shù)字,那么多線程執(zhí)行對(duì)性能提升可能并無(wú)收益,甚至可能效率反而下降。
另一個(gè)問(wèn)題是任務(wù)執(zhí)行中數(shù)據(jù)的依賴關(guān)系。如果計(jì)算任務(wù)中某部分必須利用前面部分的計(jì)算結(jié)果,即存在數(shù)據(jù)依賴性,那么就必須等前面部分計(jì)算完成才能執(zhí)行后面的計(jì)算,而不可能并行計(jì)算。數(shù)據(jù)依賴是計(jì)算中經(jīng)常遇到的場(chǎng)景,編程設(shè)計(jì)需要調(diào)整代碼結(jié)構(gòu)盡量減少相關(guān)性提升并行性。
1.4 GPU的架構(gòu)和編程設(shè)計(jì)
GPU(圖形處理器)這個(gè)概念最早是顯卡廠商N(yùn)vidia公司提出來(lái),如它的名字所象征的意義,主要是為圖形處理而設(shè)計(jì)。圖形處理計(jì)算的特征表現(xiàn)為高密度的計(jì)算而計(jì)算需要的數(shù)據(jù)之間較少存在相關(guān)性。下圖展示了GPU和CPU設(shè)計(jì)的不同之處。
圖 CPU架構(gòu)和GPU對(duì)比
如圖所示,GPU的設(shè)計(jì)出發(fā)點(diǎn)在于GPU更適用于計(jì)算強(qiáng)度高、多并行的計(jì)算。因此,GPU把晶體管更多用于計(jì)算單元,而不像CPU用于數(shù)據(jù)Cache和流程控制器。這樣的設(shè)計(jì)是因?yàn)椴⑿杏?jì)算時(shí)每個(gè)數(shù)據(jù)單元執(zhí)行相同程序,不需要繁瑣的流程控制而更需要高計(jì)算能力,因此也不需要大的cache容量。
圖 GPU內(nèi)部結(jié)構(gòu)
如上圖所示,GPU的架構(gòu)圍繞流處理器(SMX)陣列構(gòu)建的。 流處理器能同時(shí)并發(fā)執(zhí)行上百線程。指令流水線化以利用單線程內(nèi)的指令級(jí)并行,與CPU核不同,GPU指令順序發(fā)射,沒(méi)有分支預(yù)測(cè)和猜測(cè)執(zhí)行。
流處理器以32個(gè)為一組創(chuàng)建、管理、調(diào)度和執(zhí)行并行線程,這32個(gè)線程組稱為束(warps)。束內(nèi)包含的不同線程從同一程序地址開(kāi)始,但它們有自己的指令地址計(jì)數(shù)器和寄存器狀態(tài),因此可自由分支和獨(dú)立執(zhí)行。
束每次執(zhí)行一個(gè)相同的指令,所以如果束內(nèi)所有32個(gè)線程在同一條路徑上執(zhí)行的話,會(huì)達(dá)到最高效率。如果由于數(shù)據(jù)依賴條件分支導(dǎo)致束分岔,束會(huì)順序執(zhí)行每個(gè)分支路徑,而禁用不在此路徑上的線程,直到所有路徑完成,線程重新匯合到同一執(zhí)行路徑。分支岔開(kāi)只會(huì)在同一束內(nèi)發(fā)生,不同的束獨(dú)立執(zhí)行不管它們是執(zhí)行相同或不同的代碼路徑。
需要注意的是,GPU的線程概念和CPU的線程概念不同,CPU有虛存概念,線程具有自己的線程空間和頁(yè)表項(xiàng),還包括CPU的諸多狀態(tài)寄存器。因此CPU的線程功能更強(qiáng)大,切換線程的代價(jià)也更高,而GPU的線程可以被看做一些計(jì)算指令構(gòu)成的計(jì)算塊,它們的調(diào)度、執(zhí)行和切換要簡(jiǎn)單的多。從一個(gè)線程的執(zhí)行上下文切換到另一個(gè)線程的執(zhí)行上下文沒(méi)有消耗,線程之間的切換是硬件切換,消耗的時(shí)間幾乎可以不考慮。
計(jì)算任務(wù)中可能存在串行的部分。串行指不可并行、必須順序執(zhí)行的計(jì)算部分。這種串行部分極大的降低了任務(wù)的并行度和計(jì)算性能。在后續(xù)的實(shí)踐例子中,就遇到了這樣的串行部分。
單獨(dú)的GPU缺乏必要的環(huán)境,沒(méi)有外部設(shè)備和操作系統(tǒng)的支持,不能和網(wǎng)絡(luò)或者本地硬盤(pán)交換數(shù)據(jù),因此在實(shí)際應(yīng)用中,GPU總是要和CPU搭配使用,共同構(gòu)成編程的環(huán)境,這種編程稱為異構(gòu)編程。異構(gòu)編程不可避免CPU管理的內(nèi)存和GPU管理的內(nèi)存之間的數(shù)據(jù)交互,數(shù)據(jù)交互的效率極大程度上將影響GPU的運(yùn)行效率。
1.5 FPGA的架構(gòu)和編程設(shè)計(jì)
FPGA不采用指令和軟件,是軟硬件合一的器件。對(duì)FPGA進(jìn)行編程要使用硬件描述語(yǔ)言,硬件描述語(yǔ)言描述的邏輯可以直接被編譯為晶體管電路的組合。所以FPGA實(shí)際上直接用晶體管電路實(shí)現(xiàn)用戶的算法,沒(méi)有通過(guò)指令系統(tǒng)的翻譯。
FPGA的英文縮寫(xiě)名翻譯過(guò)來(lái),全稱是現(xiàn)場(chǎng)可編程邏輯門(mén)陣列,這個(gè)名稱已經(jīng)揭示了FPGA的功能,它就是一堆邏輯門(mén)電路的組合,可以編程,還可以重復(fù)編程。不能重復(fù)編程的FPGA也有,主要是基于反熔絲技術(shù),主要用于軍事用途。下圖展示了可重復(fù)編程FPGA的內(nèi)部原理圖。
圖 FPGA內(nèi)部結(jié)構(gòu)圖
FPGA內(nèi)部可以分為可配置邏輯模塊CLB、輸入輸出模塊IOB和內(nèi)部連線等三個(gè)部分。IOB是FPGA輸入輸出的接口,提供芯片和外界電路的連接,完成不同電氣特性對(duì)輸入輸出信號(hào)的驅(qū)動(dòng)和匹配。
CLB是FPGA的基本邏輯單元。CLB的實(shí)際數(shù)量根據(jù)芯片種類的不同而不同,以xilinx公司生產(chǎn)的早期FPGA Virtex5系列為例,每個(gè)CLB包含兩個(gè)silce。每個(gè)slice內(nèi)部包含4個(gè)查找表(LUT)、4個(gè)觸發(fā)器和多路開(kāi)關(guān)等資源。
數(shù)字邏輯電路從原理上,是通過(guò)時(shí)序部件和組合邏輯來(lái)完成一系列的功能,而FPGA通過(guò)芯片內(nèi)部眾多的CLB單元提供了眾多的組合邏輯和時(shí)序邏輯。因此通過(guò)配置CLB就可以實(shí)現(xiàn)各種不同的功能。
本文關(guān)注的重點(diǎn)不是FPGA的硬件原理,也不是FPGA邏輯設(shè)計(jì)的技巧和語(yǔ)法,而是從并行計(jì)算的角度分析多種芯片和CPU程序設(shè)計(jì)的特點(diǎn)。
1.5.1 FPGA編程和CPU編程的特點(diǎn)
CPU編程和FPGA編程最大的不同之處是前者是軟件模式,而后者是硬件模式。軟件模式意味著代碼之間是串行模式,代碼之間有嚴(yán)格的執(zhí)行順序(不考慮指令亂序執(zhí)行的影響),而硬件模式則意味這代碼之間是并行模式,每一條語(yǔ)句,經(jīng)過(guò)編譯(在硬件領(lǐng)域,編譯被稱為綜合)之后就是一個(gè)真實(shí)的邏輯電路。通過(guò)一個(gè)具體的例子可以更準(zhǔn)確觀察到軟件模式和硬件模式的區(qū)別:
對(duì)于上面軟件模式的代碼,這兩條語(yǔ)句之間是串行執(zhí)行的(不考慮指令流水),經(jīng)過(guò)編譯之后,CPU先執(zhí)行第一條語(yǔ)句,完成a變量的賦值運(yùn)算,然后執(zhí)行第二條語(yǔ)句,執(zhí)行d變量的賦值運(yùn)算。
如果后續(xù)沒(méi)有對(duì)變量a和d的再次賦值,那么變量將始終保持當(dāng)前的賦值不變。
上面語(yǔ)句是FPGA硬件的賦值語(yǔ)句。和CPU軟件模式的執(zhí)行方式不同,上面語(yǔ)句經(jīng)過(guò)綜合后,將形成兩個(gè)邏輯電路,一個(gè)電路的輸入是b和c,輸出是a,而另一個(gè)電路的輸入是e和f,輸出是d。這兩者之間是完全獨(dú)立的,彼此并行而沒(méi)有任何的順序關(guān)系。
另外一點(diǎn)和CPU執(zhí)行模式不同的是,只要輸入端b、c或者e、f有任何的變化,那么輸出端a或者d也立即變化,不需要再次的賦值。從硬件角度很容易理解這一點(diǎn),因?yàn)镕PGA的硬件描述語(yǔ)句被生成為邏輯電路,它是實(shí)實(shí)在在的存在并且一直執(zhí)行,而CPU的指令被執(zhí)行之后,除非被加載到執(zhí)行單元再次執(zhí)行,否則不會(huì)自動(dòng)再執(zhí)行。
使用FPGA編程,最大的難點(diǎn)在于將原有的串行思路轉(zhuǎn)變?yōu)椴⑿兴悸贰S捎谌四X的思維模式更接近串行模式,所以用并行模式實(shí)現(xiàn)算法和功能的時(shí)候,通常困難比串行模式來(lái)得大。除此之外,還有如下特性不同:
FPGA硬件具有資源占用率的概念。FPGA編程最終要用邏輯電路實(shí)現(xiàn),因此復(fù)雜的算法需要耗用更多的邏輯電路,如果使用的邏輯電路超過(guò)芯片的資源是無(wú)法實(shí)現(xiàn)的。這個(gè)特性和CPU完全不同,CPU的程序存儲(chǔ)在外部存儲(chǔ)中,執(zhí)行時(shí)從外部存儲(chǔ)載入內(nèi)存執(zhí)行。內(nèi)存和外部存儲(chǔ)的容量遠(yuǎn)遠(yuǎn)超過(guò)算法需要的存儲(chǔ)量,基本不可能出現(xiàn)資源不夠用的情況。
FPGA通常運(yùn)行的時(shí)鐘頻率遠(yuǎn)小于CPU的時(shí)鐘頻率。對(duì)FPGA編程的過(guò)程,實(shí)際是將芯片內(nèi)部邏輯電路連接起來(lái)實(shí)現(xiàn)算法和功能的過(guò)程。從FPGA的結(jié)構(gòu)可以發(fā)現(xiàn),F(xiàn)PGA是固定排列的門(mén)電路陣列,邏輯電路固定的排列方式?jīng)Q定了編程過(guò)程有大量的冗余電路沒(méi)有利用,走線也不能夠充分的精簡(jiǎn)。因此當(dāng)前主流FPGA芯片編程通常運(yùn)行時(shí)鐘頻率為200Mhz~300Mhz,而CPU的運(yùn)行頻率已超過(guò)Ghz的關(guān)口,現(xiàn)代主流的X86 CPU的時(shí)鐘頻率甚至超過(guò)3Ghz。
1.6 ASIC的架構(gòu)
ASIC和FPGA類似,都是用門(mén)電路資源實(shí)現(xiàn)固定的算法,不同之處是FPGA是固定排列的門(mén)電路陣列,固定的排列方式?jīng)Q定了編程過(guò)程有大量的冗余電路沒(méi)有充分利用,造成門(mén)電路資源的浪費(fèi),而ASIC是經(jīng)過(guò)專門(mén)優(yōu)化之后的門(mén)電路布局,相比較FPGA精簡(jiǎn)的多。根據(jù)廠商的提供的資料,實(shí)現(xiàn)同等功能FPGA所需的門(mén)電路數(shù)目可能比ASIC高10倍。
從使用方式來(lái)比較,F(xiàn)PGA可以重復(fù)編程,而ASIC一次編程后無(wú)法更改。由于FPGA可重復(fù)編程的靈活性,設(shè)計(jì)ASIC芯片多數(shù)時(shí)候會(huì)先用FPGA實(shí)現(xiàn)邏輯功能,然后基于FPGA的結(jié)果進(jìn)行優(yōu)化和整合,得到最終的ASIC芯片需要的電路設(shè)計(jì)。
在真正的實(shí)踐中,并沒(méi)有進(jìn)行ASIC的設(shè)計(jì)和實(shí)際的制造,這是因?yàn)锳SIC的設(shè)計(jì)和制造非常昂貴,和合作廠商溝通的結(jié)果大概需要百萬(wàn)美元的投入。ASIC芯片的昂貴決定了它不可能在小規(guī)模應(yīng)用的場(chǎng)合出現(xiàn),而必須是大規(guī)模(達(dá)到百萬(wàn)以上的量級(jí))的應(yīng)用場(chǎng)景才可以分?jǐn)侫SIC的昂貴投入取得經(jīng)濟(jì)上的合理性。這種特性導(dǎo)致一個(gè)有趣的結(jié)果,一種計(jì)算算法初步啟動(dòng)時(shí)常常使用FPGA作為硬件載體,利用FPGA承載算法,隨著規(guī)模擴(kuò)張,就有商業(yè)性的ASIC芯片出現(xiàn)。一旦規(guī)模達(dá)到經(jīng)濟(jì)上的合理,ASIC芯片的成本就遠(yuǎn)小于FPGA的成本并取代FPGA的地位。
一個(gè)事實(shí)就是PCIE SSD的應(yīng)用。早期的PCIE SSD都是使用FPGA作為內(nèi)部算法的硬件載體,而2014年以來(lái)隨著PCIE SSD應(yīng)用的規(guī)?;?,已經(jīng)有ASIC芯片出現(xiàn)并在一些PCIE SSD的產(chǎn)品中應(yīng)用。后續(xù)ASIC芯片很可能替代FPGA在PCIE SSD的應(yīng)用。
1.7 計(jì)算實(shí)踐和對(duì)比
為比較各種芯片的計(jì)算性能,以jpeg格式的圖片進(jìn)行解碼和重新編碼的計(jì)算為例子。下圖展示了jpeg圖像處理的算法過(guò)程。
?
jpeg圖像的壓縮過(guò)程:所有的圖像數(shù)據(jù)首先要進(jìn)行色彩空間的轉(zhuǎn)換,從RGB色彩空間轉(zhuǎn)換為YUV色彩空間。然后將圖像分割為8像素X8像素的圖像塊,對(duì)每個(gè)圖像塊進(jìn)行離散余弦變換(DCT),然后對(duì)變換后的數(shù)據(jù)量化得到量化值,最后對(duì)量化值進(jìn)行墑編碼,得到壓縮后的圖像數(shù)據(jù)。
而jpeg圖像的解碼過(guò)程則是編碼過(guò)程的逆向過(guò)程,首先對(duì)壓縮的圖像數(shù)據(jù)進(jìn)行墑解碼,得到量化之后的數(shù)據(jù),然后執(zhí)行反量化獲得量化之前、離散余弦變換之后的數(shù)據(jù),最后進(jìn)行反離散余弦變換,獲得原始圖像數(shù)據(jù)。
1.7.1 CPU的實(shí)踐和性能
對(duì)比測(cè)試的項(xiàng)目以每秒鐘jpeg圖片解碼然后重新編碼的性能為準(zhǔn),對(duì)單張圖片循環(huán)重復(fù)計(jì)算,單位為張數(shù)。CPU計(jì)算平臺(tái)采用的處理器為至強(qiáng)E3-1270,CPU計(jì)算平臺(tái)使用的轉(zhuǎn)碼軟件是imagemagic-6.8.6,多進(jìn)程并發(fā)循環(huán)執(zhí)行。下表給出CPU的性能數(shù)據(jù)。
1.7.2 GPU的實(shí)踐和性能
利用GPU進(jìn)行圖片解碼和再編碼時(shí),首先遇到了順序執(zhí)行的問(wèn)題。JPEG解碼里面的墑解碼器使用的是霍夫曼解碼。霍夫曼解碼在解碼圖像數(shù)據(jù)時(shí)候,依次處理一個(gè)個(gè)圖像塊,塊之間沒(méi)有分割標(biāo)志,因此存在數(shù)據(jù)依賴關(guān)系,必須把前面圖像塊的數(shù)據(jù)解碼完成,才能處理下一個(gè)圖像塊。這種必須順序執(zhí)行的計(jì)算部分GPU運(yùn)行效率非常低,如果霍夫曼解碼在GPU里面完成,整體效率甚至不如CPU。我們和Nvidia公司的軟件團(tuán)隊(duì)討論了這個(gè)問(wèn)題,最后確定的方案是將霍夫曼解碼部分由CPU完成。使用GPU的異構(gòu)編程應(yīng)當(dāng)被看做是CPU的計(jì)算輔助單元,共同和CPU完成計(jì)算任務(wù),由于架構(gòu)和配套資源的特點(diǎn),很難把GPU當(dāng)作完整的解決方案。
第二個(gè)重要的問(wèn)題是內(nèi)存的分配和管理。以操作系統(tǒng)的角度來(lái)看,異構(gòu)編程其實(shí)是對(duì)外部設(shè)備的編程,軟件代碼可以分成兩部分,一部分在CPU上面執(zhí)行,另一部分在GPU上執(zhí)行。GPU的內(nèi)存分配其實(shí)是對(duì)設(shè)備內(nèi)存的分配,這種分配操作運(yùn)行性能很低,嚴(yán)重影響整體計(jì)算的效率。在實(shí)際測(cè)試的代碼中,將所有的設(shè)備內(nèi)存分配都在開(kāi)始時(shí)候一次完成,避免實(shí)際使用時(shí)的內(nèi)存分配。數(shù)據(jù)從CPU內(nèi)存復(fù)制到GPU的設(shè)備內(nèi)存后,才能進(jìn)行高性能計(jì)算。因此需要減少內(nèi)存的復(fù)制時(shí)間,盡量使復(fù)制過(guò)程和GPU的計(jì)算疊加起來(lái),形成流水式的操作。
使用GPU的異構(gòu)編程,需要時(shí)刻關(guān)注GPU的利用率指標(biāo)。這個(gè)指標(biāo)代表GPU的繁忙程度,如果利用率很低,說(shuō)明沒(méi)有充分利用GPU內(nèi)部的流處理器,存在流處理器較多時(shí)間空閑的情況,就需要調(diào)整和優(yōu)化代碼結(jié)構(gòu)。一般說(shuō)來(lái),GPU的利用率應(yīng)該大于80%,這是才比較充分的利用了GPU的性能。
最終的測(cè)試是和Nvidia公司的軟件團(tuán)隊(duì)共同完成,實(shí)驗(yàn)性能得到了Nvdia公司的認(rèn)同。下表給出GPU對(duì)JPEG圖像再編碼的性能數(shù)據(jù)。
1.7.3 FPGA的實(shí)踐和性能
FPGA是一個(gè)單獨(dú)的芯片,為了能在服務(wù)器環(huán)境使用FPGA芯片,需要設(shè)計(jì)一張F(tuán)PGA計(jì)算卡,該卡使用PCIE接口和主機(jī)連接,卡上安裝一片xilinx v7-690T的芯片,同時(shí)具有2GB的DDR內(nèi)存。FPGA編程沒(méi)有操作系統(tǒng)的支持和輔助,因此FPGA內(nèi)部的資源必須用戶自己管理,比如FPGA訪問(wèn)DDR內(nèi)存的數(shù)據(jù),必須通過(guò)硬件邏輯來(lái)實(shí)現(xiàn),F(xiàn)PGA芯片和外部設(shè)備之間的數(shù)據(jù)交換也必須全部由使用者設(shè)計(jì)硬件邏輯實(shí)現(xiàn)功能,比如通過(guò)PCIE接口將主機(jī)內(nèi)存復(fù)制到FPGA卡內(nèi)的DDR內(nèi)存等。
而且FPGA軟件設(shè)計(jì)的生態(tài)環(huán)境和CPU的環(huán)境不同,通常FPGA設(shè)計(jì)沒(méi)有大量可用的開(kāi)源軟件。即使有一些公司提供商業(yè)的解決方案,費(fèi)用一般也很昂貴。實(shí)際上在硬件設(shè)計(jì)領(lǐng)域,一般都流行商業(yè)授權(quán)的模式。商業(yè)公司通常將開(kāi)發(fā)的硬件邏輯打包為IP(intelligence property),有購(gòu)買(mǎi)IP意向的使用者和商業(yè)公司談判使用模式和費(fèi)用,談判完成前一般不提供試用版本。
為了解決FPGA編程困難、生產(chǎn)效率低的問(wèn)題,我們創(chuàng)建了一個(gè)FPGA編程框架,利用框架提供用戶需要的控制和數(shù)據(jù),用戶只需要聚焦于算法和功能,而不必關(guān)心底層功能的實(shí)現(xiàn)。FPGA編程框架彌補(bǔ)了FPGA 沒(méi)有操作系統(tǒng)支持的弱點(diǎn),其實(shí)質(zhì)上類似一個(gè)小型的操作系統(tǒng),實(shí)現(xiàn)對(duì)資源的管理和使用。如下圖所示:
上圖綠色部分展示了FPGA編程框架的構(gòu)成,當(dāng)前編程框架包含對(duì)PCIE接口協(xié)議的封裝、DDR內(nèi)存的存取和多路仲裁、DMA功能、郵箱消息接口等。編程框架里面包含了下列的重要部件:
PCI設(shè)備配置空間:設(shè)置PCIE設(shè)備配置空間的信息,包括PCI設(shè)備ID,制造廠商和設(shè)備IO端口以及IO mem資源
DMA:?jiǎn)?dòng)DMA功能,從主機(jī)內(nèi)存物理地址復(fù)制數(shù)據(jù)到FPGA卡DDR內(nèi)存的指定地址,或者從FPGA卡DDR內(nèi)存的指定地址復(fù)制到主機(jī)內(nèi)存物理地址。
DDR:從FPGA卡DDR內(nèi)存指定地址讀數(shù)據(jù),每次讀出64bit數(shù)據(jù)。或者往FPGA卡DDR內(nèi)存指定地址寫(xiě)數(shù)據(jù),每次寫(xiě)入64bit數(shù)據(jù)。
郵箱:郵箱提供主機(jī)和FPGA芯片之間的消息接口。
中斷資源:中斷接口管理和控制,通過(guò)接口可以觸發(fā)一個(gè)系統(tǒng)中斷。
在FPGA程序?qū)崿F(xiàn)時(shí)最重要的問(wèn)題就是資源利用率。FPGA和CPU不同,如果資源沒(méi)有限制,F(xiàn)PGA理論上可以部署足夠多的計(jì)算單元,性能可以達(dá)到無(wú)限。在圖片轉(zhuǎn)碼的實(shí)踐中,基于690T的芯片,實(shí)際上部署了30路的編解碼核心,這時(shí)資源利用率達(dá)到70%。下表給出FPGA的性能數(shù)據(jù)。
1.8 結(jié)論和綜述
從整個(gè)實(shí)踐的過(guò)程理解,F(xiàn)PGA&GPU芯片的使用是很復(fù)雜的過(guò)程。性能和性價(jià)比是否具有優(yōu)勢(shì)需要針對(duì)業(yè)務(wù)的計(jì)算類型設(shè)計(jì)程序和優(yōu)化,并進(jìn)行實(shí)際的驗(yàn)證得出結(jié)論。希望簡(jiǎn)單和一致性的結(jié)論沒(méi)有可能,而廠商的結(jié)論多半并不可信,和實(shí)際驗(yàn)證的數(shù)據(jù)差別巨大?,F(xiàn)實(shí)是硬件、環(huán)境和算法資源都很缺乏,這可能是異構(gòu)編程應(yīng)用不廣泛和困難的原因。脫離了CPU的支持,使用GPU&FPGA等芯片的異構(gòu)編程困難太多,如果像CPU集成GPU一樣,同樣在CPU內(nèi)部集成FPGA功能,方便用戶的選擇和使用,將大大推動(dòng)各種場(chǎng)景的實(shí)際應(yīng)用。
評(píng)論