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

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