加速器類似于圖像處理單元(GPU)已經(jīng)越來越多地用在現(xiàn)代的數(shù)據(jù)中心,因為他們擁有高計算能力和高帶寬。傳統(tǒng)來說這些加速器依賴于“主應(yīng)用代碼”和運行在CPU上的操作系統(tǒng)來控制他們對存儲設(shè)備的訪問。CPU控制GPU對存儲設(shè)備的訪問在典型的GPU應(yīng)用上都有比較出色的表現(xiàn),比如稠密的神經(jīng)網(wǎng)絡(luò)訓(xùn)練,其中數(shù)據(jù)訪問的模板預(yù)定義的很好,有規(guī)律的,而且稠密,獨立于數(shù)據(jù)值,能使CPU把存儲數(shù)據(jù)粗粒化,并且能使存儲數(shù)據(jù)訪問和與加速器的數(shù)據(jù)交互有效協(xié)同。不幸的是,這種以CPU為中心的策略導(dǎo)致了CPU-GPU過度的同步,并且IO阻塞惡化,減少了需要細粒度的存儲訪問模板的新興中的訪存帶寬,例如圖和數(shù)據(jù)分析,推薦系統(tǒng),圖神經(jīng)網(wǎng)絡(luò)。在我們的工作中,我們提出了一種能達到細粒度,高吞吐率的GPU內(nèi)存訪問方法來訪問NVMe固態(tài)存儲硬盤(SSDs)通過一個新的叫BaM的系統(tǒng)結(jié)構(gòu)。BaM緩和了IO阻塞惡化通過使用GPU線程來讀或者寫少量的需要計算的數(shù)據(jù)。
我們展示了(1)運行在GPU上的BaM基礎(chǔ)軟件可以識別并細粒度,高效率地對底層存儲設(shè)備進行訪問。(2)即使是消費級地SSD,BaM系統(tǒng)和貴很多的只用DRAM地方案相比也可以支持應(yīng)用性能。(3)減少的IO阻塞可以帶來更大的性能收益。這些結(jié)果是通過引入高吞吐率的GPU數(shù)據(jù)結(jié)構(gòu)類似碎裂和軟件緩存來實現(xiàn)GPU中大量的進程級并行來解決SSDs訪問的長延遲。我們已經(jīng)簡歷了一個BaM系統(tǒng)原型并且在一些應(yīng)用和數(shù)據(jù)集上面使用不同的SSD類型估算了它的性能。和最先進的解決方案相比,BaM原型提供了平均的0.92x和1.72x端到端加速倍數(shù),載荷為BFS和CC圖分析,使用了4個Intel Optane SSD硬盤和高達4.9倍的數(shù)據(jù)分析負載,使用了一個Optane SSD。
簡 介
近年來GPU的計算吞吐率快速增長,舉個例子,如表1中所示,GPU的計算吞吐量從G80到A100在13年的跨度中增長了452倍??梢钥吹降氖?,A100的吞吐量已經(jīng)比它的暫存CPU高出了1~2個數(shù)量級。盡管GPU內(nèi)存帶寬的增長沒有如此引人注目,表1中提出的18倍,但A100的內(nèi)存帶寬也比它的暫存CPU高出一個數(shù)量級。一個相同趨勢也趁現(xiàn)在AMD的各代GPU上。因為擁有這種級別的計算吞吐量和內(nèi)存帶寬,GPU已經(jīng)變成了流行的高性能計算應(yīng)用設(shè)備,占據(jù)了神經(jīng)網(wǎng)絡(luò)訓(xùn)練計算設(shè)備的主要位置。
表1.從NVIDIA G80到A100的性能進步
新興的高價值的數(shù)據(jù)中心負載比如圖和數(shù)據(jù)分析,圖神經(jīng)網(wǎng)絡(luò),還有推薦系統(tǒng),能潛在地受益于GPU的高計算吞吐量和高內(nèi)存帶寬。然而,這些工作負載必須涉及到大量的典型的數(shù)十GB到數(shù)十TB的數(shù)據(jù)結(jié)構(gòu),在預(yù)測中,未來將增長迅速。如表1中所示,A1000的內(nèi)存容量,雖然和G80相比增加了53倍,但是也僅有80GB,和這些工作負載所要求的容量相比相差甚遠。
對于存儲這些大容量數(shù)據(jù)結(jié)構(gòu)而GPU內(nèi)存容量不足的問題,一個可行的解決方案是把多個GPU的內(nèi)存容量合并來滿足存儲需求,并使用快速的共享內(nèi)存互聯(lián)類似NVLink來連接多個GPU,使得他們能訪問每一塊的內(nèi)存。整個數(shù)據(jù)結(jié)構(gòu)首先會被分片存到GPU的內(nèi)存中,之后算法會識別并且訪問他們實際使用的部分。這個方法有兩個缺點。首先,整個數(shù)據(jù)結(jié)構(gòu)需要從存儲空間移動到GPU的內(nèi)存中,即使僅有一塊被訪問到,這會顯著增加應(yīng)用的啟動延遲。其次,數(shù)據(jù)大小取決于應(yīng)用所需求的GPU格式,它會導(dǎo)致需要儲備的計算資源嚴重超出當(dāng)前的工作負載。
使用主存,目前典型的范圍在128GB~2TB大小,來幫助存儲分片后的數(shù)據(jù)結(jié)構(gòu)可以減少所使用的總GPU數(shù)。我們把這種使用主存來擴展GPU內(nèi)存的方式稱之為DRAM-only解決方案。因為多個GPU可能傾向于使用相同的CPU和主存在數(shù)據(jù)中心的服務(wù)器中,對于每個GPU的內(nèi)存容量來說,這些DRAM-only解決方案僅僅增加了主存的幾分之一的內(nèi)存。舉個例子,在英偉達DGX A100系統(tǒng)中,每個主存被8個GPU共享,因此,使用主存僅僅把每個GPU的內(nèi)存擴展了主存大小的1/8。
對于它們最近的在延遲,吞吐率,花費,密度和耐久度上的提升,SSDs有理由成為實現(xiàn)另一種內(nèi)存層次的候選方案。在這篇文章中,我們提出了使用GPU來使用本地的或者遠端的SSD來擴展GPU的內(nèi)存作為一種更低成本和更加具有可伸縮性的方案。我們將比較該方案和目前最好的解決方案的性能。
方案:我們提出了一種新的系統(tǒng)接口叫做BaM(大型加速器內(nèi)存)。BaM的目標(biāo)是來擴展GPU的內(nèi)存容量,并有效地增加存儲器訪問帶寬,同時提供高層次的GPU進程抽象,使得GPU線程能完成按需的,細?;脑L存請求,來擴展內(nèi)存層次。在這篇paper中,我們提出并且估計了一些關(guān)鍵點,并且整個BaM的設(shè)計提出了三個重要的技術(shù)挑戰(zhàn)來有效地支持這些加速應(yīng)用的按需訪存請求。
首先,對于按需的訪存請求來說,傳統(tǒng)的內(nèi)存映射的文件抽象方式以來虛擬地址轉(zhuǎn)換來計算當(dāng)前待訪存數(shù)據(jù)的位置。然而,應(yīng)用稀疏地訪問大型數(shù)據(jù)結(jié)構(gòu)會導(dǎo)致過度地TLB缺失,而且串行化并行訪問請求會導(dǎo)致大量的GPU線程。BaM提出了一種高并發(fā),高吞吐量的軟件緩存來對它進行替代。這個緩存是高度參數(shù)化的,可以讓開發(fā)者根據(jù)他們應(yīng)用的需求進行設(shè)置。有了軟件緩存,BaM不依賴于虛擬地址轉(zhuǎn)換,因此就不會被出串行化的事件影響比如TLB缺失。
其次,基于內(nèi)存映射的文件抽象使用缺頁處理進行維護,并且運行在傳統(tǒng)的CPU上的文件系統(tǒng)服務(wù)有數(shù)據(jù)搬運的需求。以CPU為中心的模型,這里指通過CPU來處理缺頁時的數(shù)據(jù)搬運,對于OS的缺頁處理函數(shù)來說受制于底層的CPU進程級并行性是否可行。為了解決這個問題,BaM提供了一個用戶級的庫用于在GPU內(nèi)存中實現(xiàn)高并發(fā)的NVMe提交/完成隊列,這使得按需訪問的GPU線程在軟件緩存未命中的情況下仍然能高吞吐量地完成訪存。這種用戶級別的方式使得軟件每次訪存的開銷較小,并且支持高級別的進程級并行。
第三,為了避免虛擬地址轉(zhuǎn)換和缺頁處理的高開銷,應(yīng)用程序員采取了對數(shù)據(jù)進行分塊并且根據(jù)每種計算方式控制數(shù)據(jù)搬運的方式。傳統(tǒng)文件系統(tǒng)服務(wù)中這樣的CPU-GPU同步帶來的高代價迫使開發(fā)者粗粒度地搬運數(shù)據(jù)。不幸地是,由于對我們目標(biāo)程序的數(shù)據(jù)訪問傾向于無規(guī)律和稀少的。這些粗粒度的數(shù)據(jù)搬運導(dǎo)致SSD和CPU/GPU的內(nèi)存中很多有無用的字節(jié),一個現(xiàn)象是I/O擴大。如參考文獻中所述的工作,I/O擴大減少了關(guān)鍵資源的有效帶寬例如PCIe鏈路。
表1中,對于A100,訪存帶寬受限于PCIe Gen4的x16帶寬,它是32GB/s,僅僅約為A100內(nèi)存帶寬的2%。更嚴重的訪存由于I/O擴大引起的訪存帶寬的丟失可以認為是應(yīng)用性能丟失的一個重要信號。在BaM中SSD使用并行隊列和多個SSD,我們實現(xiàn)的系統(tǒng)中GPU可以足夠快速地進行細粒度的I/O請求,來完全使用SSD的設(shè)備并且明顯地減少I/O擴大地級別。
在我們已經(jīng)擁有的認知中,BaM是第一個加速器中心的模型,GPU可以獨立地識別和完成數(shù)據(jù)訪存請求不管它是儲存在內(nèi)存或者存儲設(shè)備中,不依賴于CPU的控制。當(dāng)傳統(tǒng)的龐大而單調(diào)的服務(wù)器架構(gòu)在用戶級別對于存儲設(shè)備隊列的實現(xiàn)出現(xiàn)安全問題時,最近數(shù)據(jù)中心開始轉(zhuǎn)向零新人的安全模型,并且NiC/DPU進行的安全相關(guān)性檢查也為加速器為中心的訪存模型,比如BaM,提供了新的框架。
我們已經(jīng)通過現(xiàn)成的硬件組件簡歷了一個BaM原型系統(tǒng)。采用多種不同類型的工作負載,多種數(shù)據(jù)集對BaM原型系統(tǒng)進行評價,展示了BaM能與最優(yōu)秀的解決方案達到相同水平,或是略慢一點,甚至是更加出色。
總結(jié)一下,我們主要做出了以下這幾點貢獻:
1.提出了BaM,一個以加速器為中心的架構(gòu),GPU線程能細粒度,按需訪存,不管它是存儲在內(nèi)存或者其他存儲設(shè)備中。
2.允許按需的,高吞吐量的細粒度訪存請求,通過高并行的I/O隊列實現(xiàn)
3.為程序員提供高吞吐量,低延遲的緩存和軟件API,來利用局部性并且控制它們應(yīng)用中的數(shù)據(jù)搬運。
4.對于成本敏感性的內(nèi)存容量可變的加速器,提出和評估了一種經(jīng)過概念驗證的設(shè)計。
我們計劃開源硬件和軟件優(yōu)化的細節(jié),來使任何人都能建立BaM系統(tǒng)。
背景和動機
A.CPU為中心的訪存途徑中的軟件開銷
這個部分展示了對于BaM模型背景信息的重要評估數(shù)據(jù),來使得讀者更好地理解BaM系統(tǒng)中的關(guān)鍵點。
按需的訪存請求可以分為兩種類型a)隱式和間接的 b)顯式和直接的。隱式和間接的訪存途徑在CPU為中心的模型中可以采用擴展CPU內(nèi)存映射的文件抽象到GPU線程中的方式實現(xiàn)。NVIDIA Pascal架構(gòu)中,GPU驅(qū)動和編程模型允許GPU線程來隱式地訪問大型的虛擬內(nèi)存對象,這些可能會部分分布于主存中,采用了通用虛擬內(nèi)存抽象(UVM)。之前的工作展示了UVM驅(qū)動可以被擴展成連接文件系統(tǒng)的接口來訪問存儲,當(dāng)一個頁面是一個內(nèi)存映射的文件中的一部分,并且它在GPU內(nèi)存和主存中缺失。
這個方法的主要優(yōu)點是所有的訪存操作都是簡單的訪存操作,可以在GPU的內(nèi)存帶寬上進行訪問只要頁和待訪問的數(shù)據(jù)存儲在GPU的內(nèi)存。然而,這個反應(yīng)的途徑在虛擬地址轉(zhuǎn)換和缺頁處理時,當(dāng)待訪問的數(shù)據(jù)不在GPU內(nèi)存中并且它需要被從外部存儲調(diào)入GPU內(nèi)存中時會引起軟件開銷。因此,我們可以看到對于UVM實現(xiàn)來說最大化的頁傳輸吞吐量會成為基于虛擬地址轉(zhuǎn)換和缺頁處理的按需訪存請求的上界。
圖1.跨不同數(shù)據(jù)集的 BFS 圖遍歷應(yīng)用程序的 UVM 頁面錯誤開銷
圖1中的每一條都展示了完成的主存到GPU內(nèi)存的數(shù)據(jù)傳輸帶寬對于UVM缺頁請求在英偉達A100 GPU,PCIe Gen4系統(tǒng)中執(zhí)行BFS圖遍歷在5個不同的數(shù)據(jù)集上(參見表4),邊列表在UVM地址空間中,初始化在主存中,根據(jù)圖1,UVM缺頁機制完成的PCIe帶寬約為14.52GBps,它只有測量的PCIe Gen4帶寬26.3GBps的55.2%。從資料手機的數(shù)據(jù)來看,在我們的實驗中最大的缺頁處理速率達到了約500K IOP。從表3中可以看出,500K IOP只有Samsung 980proSSD的一半完全吞吐量,并且比Intel Optane SSD的完全吞吐量少10%。再則,UVM缺頁處理器的IOP由于幾種因素被限制,其中包括有限數(shù)量的可使用資源來處理TLB確實以及串行驅(qū)動器的實現(xiàn)。在我們的實驗中,我們發(fā)現(xiàn)主CPU上的UVM缺頁處理在進行圖遍歷性能測試的時候100%執(zhí)行了。
由于存在這些限制,即使我們通過集成系統(tǒng)層到UVM驅(qū)動的方式構(gòu)建了一個假定的系統(tǒng),并且假設(shè)它沒有附加的開銷,對于當(dāng)前的UVM實現(xiàn)來在一個相當(dāng)?shù)母咚俾蕘碜龅綄SD的細粒度的完全使用依舊是不可能的。因此,BaM采用了軟件緩存和高吞吐率的用戶級別的NVMe隊列來避免TLB和缺頁處理的性能瓶頸,并且提供顯式和直接的存儲訪問方式。
B.一個具體的I/O擴大的例子
一個以CPU為中心的處理缺頁請求的途徑要求程序員來對數(shù)據(jù)進行分塊并且編寫CPU的代碼來根據(jù)各個計算的階段來控制數(shù)據(jù)搬運。盡管這種以CPU為中心的模型在一些經(jīng)典的具有很好的預(yù)定義,有規(guī)律和稠密的訪存模板的GPU應(yīng)用中有較好的工作情況,但當(dāng)它被應(yīng)用到我們的目標(biāo)程序例如數(shù)據(jù)分析上面時就會出現(xiàn)問題。用于同步的執(zhí)行時間開銷和CPU的控制迫使開發(fā)者采用粗粒度的數(shù)據(jù)傳輸,它會加劇I/O擴大的惡化。
把在紐約出租車數(shù)據(jù)集上執(zhí)行分析問題作為一個例子。假設(shè)我們進行提問:問題1:從Williamsburg開始的平均旅行距離是多少?這個問題要求掃描整個數(shù)據(jù)集中的pickup_gid列來找到符合從Williamsburg出發(fā)的條件的項目。然后那些旅程中的trip_dist值需要被加起來來產(chǎn)生問題的答案。然而,由于對trip_dist列的訪問和pickup_gid列的訪問是獨立的,在CPU為中心的模型中,CPU不能決定哪個trip_dist值是被要求的。所以,為了增強存儲帶寬,目前最優(yōu)秀的GPU加速數(shù)據(jù)分析的框架,文獻中的RAPIDS,會從GPU的存儲中抓取這兩列中的所有的行。因為只有901k從Williamburg出發(fā)的旅途和因此只有0.05%的第二列數(shù)據(jù)會被使用。上述問題導(dǎo)致RAPIDS在這個問題上引起了6.34倍的I/O擴大。
如果把問題改成:問題1:從Williamsburg開始的旅行的平均總花費是多少?那么有三列會被訪問到:pickup_id,trip_dist和total_amt。為了這個提問,RAPIDS導(dǎo)致了10.36倍的I/O擴大由于它傳輸了兩個完全數(shù)據(jù)獨立的列,trip_dist和total_amt到GPU的內(nèi)存中。這個提問可以擴展為回答一些更加感興趣的問題通過增加數(shù)據(jù)獨立的指標(biāo),比如附加費(問題3),打車費(問題4),通行費(問題5)和稅費(問題6),但是完成這些會導(dǎo)致CPU為中心的模型中的嚴重的I/O擴大,如圖2中所示,在BaM的這些細粒度的,按需的訪存能力能緩解這些I/O擴大的問題。
圖2.使用最先進的 RAPIDS系統(tǒng)對 GPU 加速的數(shù)據(jù)分析應(yīng)用程序中的I/O擴大現(xiàn)象
C.延遲,吞吐率,隊列深度和并發(fā)性
高吞吐量的訪存系統(tǒng)的設(shè)計都要基本地遵循Little定律:。T是目標(biāo)地吞吐量,例如期望的每秒的訪存數(shù),L是平均延遲,例如從開始到完成每個訪存的秒數(shù),Qd是需要在一段時間內(nèi)支撐目標(biāo)吞吐量的最小隊列深度。
如果一個系統(tǒng)可以可以產(chǎn)生訪存請求在不超過T的平均速率下,那么T會被訪存數(shù)據(jù)中的大部分關(guān)鍵資源瓶頸限制。在我們的BaM原型系統(tǒng)的情況中,我們想完成對關(guān)鍵資源的最大化利用。PCIe x16第四代連接擁有512B和4KB的訪存粒度。因此考慮估計的最大的PCIe x16第四代帶寬大概是26GBps,對于512B訪問中的T值是26GHps/512B=51M/sec,4KB的訪問中是26GBps/4KB=6.35M/sec。
L的值依賴于使用的SSD設(shè)備和互聯(lián)的延遲,訪問一塊Intel Optane SSD通過x4 PCIe第四代互聯(lián)具有11us的平均延遲,訪問Samsung 980pro小飛機SSD通過PCIe x4第四代互聯(lián)具有324us的平均延遲。根據(jù)Little定律,要支持期望的51M的每次512B的訪問,對于Optane SSD來說,系統(tǒng)需要容納一個具有51M/s*11us=561的請求項的隊列(對于每次4KB的方式來說是70項)。對于Samsung 980pro SSD,需要的能支持相同目標(biāo)吞吐量的Qd是51M*324us=16524(對于4KB來說是2057)。
注意上述隊列深度可以通過多個隊列被傳播,只要這些隊列被SSD設(shè)備積極地使用。因此,在任意時刻,這個系統(tǒng)都必須有至少有561項并行請求存在于提交隊列中來支持目標(biāo)吞吐量T。很明顯,它必須有很多倍這個數(shù)目的并行可使用請求中來支撐隊列深度,從而達到T的一段時間內(nèi)的吞吐量。
假定對于應(yīng)用的一個階段,我們有X個并行的可使用訪問請求。假定這些請求可以被入隊在吞吐量至少達到T的情況下,我們可以期望為了支撐服務(wù)所有請求的投遞速率是投遞總時間除以投遞請求X/(L+X/51M)。當(dāng)X遠大于51M乘以L時,被支撐的投遞速率會很接近51M。對于Intel Optane SSD來說,應(yīng)用需要有約8K的并行可使用的訪問在每個執(zhí)行階段中,而消費級的Samsung 980pro SSD 約需要256K并行訪問來建立可支撐的訪問速率在51M,512B的粒度(2K和64K并行訪問,4KB的粒度對于Intel Optane和Samsung 980pro SSD來說)。這意思是,擁有足夠的并行可使用的訪問,消費級的SSD可以達到服務(wù)器級的SSD的吞吐量水平。
因此,一個系統(tǒng)需要有至少10個Intel Optane SSD或者多達50個Samsung SSD,所以SSD不是訪存的瓶頸。更進一步說,由于所有的SSD在寫時候的吞吐量都遠遠低于讀時候的吞吐量,所以一個具有大量寫請求的應(yīng)用更容易會導(dǎo)致SSD引起性能瓶頸。
D.NVMe隊列
NVMe協(xié)議時工業(yè)級最新的定義的標(biāo)準協(xié)議來完成高吞吐量的訪存給服務(wù)器級和消費級的SSD提供虛擬化支持。NVMe協(xié)議最大支持64K的并行提交(SQ)和完成(CQ)隊列,每個設(shè)備都具有64K的表項。NVMe設(shè)備驅(qū)動在內(nèi)存中分配了一個緩存池供SSD設(shè)備中的DMA引擎進行使用來完成讀和寫請求。在傳統(tǒng)的CPU為中心的模型中這些隊列和緩存存在于系統(tǒng)內(nèi)存中。
一個應(yīng)用程序進行訪存請求會導(dǎo)致驅(qū)動從I/O緩存池中該請求分配一塊緩存并且在SQ的尾部一個NVMe I/O命令入隊,并給它一個獨立的命令標(biāo)記。
之后該驅(qū)動程序?qū)懭胍粋€新的尾值到指定的SQ的只寫寄存器,在NVMe SSD的BAR空間中,舉個例子,它產(chǎn)生了該隊列的doorbell。為了提高效率,一個驅(qū)動在多次將請求入隊SQ時產(chǎn)生一次doorbell。
對于讀請求來說,SSD設(shè)備控制器通過它的DMA引擎訪問它的存儲介質(zhì)并且傳輸數(shù)據(jù)到鏈接好的緩存。對于一個寫請求,SSD設(shè)備控制器通過DMA把數(shù)據(jù)從它的緩存中搬到它的存儲介質(zhì)中。一旦一個請求被服務(wù),SSD控制器就會在CQ中插入一個表項。當(dāng)主控制器檢測到CQ中有一個包含命令標(biāo)記的表項,它會完成這個請求并且釋放隊列中的空間和請求的緩存。完成表項也會告知驅(qū)動SQ中有多少表項被NVMe控制器處理掉了。驅(qū)動使用這個信息來釋放SQ中的空間。為了和之前的進度通信,驅(qū)動之后會產(chǎn)生CQ隊列的帶有新的CQ頭的doorbell,為了效率,一個SSD設(shè)備在一次傳輸中的多個請求中都可以插入CQ表項。
因為SSD設(shè)備的延遲已經(jīng)被減少通過先進的技術(shù)例如似乎用Optane或者ZNAND存儲媒介,軟件開銷變成了整個I/O訪問延遲的重要部分。事實上,我們的測量數(shù)據(jù)展示了對于Intel Optane SSD,軟件延遲占到36.4%的比重。BaM設(shè)計軟件緩存和高吞吐量的NVMe隊列就是用來減少或者避免這些軟件開銷。
BaM系統(tǒng)和結(jié)構(gòu)
BaM設(shè)計的目標(biāo)是設(shè)法解決GPU的不足的內(nèi)存容量并且增強有效的訪存帶寬,同時為加速器提供高層次的抽象,來完成按需的,細粒度的,高吞吐量的存儲設(shè)備訪問。BaM提出了一種以加速器為中心的模型,GPU線程可以在數(shù)據(jù)存儲的位置直接訪問數(shù)據(jù),在內(nèi)存或者在外部存儲中,不需要CPU來控制數(shù)據(jù)搬運。為了達到這個目的,BaM在GPU的內(nèi)存中提供了NVMe的I/O隊列和緩存并且映射UVMe的doorbell寄存器到GPU的地址空間。由于這樣做會使得GPU線程去訪問TB級別的NVMe SSD的數(shù)據(jù),BaM必須提出三個關(guān)鍵的挑戰(zhàn)來提供一個高效的解決方案。
1)由于NVMe協(xié)議和設(shè)備會引起重要的要吃,BaM需要增強GPU的并行性來保持多個請求在運行中并且有效地來遏制這些延遲(詳見III-C部分)
2)因為NVMe設(shè)備的帶寬非常有限并且GPU的內(nèi)存容量也優(yōu)先,BaM必須為應(yīng)用程序優(yōu)化這些資源(詳見III-D部分)
3)因為我們的目標(biāo)是通過已存在的硬件來評估BaM,BaM硬件和軟件必須克服這些現(xiàn)成的組件的挑戰(zhàn)(詳見III-F部分)
這個部分討論了BaM怎么設(shè)法解決這些挑戰(zhàn)。
A.BaM系統(tǒng)概覽
圖3中展示了BaM系統(tǒng)概覽。BaM提供了高層次的編程抽象,例如N維數(shù)組和鍵值對的儲存方式,使得程序員能很容易地將BaM集成到它們目前已有地GPU應(yīng)用中。一個應(yīng)用程序可以調(diào)用BaM API來建立一個從抽象地數(shù)據(jù)結(jié)構(gòu)到NVMe驅(qū)動上的數(shù)據(jù)塊范圍的映射。之后程序員可以例化這些抽象通過把映射傳遞給一個該抽象數(shù)據(jù)結(jié)構(gòu)的一個構(gòu)造函數(shù)。這個映射的元數(shù)據(jù)已經(jīng)足夠在SSD中找到需要的數(shù)據(jù)塊。
圖3.BaM中GPU線程的生命周期
每一個GPU線程使用這種抽象來計算待訪問的數(shù)據(jù)塊的偏移。之后這個線程把這個偏移作為鍵值在BaM軟件緩存(III-D)中進行索引,如圖3所示。這個抽象也會有wrap-level 的coalescer來增加訪問的效率。如果一個訪問請求命中了cache,線程會直接訪問GPU內(nèi)存中的數(shù)據(jù),如果Cache未命中,線程會從后端存儲中調(diào)取數(shù)據(jù)。BaM軟件緩存在設(shè)置集中對后端存儲的帶寬優(yōu)化采用了兩個方式:(1)通過消滅冗余的后端內(nèi)存的訪問請求。(2)通過允許用戶來對它們的數(shù)據(jù)進行細粒度的cache駐留控制。
如果一個NVMe SSD正在備份數(shù)據(jù),GPU線程會進入BaM IO棧(詳見III-C)來入隊一個NVMe請求,并且等待NVMe SSD來提交一個響應(yīng)完成表項。BaM IO棧的目的是分割和NVMe協(xié)議相關(guān)的軟件開銷通過增強GPU的巨大的線程并行性和啟動低延遲對多個提交/完成隊列的請求表項的批處理來最小化UVMe協(xié)議中doorbell寄存器更新的昂貴代價,并減少NVMe協(xié)議中的關(guān)鍵區(qū)。當(dāng)接收到一個doorbell更新請求時,NVMe SSD會抓取相關(guān)的提交隊列表項,處理在SSD和GPU內(nèi)存中進行數(shù)據(jù)傳輸?shù)拿睢T趥鬏數(shù)淖詈?,NVMe SSD會在完成隊列中提交一個完成表項。在完成表項提交以后,這個線程會更新對應(yīng)鍵值的cache的狀態(tài)并在之后訪問從GPU內(nèi)存中調(diào)取的數(shù)據(jù)。
B.和以CPU為中心的設(shè)計的比較
當(dāng)和傳統(tǒng)的如圖4a中所示的以CPU為中心的模型比較時,BaM有三個主要優(yōu)勢。首先,在以CPU為中心的模型中,由于CPU管理存儲數(shù)據(jù)的傳輸和GPU計算,它會導(dǎo)致在存儲和GPU內(nèi)存間的數(shù)據(jù)拷貝并且多次啟動計算內(nèi)核來覆蓋一個巨大的數(shù)據(jù)集。每個核的啟動和終結(jié)都會引起CPU和GPU間的同步開銷。由于BaM允許GPU線程來同時完成計算和從存儲中抓取數(shù)據(jù)如圖4b所示,GPU不需要和CPU經(jīng)常同步,并且更多的工作可以通過單個GPU核完成。更進一步說,一些線程的訪存延遲也可以通過計算其他線程而得到同時,因而提高了整體的性能。第二,因為在以CPU為中心的設(shè)計中計算負載加在GPU上而數(shù)據(jù)搬運控制由CPU完成,對于CPU來說,決定哪個部分的數(shù)據(jù)在什么時候需要十分困難,因此它會導(dǎo)致調(diào)取很多不需要的字節(jié)。有了BaM,一個GPU線程只在它需要的時候抓取特定的數(shù)據(jù),減少了CPU為中心的模型中飽受困擾的I/O擴大開銷。第三,在以CPU為中心的模型中,程序員耗費精力去分割應(yīng)用程序的數(shù)據(jù)并且重疊計算任務(wù)和數(shù)據(jù)傳輸來減少訪問存儲設(shè)備的延遲。BaM使得程序員能自然地在大型的數(shù)據(jù)集上利用GPU的線程并行性來減少訪存延遲。
圖4.傳統(tǒng)的以 CPU 為中心的計算模型與 BaM 計算模型的比較如(a)和(b)所示。BaM 使 GPU 線程能夠直接訪問存儲,從而實現(xiàn)細粒度的計算和 I/O 重疊。BaM 的關(guān)鍵組件的邏輯視圖如 (c) 所示。
C.I/O棧
BaM的I/O棧出于兩個目的,第一,它使得GPU線程使用NVMe隊列和NVMe SSD進行通信。第二,它建立了高吞吐率的隊列,利用了GPU強大的并行性來克服NVMe軟件棧的挑戰(zhàn)。在這里,我們描述一下BaM的I/O棧時如何達到這些目標(biāo)的。
1)啟用直接的從GPU線程訪問NVMe的機制
為了啟動GPU線程來直接地訪問NVMe SSD中的數(shù)據(jù),我們需要:1)從CPU內(nèi)存中移動NVMe隊列和I/O緩存到GPU內(nèi)存中2)在NVMe SSD的BAR空間中啟動GPU線程來寫隊列的doorbell寄存器。為了達到這個目的,我們建立了一個自定義的Linux驅(qū)動,它在系統(tǒng)中對于每一塊NVMe SSD會創(chuàng)建一個字符設(shè)備。使用BaM API的應(yīng)用程序可以打開這個字符設(shè)備來使用他們想使用的SSD。
在自定義的Linux設(shè)備驅(qū)動中,BaM使用了GPUDirect的RDMA特性來分配和管理GPU內(nèi)存中的NVMe隊列和I/O緩存。BaM使用nvidia_p2p_get_pages 內(nèi)核API來固定NVMe隊列中的頁和GPU內(nèi)存中預(yù)分配的I/O緩存,之后映射這些頁作為DMA請求來自于另一個PCIe設(shè)備,類似NVMe SSD,使用nvidia_p2p_map_pages內(nèi)核API,它使得SSD能完成對GPU內(nèi)存的對等數(shù)據(jù)讀寫。
我們使用了異步的GPUDirect來映射NVMe SSD的doorbell到CUDA地址空間,所以GPU線程可以按需地產(chǎn)生doorbell。這會要求SSD的BAR空間首先映射到應(yīng)用的地址空間,之后BAR空間會被映射到CUDA的地址空間使用擁有cudaHostRegisterIoMemory flag的cudaHostRegister API。使用cudaHostGetDevicePointer,應(yīng)用能獲取虛擬地址,GPU線程可以使用它來訪問NVMe doorbell寄存器從而產(chǎn)生doorbell。
2)高吞吐量的I/O隊列
既然GPU線程可以直接和NVMe設(shè)備通信,我們需要優(yōu)化數(shù)千的GPU線程的同步,當(dāng)它們使用共享隊列時。如II-D中描述的,NVMe協(xié)議要求驅(qū)動來寫SSD的BAR空間中的doorbell寄存器值。由于這些doorbell寄存器是只寫的,當(dāng)一個線程產(chǎn)生doorbell,也就是入隊一個I/O請求,他必須保證沒有其他的線程正在寫相同的寄存器并且它在寫的值有效的,和之前寫的其他值相比,它是一個全新的值。一個不成熟的解決方案可能會是在入隊一個命令到提交隊列和產(chǎn)生doorbell時上鎖,然而,對于GPU中數(shù)以千計的并行線程來說,這樣的設(shè)計方案可能會導(dǎo)致嚴重的延遲,因為所有的I/O請求都必須串行化。
相反地,BaM使用了細粒度的內(nèi)存同步來允許多個線程來并行的入隊I/O請求并且僅僅進入一個臨界區(qū)來產(chǎn)生doorbell。為了達到這個目的,我們對于GPU內(nèi)存中的每一個提交隊列維護了下面的隊列:1)隊列頭的本地拷貝,2)隊列尾的本地拷貝,3)原子標(biāo)簽計數(shù)器,4)turn_counter數(shù)組,一個和隊列由相同長度的整形數(shù)組,5)一個mark位向量,總位數(shù)和隊列長度相同。當(dāng)一個線程需要一個入隊請求時,它首先原子地增加標(biāo)簽計數(shù)器,返回的標(biāo)簽值除以隊列的大小的商來關(guān)聯(lián)一個隊列中的entry,而余數(shù)turn代表它的位置。線程使用它的entry來在turn_counter數(shù)組中進行索引,并且在這個位置中進行計數(shù)直到它的計數(shù)值和線程的turn值相同。當(dāng)它的計數(shù)值達到線程的turn值時,線程可以復(fù)制它的NVMe命令到它關(guān)聯(lián)的隊列中的位置。在復(fù)制以后,這個線程會設(shè)置這個位置的mark標(biāo)記位,這個線程之后會快速地復(fù)位這個位作為比特向量中當(dāng)前的尾部。如果它是成功的,它會進入臨界區(qū)來移除尾部并且它會重復(fù)地去順序地復(fù)位比特向量中的比特,直到它命中一個未設(shè)置的比特或者隊列已滿。在這個時候,線程知道了新的尾值并且可以用它來進行doorbell。這個線程之后會更新GPU 內(nèi)存中的尾部的備份,之后離開臨界區(qū)。
如果線程沒法進入臨界區(qū),它會不斷嘗試知道它在mark比特向量中的位被復(fù)位。這個方法的主要優(yōu)點是多個線程可以找到它們在隊列中的位置,并且把它們的命令寫到相關(guān)的隊列中而不去請求任意的鎖,事實上,大部分要入隊一個命令到提交隊列的線程都不曾進入臨界區(qū),因為一個要進入臨界區(qū)的單進程可以盡可能地移除尾部。
在一個線程的命令提交以后,這個線程可以對完成隊列進行無鎖輪詢,來找到對于已提交請求的完成項。這個方法的主要優(yōu)點是很多線程都能在隊列中找到它們的位置并且在不獲取任何鎖的情況下把他們的命令寫到他們相關(guān)的隊列表項中。當(dāng)它找到這個完成表項,它必須標(biāo)記這個完成表項已經(jīng)被NVMe控制器之前的通信過程所消費。移除完成隊列的頭并且使用新的頭部產(chǎn)生doorbell請求也可以通過和線程移除提交隊列的頭相同的方式完成。線程競相地去復(fù)位當(dāng)前頭的標(biāo)記并且進入臨界區(qū)的線程重復(fù)地復(fù)位標(biāo)記知道它不能做為止。
然而,在線程能離開完成隊列地臨界區(qū)之前,它必須也更新提交隊列的頭部來釋放空間確保下一輪命令能入隊。每個完成隊列的表項都有一個字段,他使得NVMe控制器和驅(qū)動通信告知它這個位置可以移除提交隊列的頭部。線程從它可以重置標(biāo)記的最后一個完成隊列表項中讀取此字段。然后它從當(dāng)前提交隊列頭開始迭代,直到完成條目中指定的頭值,將每個位置的 turn_counter 值加一。線程之后通過更新在GPU內(nèi)存中的本地完成隊列頭的備份來更新提交隊列頭并且離開臨界區(qū)。如果一個線程注意到提交隊列頭已經(jīng)移除過它的表項,它不會再進入臨界區(qū)。
D.BaM軟件緩存
BaM 軟件緩存旨在允許優(yōu)化使用有限的GPU內(nèi)存和GPU外帶寬。傳統(tǒng)的內(nèi)核模式的內(nèi)存管理(分配和翻譯)的必須支持多種多樣的,已停產(chǎn)的應(yīng)用/硬件的需求。這樣會導(dǎo)致他們包含了大量的臨界區(qū),限制了多線程實現(xiàn)的效率。BaM采用在每個應(yīng)用啟動時預(yù)分配所有的軟件需要的虛擬和物理內(nèi)存的方法來設(shè)法解決這個瓶頸。這個方法允許BaM軟件緩存管理來減少臨界區(qū),盡在插入或者收回一個緩存行的過程中去請求鎖。繼而,BaM緩存支持更多的并行訪問,特別是數(shù)據(jù)在GPU內(nèi)存中的時候。
當(dāng)一個線程通過一個偏移量來詢問緩存的時候,它會直接地檢查相關(guān)緩存行地原子狀態(tài)。如果它是有效的,線程會增加該緩存行的引用技術(shù)。如果被訪問的緩存行不在緩存種,線程會鎖住緩存行,并且找到一個非法的行騰出來,然后從后端內(nèi)存中調(diào)取緩存行。當(dāng)請求完成以后,發(fā)起請求的線程會通過把它的狀態(tài)置為合法和增加它的引用計數(shù)的方法來解鎖緩存行。這樣上鎖的方式防止了對同一高速緩存行的后端內(nèi)存的多個請求,利用數(shù)據(jù)中的空間局部性并最大限度地減少對后端內(nèi)存的請求數(shù)量。當(dāng)一個線程結(jié)束使用某一個緩存行時,它的引用計數(shù)會被減少。
BaM緩存使用了一個時鐘替換算法。這個緩存有一個全局計數(shù)器,當(dāng)一個線程需要找到一個緩存槽時它會增加。這個計數(shù)器的返回值告訴線程哪一個緩存槽是嘗試要使用的。如果被選中的緩存槽目前已經(jīng)被映射到一個由非0引用值的緩存行,線程會繼續(xù)并且再次增加全局計數(shù)器來嘗試替換下一個緩存槽。當(dāng)線程發(fā)現(xiàn)一個指向一個緩存行的緩存槽擁有非0的引用計數(shù)值,線程會嘗試通過將緩存行的狀態(tài)設(shè)置為臨時狀態(tài)來回收它。如果成功了,線程會標(biāo)記這個緩存行無效并且改變緩存槽到線程想要帶入的緩存行的映射。否則,它會再次增加計數(shù)器并且嘗試使用下一個緩存槽。
Warp 合并:雖然BaM的軟件緩存最小化了到后端內(nèi)存的請求數(shù)量,但它增加了每次訪問緩存行時的管理開銷。同一個warp中的線程經(jīng)常相互競爭,尤其是當(dāng)連續(xù)線程嘗試訪問內(nèi)存中的連續(xù)字節(jié)時。為了克服這個,BaM的緩存使用wrap級的原語在軟件層面實現(xiàn)了wrap合并。當(dāng)線程去訪問cache時,__match_any_sync wrap原語被用來來同步其他在wrap中的線程,并且一個淹沒被計算出來使得每個線程都知道其它某個wrap中的線程在訪問相同的偏移量。在該組中,線程決定一個領(lǐng)導(dǎo)者,并且只有領(lǐng)導(dǎo)者可以操縱被請求的緩存行的狀態(tài)。這組中的線程使用__shfl_sync原語進行同步,并且領(lǐng)導(dǎo)者將GPU內(nèi)存中被請求的偏移量的地址廣播給這個組。當(dāng)數(shù)據(jù)已經(jīng)在GPU內(nèi)存中時,這個合并對于減少訪問開銷極其有效,因為那是每次訪問增加的開銷最明顯的時候。
E.BaM抽象和軟件API
列表1.具有 BamArray<T> 抽象的 GPU 內(nèi)核示例
BaM軟件棧給程序員提供了一個基于數(shù)組的高層次API(BamArray<T>),由使用新的編程語言定義的接口組成(比如C++,Python或者Rush)。因為GPU內(nèi)核操作類似的數(shù)組,BaM 的抽象簡化了程序員調(diào)整內(nèi)核以便對整個數(shù)據(jù)集進行操作的工作,如列表1所示。
相比之下,以 CPU 為中心的模型需要將完整的、重要的應(yīng)用程序重寫,以優(yōu)化地將計算和數(shù)據(jù)傳輸分塊來適應(yīng)GPU 有限的內(nèi)存。
BamArray 的重載下標(biāo)運算符對程序員隱藏了BaM的所有復(fù)雜性。運算符通過選擇一個查詢 BaM 緩存并在未命中時發(fā)出 I/O 請求的領(lǐng)導(dǎo)線程,使訪問線程能夠合并它們的訪問。當(dāng)請求完成,領(lǐng)導(dǎo)線程會和其他在同個wrap中的線程分享緩存行的引用。每個線程使用這個引用來返回合適的類型為T元素到調(diào)用函數(shù)。
Bam的初始化啊需要分配一些內(nèi)部的數(shù)據(jù)結(jié)構(gòu),他們會在應(yīng)用程序的生命周期中重復(fù)使用。如果沒有自定義,初始化會隱式地在一個庫的構(gòu)造函數(shù)中發(fā)生。否則,應(yīng)用程序需要通過BaM初始化調(diào)用中的模板參數(shù)來專業(yè)化內(nèi)存,一個C++中的標(biāo)準例子。我們也提供了BaMArray的四種內(nèi)存實現(xiàn)方式(1)SSD和BaM緩存(缺省值)(2)固定的CPU內(nèi)存和BaM緩存(3)固定的CPU(4)GPU內(nèi)存。然而,在大部分情況中,專業(yè)化和微調(diào)不是嚴格必須的,就像我們之后再IV部分中介紹的僅有BaM的缺省參數(shù)使用的情況。
F.BaM原型系統(tǒng)的設(shè)計
使用數(shù)據(jù)中心級 4U 服務(wù)器中可用的 PCIe 插槽的 BaM 設(shè)計面臨幾個挑戰(zhàn)。這些機器中可以使用的PCIe槽是悠閑地。舉個例子,例如,Supermicro AS-4124 系統(tǒng)每個socket有五個 PCIe Gen4 ×16 插槽,如果一個GPU占據(jù)了一個插槽,它啊在不適用socket間的互聯(lián)組件的情況下只能訪問4x16的PCIe設(shè)備。進一步說,由于現(xiàn)在的多核CPU的chiplet設(shè)計,即使每個socket中的5個PCIe可以互相訪問,他們也必須穿過CPU內(nèi)部的互聯(lián)組件。
穿過這些不同的互聯(lián)組件進行訪問會導(dǎo)致嚴重的性能損失因為每個互聯(lián)中都存在包的轉(zhuǎn)換,增加了延遲并限制了吞吐量。然而,如我們再II-C中討論的,BaM 硬件應(yīng)支持擴展到大量 NVMe 設(shè)備,以提供使 ×16 PCIe Gen4 GPU 帶寬飽和所需的吞吐量,而無需太多開銷。
表2.BaM原型系統(tǒng)的規(guī)格
為了解決這個問題,我們?yōu)锽aM架構(gòu)構(gòu)建了一臺自定義的BaM原型機器,使用了如圖5中所示的大量已有的組件。表2中展示了使用在原型系統(tǒng)中主要組件的規(guī)格。BaM 原型使用具有定制PCIe拓撲的PCIe擴展機箱來擴展SSD的數(shù)量。PCI交換機支持低延遲和高吞吐量的PCIe設(shè)備之間的對等訪問。擴展機箱有兩個相同的抽屜,目前都獨立連接到主機。每個抽屜支持8個x16 PCI而插槽(如圖5a中所示),我們在每個抽屜中為一個NVIDIA A100 GPU使用一個x16插槽,并且其余插槽裝有不同類型的SSD。目前,每個抽屜只能支持 7 個U.2(Optane或Z-NAND)SSD,因為U.2外形占用了大量空間。由于PCIe交換機支持PCIe分叉,一個PCIe多SSD轉(zhuǎn)接卡支持每個抽屜超過16個M.2 NAND閃存SSD。
SSD 技術(shù)的折中:表III列出了對三種類型的現(xiàn)成 SSD的BaM系統(tǒng)的設(shè)計、成本和效率有顯著影響的指標(biāo)。RD IOPS (512B, 4KB) 和 WR IOPS (512B, 4KB) 列分別顯示了在512B 和4K粒度下測量的每種SSD的隨機讀寫吞吐量。$/GB 列顯示了每種 SSD 類型的每 GB 成本,基于為構(gòu)建系統(tǒng)的每個設(shè)備、擴展機箱和轉(zhuǎn)接卡當(dāng)前的當(dāng)前報價。Latency 列顯示測量的平均設(shè)備延遲(以 ?s 為單位)。對 SSD 類型的這些指標(biāo)進行比較表明,消費級 NAND 閃存 SSD 價格便宜,具有更具挑戰(zhàn)性的特性,而低延遲驅(qū)動器(如 Intel Optane SSD 和 Samsung Z- NAND更昂貴,具有更理想的特性。例如,對于使用 BaM 的寫入密集型應(yīng)用程序,Intel Optane驅(qū)動器提供最佳的寫入 IOP 和耐久性。
不考慮底層 SSD 技術(shù),如表 III 所示,BaM和DRAM-only解決方案先比在每GB成本方面有4.4-21.8倍的優(yōu)勢,即使在使用擴展機箱和轉(zhuǎn)接板的情況下。此外,這一優(yōu)勢隨著每臺設(shè)備增加的額外容量而增長,這使得 BaM 在SSD容量和應(yīng)用程序數(shù)據(jù)大小的增加的情況下具有高度可擴展性。
評 估
這個部分進行了對BaM原型軟硬件系統(tǒng)的評估并且展示了:
BaM 可以生成足夠的 I/O 請求以使底層存儲系統(tǒng)飽和(詳見IV-A)。
即使僅有一個SSD,BaM的性能也可以達到活超越最優(yōu)秀的解決方案(詳見IV-B和IV-C)。
BaM 設(shè)計與所使用的 SSD 存儲介質(zhì)無關(guān),可實現(xiàn)特定于應(yīng)用的經(jīng)濟高效的解決方案。
BaM 顯著降低了數(shù)據(jù)分析工作負載的I/O擴大和CPU控制開銷(詳見IV-C)。
BaM 性能隨著 SSD 的添加而擴展。
綜上,我們展示了和最優(yōu)秀的解決方案相比,帶有4個Optane SSD的BaM在BFS和CC圖分析數(shù)據(jù)負載上達到了平均0.92倍和1.72倍的加速性能,并且單個Optane SSD在數(shù)據(jù)分析負載上達到了4.9倍的加速性能。在不同的存儲媒介上觀察到了和SSD類似的性能。
A.使用微基準測量的BaM的原始吞吐量
設(shè)置:我們首先評估了BaM在使用Intel Optane SSD的合成隨機訪問微基準上可實現(xiàn)的原始吞吐量。我們把整個SSD的容量映射到III中描述的GPU的地址空間。我們分配所有的可用的SSD的SQ/CQ隊列對到GPU的內(nèi)存中,隊列深度為1024。我們之后啟動一個CUDA內(nèi)核,它的每個線程都從SSD中請求一個獨立的512字節(jié)的塊。每個線程提交一個NVMe請求到一個指定的隊列中。隊列以循環(huán)方式供給GPU線程使用。然后,我們改變映射到單個 NVIDIA A100 GPU 的線程和 SSD 的數(shù)量。對于多個 SSD,請求以循環(huán)方式進一步分布在 SSD 之間。我們將每秒 I/O 操作 (IOP) 衡量為一個指標(biāo),該指標(biāo)定義為GPU提交的請求和內(nèi)核執(zhí)行時間。
圖6.在 Intel Optane P5800X SSD 上使用 BaM 進行 512B 隨機讀寫基準擴展。BaM 的 I/O 堆??梢赃_到每個 SSD 的峰值 IOP,并針對隨機讀取和寫入訪問進行線性擴展
結(jié)果:圖 6 顯示了 512B 隨機讀寫訪問基準的測量 IOP,BaM的每個SSD可以達到IOPs的峰值并且可以根據(jù)附加的SSD線性增加,對于讀和寫都適用。使用單個Optane SSD,BaM僅僅需要大約16K-64K的GPU線程來達到接近峰值的IOP。使用7個Optane SSD,BaM能達到35M隨機的讀IOP和7.4M的隨機寫IOP,是Intel Optane SSD的512B訪問粒度可達到的最大峰值。擴容實驗中SSD的最大數(shù)量目前受限于擴展機箱的抽屜容量。一旦我們完成抽屜級聯(lián)的開發(fā),可以進行額外的擴容。相似的性能和擴展性可以在Samsung SSD中看到,并且也可以使用4KB的訪問大小,但是限于篇幅并沒有在此處列出。這些結(jié)果驗證了 BaM 的基礎(chǔ)架構(gòu)軟件可以匹配底層存儲系統(tǒng)的峰值性能。我們下一步會使用應(yīng)用程序基準來對BaM進行評估。
B.圖分析中的性能收益
表4.圖分析數(shù)據(jù)集
設(shè)置:首先,我們評估BaM在圖分析應(yīng)用中的性能收益。我們使用表4列出的圖來進行評估。K,U,F(xiàn),M是SuiteSparse 矩陣集合中四個最大的圖,而 UK 和 Sk 取自 LAW。這些圖數(shù)據(jù)集涵蓋了不同的領(lǐng)域,包括社交網(wǎng)絡(luò)、網(wǎng)絡(luò)爬蟲、生物醫(yī)學(xué),甚至合成圖。
BaM的一個目標(biāo)就是提供比DRAM-only圖分析解決方案更有競爭力的性能。為此,目標(biāo)基線系統(tǒng) T 允許 GPU 線程在圖形分析執(zhí)行期間直接對存儲在主機內(nèi)存中的數(shù)據(jù)執(zhí)行合并細粒度訪問。由于輸入圖都可以放入主機內(nèi)存中,因此我們可以直接比較 BaM 和 T 之間的性能。
我們在目標(biāo)系統(tǒng)和構(gòu)建于表3中列出的不同SSD上的BaM分別運行兩種圖分析算法,廣度優(yōu)先搜索 (BFS) 和連接組件 (CC)。在 BFS 中,每個 GPU warp 被分配給當(dāng)前迭代中正在訪問的節(jié)點,其中 warp 中的所有線程協(xié)作遍歷節(jié)點的鄰居列表。CC 實現(xiàn)遵循與 BFS 類似的分配,只是應(yīng)用程序首先檢查圖中的所有節(jié)點,因此呈現(xiàn)出比 BFS 更突發(fā)的訪問模式。對于 BFS,我們統(tǒng)計了運行至少 32 個具有兩個以上鄰居的源節(jié)點后的平均運行時間。
我們不對 UK 和 Sk 數(shù)據(jù)集執(zhí)行 CC,因為 CC 僅在無向圖上運行。最后,我們將 BaM 軟件緩存大小固定為 8GB,緩存行大小為 4KB。
圖7.使用單個Intel Optane SSD 的 BaM 和目標(biāo)系統(tǒng)(T)的圖形分析性能。平均而言,BaM 的端到端時間比目標(biāo)快 1.1 倍(BFS)和 1.29 倍(CC)。
一個SSD的整體性能:圖7個展示了目標(biāo)系統(tǒng)(T)和使用單個Intel Optane SSD的BaM(B_I),Samsaung DC 1735(B_S)和消費級的Samsung grade 980 Pro SSD(B_SC)?;叵胍幌?,目標(biāo)系統(tǒng) T 受益于主機和 GPU 之間的完整 ×16 Gen4 PCIe 帶寬,而 BaM 僅限于單個 SSD 的 ×4 Gen4 PCIe 接口。
然而,在所有圖和算法中,在不考慮 T 系統(tǒng)的初始文件加載時間的情況下,采用英特爾傲騰 SSD (B_I) 的 BaM 的性能從略快到比目標(biāo) T 系統(tǒng)慢 4.4 倍的現(xiàn)象都存在。這是因為由于只有一個SSD,BaM的性能被SSD的x4 Gen4 PCIe接口的吞吐量限制。如果我們考慮T系統(tǒng)的初始文件加載時間,BaM平均比T系統(tǒng)在BFS和CC這兩個算法上分別要快1.1和1.29倍。在這兩種情況下,GPU 計算內(nèi)核通過 BaM 1D 數(shù)組抽象執(zhí)行按需圖的邊數(shù)據(jù)訪問。這允許 BaM 將來自 SSD 的某些線程的數(shù)據(jù)傳輸與其他線程的計算重疊。相反,目標(biāo)系統(tǒng) T 需要等到文件加載到內(nèi)存中才能將計算任務(wù)卸載到 GPU。T系統(tǒng)的監(jiān)管者的主存帶寬不能克服加載初始文件的延遲。這會導(dǎo)致BaM獲得了更高的端對端延遲。
Samsung DC 1735和Intel Optane SSD對于所有的負載幾乎有著相同的新能。因為這兩個驅(qū)動器的4KB隨機讀IOP峰值都被PCIe x4 接口限制了。然而對于CC工作負載中的兩個數(shù)據(jù)集(U和M),Sansung DC 1735的性能比較差,并且我們初始的分析指出了這是因為SSD控制器在處理CC使用突發(fā)隨機訪問模板訪問這兩個圖時的長尾部延遲。將重點轉(zhuǎn)移到成本效益上,BaM 原型使用一個三星 980 Pro SSD,與目標(biāo)系統(tǒng)(包括文件加載時間)相比,BFS和CC工作負載平均慢1.97倍和1.85倍。這些對于消費級 SSD 來說是非常令人鼓舞的結(jié)果,因為它們提供了迄今為止所有 SSD 技術(shù)中的最佳價值。
圖8.緩存行大小對使用一塊Intel Optane SSD 進行圖形分析的 BaM 性能的影響
緩存行大小的重要性:我們嘗試調(diào)整 BaM 軟件緩存的緩存行大小從 512B 到 8KB,以了解訪問粒度對圖形分析工作負載的影響?;叵胍幌?,BaM 緩存行大小決定了對存儲的訪問粒度。由于其高IOP率因此使用單個 Intel Optane SSD 完成了評估(詳見表 III)。從圖8中可以看到,由于我們把緩存行大小從4KB減少到512B,BFS和CC工作負載分別慢了1.41倍和2.31倍。這是因為圖工作負載在其鄰接列表中表現(xiàn)出空間局部性,并且可以從更大的訪問中受益。此外,我們的分析數(shù)據(jù)顯示,對于512B訪問粒度,BFS 和 CC 應(yīng)用程序可以達到 4.76M IOPs 和 4.97M IOPs。對于4KB訪問粒度,分別可以達到 1.37M IOPs 和 1.52M IOPs。這意味著 512B 和 4KB 存儲訪問的帶寬約為 2.5GBps 和 6GBps,接近一個 Optane SSD 的峰值可實現(xiàn)帶寬。
出現(xiàn)了三個主要發(fā)現(xiàn):
在 BaM 中運行的工作負載可以生成足夠的 I/O 請求以使驅(qū)動器的吞吐量飽和.
4K 的粒度在某些圖中利用了大型鄰接列表的空間局部性,并且為較小的鄰接列表傳輸?shù)念~外字節(jié)不會降低性能,因為 PCIe 帶寬沒有過飽和。
BaM 的細粒度訪問減少了 I/O 放大,從而提高了有效帶寬。
否則,在將緩存行大小從 4KB 減少到 512B 時,應(yīng)用程序的速度會降低 8 倍。將緩存行大小從 4KB 增加到 8KB 幾乎不會影響整體性能。這是因為在 4KB 時,應(yīng)用程序接近 SSD PCIe 帶寬限制,并且進一步增加緩存行大小不會提高帶寬。在Samsung設(shè)備中觀察到類似的性能變化和趨勢,限于篇幅不討論。
圖9.擴展Optane SSD的數(shù)量
擴展到多個SSD:我們擴展 SSD 的數(shù)量并跨 SSD 復(fù)制數(shù)據(jù)以增加 BaM 的聚合帶寬。圖9展示了具有4KB緩存行的Optane SSD的擴展結(jié)果。使用 BaM 原型的圖形分析工作負載可以很好地擴展到兩個 Optane SSD,但若數(shù)量超過兩個,收益開始遞減。如果使用超過兩個SSD,使用BaM原型的圖分析應(yīng)用就不能以足夠的速度產(chǎn)生I/O請求來有效地滿足附加設(shè)備。即使應(yīng)用程序具有足夠的 I/O 并行度,當(dāng)前的 GPU 內(nèi)核實現(xiàn)和數(shù)據(jù)布局都針對利用局部性和減少 I/O 請求的數(shù)量進行了優(yōu)化,而不是最大化生成 I/O 請求的速率以隱藏長延遲。這些相互沖突的目標(biāo)需要通過掃描每個線程的工作分配或增加每個線程的工作量來探索設(shè)計空間,以便 GPU 線程可以以更高的速率生成 I/O 請求以充分利用超過 2 個 Optane SSD。此外,BaM 軟件棧中的一些優(yōu)化,例如自動改變 I/O 請求的大小和預(yù)取,尚未實現(xiàn)。我們將在未來解決這些問題。目前,使用四個Intel Optane SSD的系統(tǒng)和考慮文件加載時間的目標(biāo)系統(tǒng)T相比已經(jīng)可以在BFS和CC應(yīng)用上提供平均0.92和1.72倍的加速比。BaM在所有數(shù)據(jù)集上對于BFS和CC負載達到了平均0.72 和1.51倍的加速比。三星 SSD 也出現(xiàn)了類似的趨勢,但三星 980 Pro SSD 可以很好地擴展到 4-10 個 SSD,然后再擴展SSD才會在圖形工作負載上出現(xiàn)收益遞減。
C.數(shù)據(jù)分析中的I/O擴大收益
除了圖形分析之外,我們還評估了 BaM 原型對企業(yè)數(shù)據(jù)分析工作負載的性能優(yōu)勢。這些新興的數(shù)據(jù)分析被廣泛用于解釋、發(fā)現(xiàn)或推薦隨時間推移或從非結(jié)構(gòu)化數(shù)據(jù)湖收集的數(shù)據(jù)中的有意義的模式。數(shù)據(jù)分析實驗旨在說明 BaM 設(shè)計在處理大型結(jié)構(gòu)化數(shù)據(jù)集時減少 I/O 擴大和軟件開銷的好處。
設(shè)置:II-B中討論了在NYC出租車數(shù)據(jù)集上的I/O擴大問題。該數(shù)據(jù)集由 200GB 編碼數(shù)據(jù)組成,以優(yōu)化行列 (ORC) 格式組織為 1.7B 行和 49 列。我們使用了II-B部分中描述的6個數(shù)據(jù)相關(guān)的提問來和最優(yōu)秀的GPU加速數(shù)據(jù)分析框架RAPIDS進行比較?;€和BaM都使用一塊Intel Optane P5800X SSD。我們使用兩種配置來評估基線:a)SSD 中所有數(shù)據(jù)的冷情況和 b)數(shù)據(jù)已被提取到 Linux CPU 頁面緩存的暖情況。
圖10.使用一個 Optane SSD的前提下,在NYC出租車數(shù)據(jù)集的數(shù)據(jù)分析查詢中BaM 和 RAPIDS 的性能。BaM 比以 CPU 為中心的 RAPIDS 框架快 4.9 倍。
結(jié)果:在大多數(shù)情況下,采用單個英特爾傲騰 SSD 的 BaM 在冷配置和暖配置中均優(yōu)于 RAPIDS 性能,如圖 10 所示。對于 Q1,暖配置的基線比 BaM 略有優(yōu)勢,因為它可以利用整個 CPU DRAM 帶寬和 PCIe ×16 Gen4 帶寬在主機和 GPU 之間傳輸數(shù)據(jù),而 BaM 則受到 SSD 帶寬的限制。隨著數(shù)據(jù)相關(guān)指標(biāo)的添加,BaM 性能提高,如圖 10 所示。性能提高的原因是 BaM 由于按需數(shù)據(jù)提取而減少了 I/O 放大,但基線必須將整個列傳輸?shù)?GPU 內(nèi)存。如圖 2 所示,通過額外的數(shù)據(jù)相關(guān)指標(biāo),基線(包括暖和冷)會引起更多的I/O擴大和CPU上用于查找和移動數(shù)據(jù)以及管理GPU內(nèi)存的軟件開銷。但是,BaM 能夠按需訪問數(shù)據(jù)以及重疊計算、緩存管理和許多 I/O 請求,這使得它處理多個數(shù)據(jù)相關(guān)列的效率幾乎與處理單個數(shù)據(jù)相關(guān)列一樣高。
相關(guān)工作
A.優(yōu)化的以CPU為中心的模型
大多數(shù) GPU 編程模型和應(yīng)用程序的設(shè)計都假設(shè)工作數(shù)據(jù)集適合 GPU 內(nèi)存。如果沒有,則使用平鋪等特定于應(yīng)用程序的技術(shù)來處理 GPU 上的大數(shù)據(jù)。
SPIN和 NVME建議使用 GPUDirect RDMA 從SSD到GPU 啟用對等 (P2P) 的直接內(nèi)存訪問,這樣就可以不在數(shù)據(jù)通路中使用CPU。SPIN 將 P2P 集成到標(biāo)準 OS 文件堆棧中,并為順序讀取啟用頁面緩存和預(yù)讀方案。GAIA進一步將 SPIN 的頁面緩存從 CPU 擴展到 GPU 內(nèi)存。Gullfoss提供了一個高級接口,有助于高效地設(shè)置和使用 GPUDirect API。Hippogriffdb為 OLAP 數(shù)據(jù)庫系統(tǒng)提供 P2P 數(shù)據(jù)傳輸功能。GPUDirect Storage是使用 GPUDirect RDMA 技術(shù)在 NVIDIA CUDA 軟件棧中將數(shù)據(jù)路徑從 CPU 遷移到 GPU 的最新產(chǎn)品。在 RADEON-SSG 產(chǎn)品線中可以看到 AMD 的類似努力。所有這些工作仍然采用以 CPU 為中心的模型,其中 CPU 負責(zé)數(shù)據(jù)傳輸控制。BaM 提供從 GPU 對存儲的顯式和直接細粒度訪問,允許 GPU 中的任何線程啟動、讀取和寫入數(shù)據(jù)到 SSD。
B.以加速器為中心的模型的先前嘗試
ActivePointers、GPUfs、GPUNet 和 Syscalls for GPU之前曾嘗試啟用以加速器為中心的數(shù)據(jù)編排模型。GPUfs和Syscalls for GPU首先允許GPU從主機CPU請求文件數(shù)據(jù)。ActivePointers在GPUfs之上添加了類似抽象的內(nèi)存映射,以允許GPU線程像數(shù)組一樣訪問文件數(shù)據(jù)。Dragon建議將存儲訪問納入UVM頁面錯誤機制。然而,所有這些方法都依賴于并行性明顯較低的CPU來處理大規(guī)模并行GPU的數(shù)據(jù)需求。因此,如II部分中所示,這些方法最終導(dǎo)致資源利用不足和整體性能不佳。此外,所有這些工作都沒有利用GPUDirect RDMA功能,而是依賴于先將數(shù)據(jù)傳輸?shù)紺PU內(nèi)存,然后再傳輸?shù)紾PU內(nèi)存的工作方式。
C.硬件擴展
通過直接用閃存替換全局內(nèi)存或?qū)⑵渑cGPU內(nèi)存系統(tǒng)緊密集成來擴展對GPU的非易失性內(nèi)存的支持方案已經(jīng)被提出。DCS建議借助專用硬件單元(如 FPGA)實現(xiàn)存儲、網(wǎng)絡(luò)和加速器之間的直接訪問,為粗粒度數(shù)據(jù)傳輸提供所需的轉(zhuǎn)換。最近有人提出在GPU內(nèi)啟用持久化。我們承認這些努力,并進一步驗證了為新興工作負載啟用大內(nèi)存容量的必要性。更重要的是,BaM旨在使用現(xiàn)有的硬件和系統(tǒng)在具有非常大的真實數(shù)據(jù)集的端到端應(yīng)用程序中提供光速性能。
結(jié)論
在這項工作中,我們提出了一個案例,使 GPU 能夠在稱為 BaM 的新系統(tǒng)架構(gòu)中協(xié)調(diào)對 NVMe 固態(tài)驅(qū)動器 (SSD) 的高吞吐量、細粒度訪問。BaM 通過按需讀取或?qū)懭敫毜牧6龋ㄓ蛇@些 GPU 上運行的計算代碼決定)來緩解讀取比所需數(shù)據(jù)更多的數(shù)據(jù)的 I/O 放大問題。使用現(xiàn)成的硬件組件,我們使用不同的 SSD 類型實現(xiàn) BaM 原型,并在多個應(yīng)用程序和數(shù)據(jù)集上進行了測試,結(jié)果表明 BaM 是DRAM-only和其他以 CPU 為中心的最優(yōu)秀解決方案的可行替代方案。
致謝:感謝電子科技大學(xué)黃樂天老師與研究生鄧昊瑀同學(xué)在翻譯和校正中提供的幫助。