【小(xiǎo)編推薦】張冬:OpenPOWER CAPI為(wèi)什α•∞(shén)麽這(zhè)麽快(kuài)?

2015-06-23 &nbs€ p; |   發布α↔∏者:梁國(guó)芳   | &€↓≥₹nbsp; 查看(kàn):3320次

IT新聞
 第七屆中國(guó)雲計(jì)算(suàn)∞®大(dà)會(huì)的(de)PMC專場(chǎng)以“雲計(jì)算(suàn)與雲存儲核心架構與應用(y€∑€✘òng)”為(wèi)主題,當天下(xià)午七位演講​∏嘉賓輪番登場(chǎng)進行(xíng)☆₹∏™了(le)七場(chǎng)演講,其中,PMC₩§♥數(shù)據中心存儲架構師(shī)張冬沒有(yǒu)過多(duō)談論市β>φ(shì)場(chǎng)和(hé)行(x♣&£βíng)業(yè)問(wèn)題,而是(shì)從(cóng)底層技(jì)&£術(shù)出發對(duì)OpenPower£ε✘γ CAPI進行(xíng)了(le)分(fēn)析和(hé)闡述∏γ÷¥,為(wèi)我們介紹了(le)CAPI為(wèi)什(shén)麽能(nén&λ§g)這(zhè)麽快(kuài)!



PMC公司數(shù)據中心存儲架構師(shī) 張冬

張冬,《大(dà)話(huà)存儲》系列圖書(shū)→≥≠作(zuò)者,PMC公司數(shù)據中心存儲架構師(shī)。張冬®  £先生(shēng)是(shì)《大(dà)話(huà)存儲》系列圖書(sh₹ ♣ū)作(zuò)者,該書(shū)屢次獲獎,包→ 括2008年(nián)十大(dà)IT暢銷書(γ™shū)排名第一(yī),2009年(nián)全δΩ€國(guó)技(jì)術(shù)品種暢∑♣​銷書(shū)。張冬在存儲領域有(yǒu)多(duō)年(niá∞×✘♦n)的(de)從(cóng)業(yè)經¥≥ 驗,主持并參與過多(duō)項創新存儲技(jì)術(shù)的(de)設計♥γ↔φ(jì)。

