也許某些用功的科科,過去曾聽聞過和GPU虛擬化可扯上關係的幾個技術名詞,像SR-IOV、Fixed Pass-Through或Mediated Pass-Through等等,但這些名詞與其背後的觀念,早在2008年甚至更早,就被VMware一鎚定音,至今幾乎毫無任何改變。
VMware在2008年發表的GPU虛擬化技術白皮書 “GPU Virtualization on VMware’s Hosted I/O Architecture”,列出4個評鑑面向。
VMware更進一步的攤開整個GPU虛擬化手段的分類表,構成今日大部分GPU虛擬化的技術基礎,各位科科請先多看個幾秒,我會等你。圖中橘色的那個點,象徵著VMware SVGA的地位。
各位科科可能乍看之下摸不著頭緒,但筆者將其整理成下表,應該就可以馬上掌握重點了。值得注意的是,偏向軟體的「前端」和貼近硬體的「後端」,兩者並非互斥,實際上可以相輔相成。
我們先從前端看起,這裡可分成2種:遠端存取API (API Remoting,或稱為API Forwarding和Split Driver) 和裝置模擬 (Device Emulation)。
既然GPU底層硬體和驅動程式上頭還有OpenGL和Direct3D這些3D API,為何不乾脆讓虛擬機的應用程式,透過遠端程序呼叫 (RPC, Remote Procedure Call),將其需求重新導入到擁有100%顯示卡使用權的機器上遠端執行不就搞定了?誰說3D應用程式只能在本機執行?
在2009年這個時間點,頗為知名的VMGL (也就是Xen GL) 和WireGL/Chromium,將用戶端虛擬機上的OpenGL命令,透過網路(或虛擬網路)轉移到遠端具備顯示卡的系統,讓虛擬機也能享受到OpenGL硬體加速的效果。換言之,變相虛擬化3D API,將每個OpenGL應用程式視為獨立的硬體裝置,只要顯示卡支援OpenGL,亦可相容來自不同廠商的不同GPU硬體。
頗有「射後不理」味道的API Remoting看似易於實作,但卻會犧牲掉附加功能性,如快速有效的收集運行狀態資訊。也因此,VMGL增加了狀態追蹤,以提供程式執行中止、回復、與將暫停狀態存入硬碟等功能,免得跑一跑就很難踩煞車。
此外,這種網路重定向的遠端API調用,須盡其所能的縮短網路延遲,這也是NVIDIA願意以70億美元併購Mellanox的主因,VMware和NVIDIA合作、可動態分配GPU資源的Bitfusion,就很仰賴良好的網路基礎架構。
前端GPU虛擬化的另一邊,則是模擬出完整功能的GPU,實現無懈可擊的附加功能性,怎樣上下其手都沒有關係,但缺點也很明顯,這樣作將極度消耗系統資源。
VMware的SVGA II虛擬GPU(2008年),雖然概觀上屬於裝置模擬,但其實也融入了部份API Remoting(SVGA3D繪圖通訊協定)的概念,以降低系統資源需求和複雜度。
相較於「軟體的前端」,「硬體的後端」就比較容易理解了:「1顆GPU綁死在單一虛擬機上」的固定式導通(Fixed Pass-Through或Direct Pass-Through)與「GPU仍可被多個虛擬機共享」的協調式導通(Mediated Pass-Through)。更重要的是,這兩者都建立在現成硬體規範之上:IOMMU(如Intel VT-d)和PCI Express 3.0的SR-IOV (Single-Root I/O Virtualiztion)。
Fixed Pass-Through(固定直通模式)的應用場景很簡單:近似硬體分割區,假設你的電腦裡面裝了2張顯示卡,上頭跑2個虛擬機,就個別分配給單一虛擬機,不能切換,也不能將工作轉移到其他GPU上。Fixed Pass-Through讓虛擬機獨享GPU,可得到最好的效能及功能完整度,但犧牲多工性及附加功能性(如動態遷移和GPU分割),當管理大量的GPU時,更是一場災難。
NVIDIA SLI Multi-OS是當時最常見的應用範例,例如:將2台只有1張顯示卡的繪圖工作站,整合成1台具有2張顯示卡的系統,簡化管理工作。因需IOMMU切割不同GPU所需的記憶體位址空間,NVIDIA SLI Multi-OS強制對應支援Intel VT-d的系統平台,相信科科不會忘記之前關於I/O虛擬化的內容。
但可讓GPU同時被複數虛擬機共享的Mediated Pass-Through(協調共享模式),除了「可能」動用SR-IOV等外部I/O硬體虛擬化技術,也須進行某種程度的裝置模擬,與付出虛擬機Hypervisor須維護並快速載入所有虛擬GPU狀態的額外成本。
簡而言之,Mediated Pass-Through和Fixed Pass-Through最大的不同點,在於前者類似x86指令集虛擬化的VT-x和AMD-V,把影響性能的工作(如密集運算),直接 “Pass Through” 給虛擬機,而和性能無關的部份(主要是特權模式的作業,像重新映射記憶體位址)等,則「攔截」下來,透過模擬層來處理。如同筆者在前面所述,軟體的前端與硬體的後端並非油水分離,實為魚水共生。
相信現在各位科科在腦海中已經建立起GPU虛擬化的全貌。
接著我們就來瞧瞧,NVIDIA和AMD這些年來究竟幹了哪些好事。啊,筆者差點就不小心忘記Intel了,但請別小看Intel,他們一開始在GPU虛擬化的領域,可是走得很前面的。科科。