硬件虛擬化之GPU虛擬化和FPGA虛擬化方法
GPU虛擬化
GPU是計(jì)算機(jī)的一個(gè)重要組成部分,但GPU這類(lèi)重要資源虛擬化的性能、擴(kuò)展性和可用性相對(duì)于CPU等處于滯后的階段。例如,英特爾的GPU虛擬化解決方案gVirt中,單個(gè)物理GPU僅支持7個(gè)虛擬GPU(VGPU),而Xen支持512個(gè)虛擬CPU。2013年,亞馬遜首次推出了商業(yè)化的GPU實(shí)例。2017年2月,來(lái)自于英特爾第一個(gè)GPU全虛擬化方案KVMGT才正式加入Linux內(nèi)核4.10。
傳統(tǒng)GPU虛擬化通過(guò)API轉(zhuǎn)發(fā)的方式,將GPU操作由虛擬機(jī)發(fā)送到虛擬機(jī)監(jiān)控器代理執(zhí)行,該方法被大量主流虛擬化產(chǎn)品采用并支持圖形處理,但并非真正意義上的完整硬件虛擬化技術(shù),其性能和可擴(kuò)展性均無(wú)法滿足通用GPU(GPGPU)計(jì)算等應(yīng)用(如機(jī)器學(xué)習(xí)和高性能計(jì)算)的需要。
GPU虛擬化的軟件模擬方法直接將設(shè)備分配給指定的虛擬機(jī),采用類(lèi)似于CPU虛擬化中的二進(jìn)制轉(zhuǎn)換方法進(jìn)行模擬。但相對(duì)于CPU,GPU的特性復(fù)雜,不同的設(shè)備提供商之間的GPU規(guī)格區(qū)別很大,GPU的資源很難被拆分,模擬的效率低。因此,典型的QEMU軟件僅模擬了視頻圖形陣列(VGA)設(shè)備的基本功能,它通過(guò)一個(gè)半虛擬化的圖像緩沖區(qū)來(lái)加速特定的2D圖像訪問(wèn),不符合高效、共享的虛擬化要求。
GPU虛擬化的設(shè)備直通方法將物理GPU指定給虛擬機(jī)獨(dú)占訪問(wèn)。與API轉(zhuǎn)發(fā)提供了良好的GPU共享能力相比,設(shè)備直通方法通過(guò)獨(dú)占使用,提供了優(yōu)異的性能。例如,基于英特爾的VT-d/GVT-d技術(shù),通過(guò)翻譯DMA訪問(wèn)的內(nèi)存地址的方法,讓GPU分配給一個(gè)虛擬機(jī)使用,能夠達(dá)到與原生物理GPU相近的性能,但犧牲了共享特性。英偉達(dá)(NVIDIA)的Tesla GPU也提供了類(lèi)似的虛擬化方案Grid,虛擬機(jī)可以通過(guò)直通的方式直接訪問(wèn)物理GPU。
GPU虛擬化的直通共享方法允許虛擬機(jī)直接訪問(wèn)對(duì)性能敏感的資源(如GPU訪問(wèn)顯存),可基本解決直通和共享的矛盾,采用類(lèi)似于SR-IOV的硬件輔助虛擬化技術(shù),通過(guò)影子頁(yè)表隔離每個(gè)虛擬GPU的訪問(wèn)空間,使得大多數(shù)的命令執(zhí)行不受虛擬機(jī)監(jiān)控器的干預(yù),因此虛擬GPU就可以獲得接近非虛擬化的性能。
由于GPU結(jié)構(gòu)復(fù)雜,技術(shù)限制多,直到2014年才提出了兩種針對(duì)主流GPU平臺(tái)做硬件輔助的全虛擬化方案,即基于英偉達(dá)GPU的GPUvm和基于英特爾GPU的gVirt。GPUvm支持全虛擬化,也支持半虛擬化。在全虛擬化模式下運(yùn)行開(kāi)銷(xiāo)比較高。在優(yōu)化過(guò)的半虛擬化模式下,性能比原生系統(tǒng)要慢2~3倍。gVirt是第一個(gè)針對(duì)英特爾平臺(tái)的GPU全虛擬化開(kāi)源方案,為每個(gè)虛擬機(jī)都提供了一個(gè)虛擬的GPU,并且不需要更改虛擬機(jī)的原生驅(qū)動(dòng)。

FPGA虛擬化
FPGA作為一種可重新配置的計(jì)算資源,與現(xiàn)有的虛擬化框架并不兼容。與GPU和CPU不同,F(xiàn)PGA的使用情景趨向于獨(dú)占。一方面,不同租戶可能使用不同的訪問(wèn)接口,難以使用統(tǒng)一的指令集;另一方面,即使使用統(tǒng)一的接口規(guī)范,在租戶切換時(shí)都需要進(jìn)行耗時(shí)的重新燒寫(xiě)和復(fù)雜的狀態(tài)保存,導(dǎo)致了系統(tǒng)大量的時(shí)間和空間開(kāi)銷(xiāo)。目前FPGA器件與各自的開(kāi)發(fā)生態(tài)(工具鏈、庫(kù)等)具有緊密的耦合關(guān)系,特定器件型號(hào)的FPGA需要特定的軟件支持才能生成可供燒寫(xiě)的二進(jìn)制文件,還沒(méi)有統(tǒng)一的二進(jìn)制接口規(guī)范。
為了將FPGA集成到云平臺(tái)中,從2014年起,陸續(xù)展開(kāi)了FPGA虛擬化的研究。多倫多大學(xué)的斯圖爾特·拜瑪(Stuart Byma)等通過(guò)OpenStack在多個(gè)FPGA之間提供了部分可重構(gòu)區(qū)域作為云計(jì)算資源,允許用戶像啟動(dòng)虛擬機(jī)一樣啟動(dòng)用戶設(shè)計(jì)的或者預(yù)先定義的通過(guò)網(wǎng)絡(luò)連接的硬件加速器。IBM中國(guó)研究院的陳非(Fei Chen,音譯)等提出了將FPGA集成到數(shù)據(jù)中心的一般性框架的,并基于OpenStack、LinuxKVM、XilinxFPGA完成了原型系統(tǒng),實(shí)現(xiàn)了多虛擬機(jī)(VM)中多進(jìn)程的隔離、精確量化的加速器資源分配和基于優(yōu)先級(jí)的任務(wù)調(diào)度。微軟提出了一種新的云架構(gòu),F(xiàn)PGA不僅與CPU通過(guò)PCIe連接,也通過(guò)數(shù)據(jù)中心以太網(wǎng)相連,這樣不僅可以完成對(duì)網(wǎng)絡(luò)功能的加速,也能用于其他普通應(yīng)用。安卡·伊奧達(dá)科(Anca Iordache)等提出了FPGA group,即一塊或者多塊有相同電路配置的FPGA集合,可被多個(gè)希望使用相同電路的用戶共享。