之前POWERCPU隻是(shì)IBM在做(zuò)小(xε"↓≠iǎo)型機(jī)的(de)時(shí)候使用><(yòng),OpenPOWER開(kāi)放(fàng)後,成立了(↑λle)OpenPower基金(jīn)會(huì),基金(jīn)會(huδ ₽ì)大(dà)部分(fēn)成員(yuán)都(dōu)非常專注于C↑ API(相(xiàng)幹加速器(qì)處理(lǐ)器(qì)接 ★₽∞口)上(shàng)的(de)利用(yòng),比如(rú)将外(wà↔•i)置的(de)網絡、GPU、閃存等設備通(tōng)過CAPI直接與C ≈PU相(xiàng)連接,并在此基礎上(shàng)根據不(b' δù)同的(de)主流應用(yòng)場(chǎng)景進行(xíng)開(kāφ®i)放(fàng)的(de)、定制(zhì)化(huà)的(de)系統設計♦± (jì),PMC除了(le)關注這(zhè)些(xiē)外(©→wài)還(hái)關注CAPI與NVMe進行(xíng)協作(zuò)的¶©±(de)問(wèn)題。

傳統架構的(de)缺點和(hé)瓶頸

現(xiàn)在無論是(shì)2路(lù)、4路(lù)、 ★®8路(lù)還(hái)是(shì)32路δ↓✔ (lù)服務器(qì),他(tā)們架構中的(de)CPU之間(jiān)≤₹↕的(de)互聯有(yǒu)的(de)是(shì)✔$÷₽直聯,有(yǒu)的(de)通(tōng)過←₽'NC(NC就(jiù)類似以太網絡裡(lǐ)面的γ¥(de)網橋)。核心之間(jiān)要(yào)傳輸數(s≈₩ αhù)據方式中,最高(gāo)效的(de)<©↕¥是(shì)共享內(nèi)存,代碼裡(lǐ)寫死。最低(dī→★)效的(de)方法就(jiù)是(shì)走網絡,封裝一(yī ‌)堆的(de)包出去(qù),發送一(yī)個(gè)™©數(shù)據給遠(yuǎn)端的(de)某個(gè)線↕$↕程,調用(yòng)一(yī)堆接口,走←★≥到(dào)協議(yì)棧,再到(dào)設備驅動,然後到(dào)φ™ ♦網絡,接著(zhe)收包解析,這(zhè)個φ (gè)過程非常慢(màn)。所以超級計(jì)算(suàn)機(jī∑∞)沒法做(zuò)到(dào)CPU之間(jiān)進行(xíng)高(gāo≈♥♠)速網絡共享內(nèi)存因為(wèi)成本太高(gāo ε₩♦),沒法将幾萬個(gè)CPU連接起來(lái),隻能(néng)走λ>網絡了(le),這(zhè)也(yě)是'±<(shì)松耦合系統的(de)一(yī)個(gè)'×>妥協。

沒有(yǒu)CAPI的(de)FPGA為(w₩☆‌èi)什(shén)麽也(yě)不(bù)太行(xí§€ ≈ng)

面對(duì)現(xiàn)在大(dà)數(shù)據分(fēn)∑≈ 析、模式匹配、熱(rè)點識别等,要(yào)求非常大(÷♥dà)的(de)計(jì)算(suàn)量,傳統CPσαU出現(xiàn)瓶頸。普通(tōng)的(de)CPU其實也(yě≥ ¥)能(néng)計(jì)算(suàn),但(dàn)是♠β(shì)計(jì)算(suàn)速度太慢(mànφΩ©),比如(rú),隻有(yǒu)64位寬來(lái)處理(lǐ)1✘×φ≤GB數(shù)據,那(nà)便需要(yào)循環拆分(fēn)N次才能(♣×λnéng)算(suàn)完,普通(tōng)的(de)C$∏ PU無法迅速處理(lǐ)這(zhè)麽大(dà)的(de)運算(suàn∑ )量。

在多(duō)路(lù)CPU系統中,線程看(kàn)到(dào)✘♦δ的(de)都(dōu)是(shì)單一(yī)的(de)虛☆ ♠↔拟地(dì)址空(kōng)間(jiān),這(zh≠←©è)個(gè)虛拟地(dì)址空(kōng)間(jiān)會(huì)被操‌π作(zuò)系統映射到(dào)真實的(de)物(©÷★πwù)理(lǐ)空(kōng)間(jiān)裡(lǐ),但(dàn)÷×‌是(shì)所有(yǒu)的(de)CPU看(kà≈♣≈n)到(dào)都(dōu)是(shì)同一(yī)份物(wù)理(lǐ)地(©' dì)址空(kōng)間(jiān)。

有(yǒu)人(rén)想到(dào)硬件(jiàn)加速,做σ≤☆(zuò)法就(jiù)是(shì)把某個(gè)專業≤™(yè)計(jì)算(suàn)在電(diàn)路(lù)層面展開(kāi),•♠展開(kāi)成更寬的(de)位寬,更多(duō£§£)的(de)并行(xíng)計(jì)算(suàn)單元,去(qù)除一(>Ωyī)些(xiē)不(bù)必要(yào)的(de)緩存優化(huà×‍✔)和(hé)流水(shuǐ)線優化(huà©>π)等,其實這(zhè)就(jiù)是(shì)專用(yòng↕')運算(suàn)芯片所做(zuò)的(de),Fλ♠¶PGA(Field-Programmable G±÷↓ate Array,即現(xiàn)場(chǎng)可(kě)編≤'☆✔程門(mén)陣列)是(shì)現(xiàn)場(chǎng)可(k✔β↑±ě)編程的(de)專用(yòng)芯片上(≤ <shàng)述就(jiù)是(shì)所±↑σ∞謂的(de)硬加速。

在CAPI之前的(de)FPGA怎麽接入系統∑♣✘σ使用(yòng)的(de)呢(ne)?它是(shì)☆π把FPGA做(zuò)到(dào)一(yī)塊PCIe卡裡(lǐ)∑₽,FPGA通(tōng)過CPU的(de)PC®σIe控制(zhì)器(qì)訪問(wèn)到(d×φ₹§ào)主機(jī)內(nèi)存空(kōng)間(jiā•≤≈<n)。PCIe和(hé)CPU各自(zì‌&♣ )有(yǒu)各自(zì)的(de)地(dì)址空φ>₩£(kōng)間(jiān),CPU不(bù)能(néng)直♣≈接訪問(wèn)PCIe的(de)地(dì)址,要(yào)先訪問φδ$(wèn)自(zì)己的(de)地(dì)址,PCIE物(wù)理(lǐ←"‍)地(dì)址空(kōng)間(jiān)映射到(d≤♣↓ào)CPU物(wù)理(lǐ)地(dì)址空(kōng)間(jiān)★ε★α,反之CPU物(wù)理(lǐ)地(dì)址空(kōng)間(♥✘£jiān)也(yě)需要(yào)映射到(dào)PCIE物(wù)理(lǐ)∞©地(dì)址空(kōng)間(jiān),這(zhè ☆)是(shì)個(gè)很(hěn)費(fèi)勁↔γα的(de)過程。

數(shù)據出了(le)ALU,面對(duì)♣↕✔Ω複雜(zá)的(de)路(lù)由網絡,目的(d₹←∑←e)地(dì)址為(wèi)內(nèi)存地(dì)址,但π®(dàn)是(shì)其相(xiàng)對(d✔♣σ£uì)外(wài)部網絡的(de)複雜(♠  ←zá)性在于,目标的(de)位置是(shì)不(bù)固定的(de§>),還(hái)可(kě)能(néng)有(yα&∏ǒu)多(duō)份拷貝。 Need Coherency!硬件(jià<™n)透明(míng)搞定Cache Cohe♣≤β↓rency。CC不(bù)負責多(duō)線•₽程并發訪問(wèn)cache line時(shí)的(de)互斥,互γ₹φ↔斥需要(yào)程序顯式發出lock,底層硬件(jiàn)會(huì)鎖住總線↓→→ 訪問(wèn)周期。

如(rú)圖所示是(shì)個(gè)四核CPU,每個(g₩★¥è)CPU內(nèi)部還(hái)有(yǒu)很(hěn)多(duō₹εΩ)東(dōng)西(xī),每一(yī)個(gè)CPU的(de)每個(≤'÷ gè)核心都(dōu)有(yǒu)各自(zì)的(de)緩存控≠≤制(zhì)器(qì),三級緩存控制(zhì)器(qì),每個(g¶×•è)CPU還(hái)包含內(nèi)存控制(zhì)器(qì),PCIe←&×控制(zhì)器(qì),QPI控制(zhì)器(qì★∞≤)(互聯CPU相(xiàng)關),還(hái)有(yǒu)緩存一(yī)緻性γλ的(de)控制(zhì)器(qì),他(tā)們全都<<<(dōu)接入一(yī)個(gè)高(gāo)速的(de)總線裡(lǐ)面。€∏≥≥多(duō)個(gè)線程看(kàn)到(§↕→dào)的(de)數(shù)據應該是(sh♠γ≈ì)時(shí)刻一(yī)緻的(de),需要(yào)廣£$×$播許多(duō)信息,這(zhè)就(jiù)是(shì)Cache C∑≠✘φoherency,Cache Coherency AΩ↑gent 負責把消息推送出去(qù)以及接受其他(t∞≈ā)CPU發出的(de)探尋。

多(duō)CPU之間(jiān)廣播量非常大(dà),所以需要(yà≠£o)一(yī)個(gè)目錄來(lái)記錄本地(dì)的(de)核心裡( ☆₩lǐ)面都(dōu)有(yǒu)哪些(xiē)緩存地(dì)址被♦‍✔緩存下(xià)來(lái)了(le)。其他(tā)的(de)CPUβ∏←如(rú)果發廣播來(lái)探尋,本地(dì)直接把目錄查一(yī)下(<>↑xià),如(rú)果沒有(yǒu)命中緩存就(j♦σiù)直接不(bù)再往後端核心緩存控制(zhì)器(qì)發消息,這(zhè ₩ ♥)樣可(kě)以提升性能(néng)。所以說(shuō)CC(Ca✘♠∑♣che Coherency)很(hěn)重要(yào)的(de¶✘),要(yào)确保線程看(kàn)到(dào)同樣的(de>​™♥)東(dōng)西(xī),同一(yī)個(gè)時(shí)♠↓•刻,這(zhè)叫實時(shí)一(yī)緻性,且不(bù)允許異步φ®。但(dàn)是(shì)它不(bù)負責兩個(gè)線程,如(r₩♣→ú)果互相(xiàng)都(dōu)在寫這(zhè)份ε$•✔數(shù)據,會(huì)出現(xiàn)相(xiàng)互覆蓋,這&↑​‌(zhè)要(yào)靠(Cache Consistancy)軟件(jià™₽n)解決。PCIe寫內(nèi)存也(yě)需α♦ ↔要(yào)做(zuò)CC(Cache Coherencλ♥Ωy),寫入數(shù)據到(dào)某一✔∏ ©(yī)地(dì)址,這(zhè)個(gè)地(dì)址在其∞'β他(tā)的(de)CPU緩存裡(lǐ), π要(yào)把它作(zuò)廢掉。

在把FPGA做(zuò)在一(yī)張PCIe卡上(✘✔Ωshàng),PCIe卡總線接到(dào)CPU的(de)情況下(x≥↑α♣ià),PCIe要(yào)做(zuò)哪些(xiē)工≤•≥ (gōng)作(zuò)呢(ne)?

PCIe設備與CPU交互

按照(zhào)上(shàng)面的(de)過程® ↔★走下(xià)來(lái),缺點非常明(míng)顯:

首先執行(xíng)路(lù)徑長(cháng)而且全軟件(jiàn)">參與:應用(yòng)call、傳輸協議(yì)棧、Host驅動α↓、PCIe設備、DMA、中斷服務、Host驅動、傳輸協→✘Ω議(yì)棧(如(rú)有(yǒu))、應用(yΩ≠òng)buffer。

再就(jiù)是(shì)PCIE設備和(hé)CPU看(×∑kàn)到(dào)不(bù)同的(de)物(w<∑ù)理(lǐ)地(dì)址空(kōng)間(©'∏jiān),RC進行(xíng)映射和(hé)轉換。驅動程序申請(qǐng↕&♦)內(nèi)存之後得(de)用(yòng)pci©γ _map_single()映射成PCIE物(wù)理(lǐ)₽∞地(dì)址。雖然對(duì)于諸如(rú)Intel體(tǐ)系下(xiàδ ©),兩個(gè)空(kōng)間(jiān)映射成一(yī)樣的 σ®(de)地(dì)址,但(dàn)是(shì)π<仍需要(yào)在軟件(jiàn)裡(l£∑ǐ)做(zuò)映射,這(zhè)對(duì)性能(γ€¶ néng)有(yǒu)一(yī)定的(d&εγe)影(yǐng)響。

另外(wài),用(yòng)戶态程序必須主動從(cóng)內(nèi)核地πα®(dì)址空(kōng)間(jiān)mmap(§♦×)才可(kě)以直接與PCIE設備DMA互傳數(γ∏σ♦shù)據。用(yòng)戶态程序必須區(qū)分(fēn'αφ)不(bù)同的(de)地(dì)址段,要(yào)分(fēn)清哪一(yī)→π∏ 塊內(nèi)存是(shì)DMA映射的(de),哪一(yī≈→)塊是(shì)自(zì)己私有(yǒu)的(de)的(de)☆ λ。

最後,FPGA上(shàng)不(bù)能σ↔ ∏(néng)有(yǒu)Cache(緩存),FPGA自(zì)己可(kě)'∏∏以有(yǒu)自(zì)己的(de)Cache,但(d§∞àn)是(shì)不(bù)能(néng)把主存裡(lǐ)的(de)>☆數(shù)據放(fàng)在自(zì)己這(zhè)邊,每★≤次訪問(wèn)內(nèi)存都(dōu♥≠φ→)要(yào)用(yòng)複雜(zá)的(de₹<ε£)過程訪問(wèn)主存裡(lǐ),這(zhè)也(yě)是>→(shì)一(yī)個(gè)關鍵的(de)缺點。

所以我們看(kàn)到(dào)為(wèγ&i)了(le)讓FPGA做(zuò)一(yī)件(jiàn)事(®¥shì),進行(xíng)了(le)太多(×✘‍ duō)操作(zuò),開(kāi)銷很₩σ(hěn)大(dà),很(hěn)費(fèi)時(shí)間(jiān)©<,這(zhè)需要(yào)别的(de)技(jì)術(shù)來(lái)解決ε £‍之。

有(yǒu)了(le)CAPI的(de)♥±≥FPGA是(shì)怎麽做(zuò)的(de)?

首先認識一(yī)下(xià)這(zhè)個≤₹(gè)體(tǐ)系裡(lǐ)的(de)三個(gè)角色:

AFU(Acceleration Function Unit),主加速邏輯部分(fēn)就(jiù)是(sβδ☆®hì)FPAG的(de)加速芯片,用(yòng)戶可(kě)以把自(z•™₽ ì)己的(de)加速邏輯和(hé)Firmware寫進♦"去(qù)。

PSL(Power Service Layer)πφ∑, 提供接口給AFU用(yòng)于讀(dú)寫÷δβ主存和(hé)V2P地(dì)址翻譯(與CPU側使用(yòng)同一(yī✘±)個(gè)頁表,并包含TLB),同時(shí♠ ​)負責Probe CAPP實現(xiàn)全©∑≥←局cc,并提供Cache。PSL由IBM作(zuò)為(wèi)硬核IP提供ε>給FPGA開(kāi)發者。

CAPP(Coherent Attached Process$‍or Proxy), 相(xiàng)當于FPGA側的(de)ccAgent,但(d∏γàn)是(shì)被放(fàng)在了(le)CP÷¥U側,其維護一(yī)個(gè)filte• ♦<r目錄并接受來(lái)自(zì)其他(tā)CPU的(de)Probe,未過γλγ濾掉的(de)Probe轉發PSL。

操作(zuò)要(yào)點可(kě)以簡要(yào$♣)的(de)概括為(wèi)以下(xià)6↕₽≥點:

在這(zhè)過程中,CAPI緻力于把Fα↓≥PGA當成CPU的(de)對(duì)等端,但(dàn)這♠¥↕(zhè)是(shì)一(yī)個(gè)特殊的(de™γσ)CPU,對(duì)計(jì)算(suàn)加速非常快(kuàiγ★™)的(de),非常高(gāo)效的(de)一(y☆↑ī)個(gè)CPU。優勢在于:兩邊看(kàn)到(dào)了'≥<₽(le)一(yī)樣的(de)地(dì)址空(kōng)間(jiān),≈↓✔FPGA看(kàn)到(dào)的(de)"©§≤不(bù)再是(shì)PCIe空(kōng)間(jiān)了(l™≈→£e),所以就(jiù)省去(qù)了(le)映射地(dì)址這(zhè)一"&​€(yī)環節。再就(jiù)是(shì)FPGA一(yī)側可(kα↓'©ě)以有(yǒu)Cache,可(kě)以緩存主存裡(lǐ)的π☆♠(de)數(shù)據,而且Cache是(shì)與主存一(yī)緻的(♥≠✔εde)。

現(xiàn)在FPGA可(kě)直接訪問(wèn)主存空(kε←∞ōng)間(jiān),但(dàn)它不(bù)會(huì)訪問™♠← (wèn)所有(yǒu)的(de)物(wù)理(lǐ)空(kōng)間(j₽∏ σiān),因為(wèi)CAPI 1.0每個(gè)時(shí)刻隻能(né₩Ωng)給一(yī)個(gè)進程來(lái)用(yòng),CAPI會(huìδαγ)為(wèi)進程會(huì)提供一(yī)個(gè)接口,打開(kā↔↑i)FPGA之後發數(shù)據和(hé)指令。CAPI 2.0會(huì☆€±→)讓FPGA有(yǒu)一(yī)個(gè)分(fēn)時(s¶©hí)複用(yòng)機(jī)制(zhì),比如(rú),每10毫秒(m§♥•♣iǎo)跳(tiào)一(yī)個(gè)線程,但(dàn)是(shì)當前的​←¶(de)FPGA不(bù)具備這(zhè)個(gè)功能(n₹✘←™éng),隻能(néng)是(shì)誰σφ≤÷用(yòng)誰打開(kāi)。誰打開(kāi)了( ♠→♥le)FPGA就(jiù)看(kàn)到(dào)誰的(de)虛拟空(kōngγε'≥)間(jiān)。有(yǒu)了(le)這(zhè)種機(jī)制(zhì∞∑δδ)以後就(jiù)不(bù)需要(yào)映射了"≠(le),再就(jiù)是(shì)可(kě)以直接∞×訪問(wèn)內(nèi)存地(dì)址了(le)。還(hái)有(yǒ≥ €u)Cache,基本就(jiù)融入了(le)所≠φ​有(yǒu)的(de)CPU了(le),就(jiù)是(shì)一(yī)個¥∞(gè)對(duì)等、對(duì)稱的(de)關系₽ε↑φ。

性能(néng)能(néng)提高(gāo)多(duō)少(shǎo)×§"?

PMC做(zuò)了(le)許多(duō)測試,在測試過程σ₹♥中的(de)硬件(jiàn)配置是(shì)這(zhè§×)樣的(de):

IBM Power8 Server, S822L

Ubuntu, kernel 3.18.0- 14-ge•₽♥‌neric

Nallatech 385 CAPI card

Samsung SM1715 1.6TB NVM Expα§"∑ress SSD

測試時(shí),ŸPMC工(gōng)程師(shī)用(yòng)"☆'FPGA制(zhì)作(zuò)了(le)↓✔一(yī)個(gè)文(wén)本搜索引擎✔♥,如(rú)上(shàng)圖。

測試過程中,Host端主程序從(cóng)NVΩπ✔Me SSD讀(dú)入數(shù)據,并生(shē↔∑π‍ng)成任務描述鏈表,ŸAFU 采用(yòng)pooling的(de)↓★λ方式訪問(wèn)主存獲取任務描述鏈表并執行(xíσ€↕βng)搜索任務,ŸSnooper用(yòn"≠•g)來(lái)debug和(hé)性能(né€♣ng)監控。我們來(lái)看(kàn)一(yī)下(x© ‍ià)測試結果:

性能(néng) – P8<-&g φt;AFU

當隊列深度60時(shí)的(de)時(shí)候,獲得(de)一(yī)↑ 個(gè)極限吞吐量,接近(jìn)6GB/s的(de)帶寬,帶δ'σ寬非常大(dà)。

延時(shí)也(yě)很(hěn)小(x♣×€iǎo),隻有(yǒu)1.5微(wēi)秒(miǎ₩¶→¥o),平均90%讀(dú)寫在1.5微(wēi)✔•€₩秒(miǎo)完成。

CAPI 1.0暫時(shí)做(zuò)不(bù)到(dào)的(de)事∑∏≈↓(shì)情

 

現(xiàn)在CPU的(de)線程看(kàn)不(bù)到(dào)AFφ∑± U上(shàng)的(de)地(dì)址空(kōng)間(j¥<™λiān)(MMIO控制(zhì)寄存器(qì)地(dì)址除外(wài))。而←π"且,AFU隻能(néng)給一(yī)個(gè)↓₽δ'進程使用(yòng)。如(rú)果未來(lái)可(™™kě)以把FPGA直接接入CPU的(de)FSB,是(shì)不(bù)是(≠§‌↑shì)會(huì)更快(kuài)?