上一篇文章,講解了計算虛擬化之CPU虛擬化和內存虛擬化。而GPU從某種意義上來講,其作用也是用于計算,只不過同CPU應用用于通用計算相比,GPU則主要用于對圖形和圖像要求較高的場景,比如高清視頻編解碼、3D游戲、物理仿真等。本篇帶領大家了解一下GPU虛擬化技術。
GPU虛擬化
GPU技術在芯片行業中也如同CPU技術一樣快速發展,而且越來越多的用戶開始部署虛擬桌面方案。因此將GPU技術與虛擬化技術融合,是近年來虛擬化行業中比較熱門的技術課題,通過此種方式,將大大降低圖形圖像用戶的使用成本以及提高數據的處理效率和數據安全性。所謂GPU虛擬化,就是將一塊GPU卡的計算能力進行切片,分成多個邏輯上虛擬的GPU,即vGPU,以vGPU為單位分配GPU的計算能力。以vGPU為單位可以將單塊GPU卡分配給多臺虛擬機使用,使得虛擬機能夠運行3D軟件、播放高清視頻等,極大地提升了用戶體驗。
目前GPU虛擬化主要有如下幾種技術:
Device Simulation
API Forwarding
GPU Pass-Through
Full GPU Visualization
Device Simulation
設備模擬直接將設備分配給指定的虛擬機。采用類似于CPU虛擬化中二進制轉換方法進行模擬。但相對于CPU,GPU的特性復雜,不同的設備提供商之間的GPU規格區別很大,GPU的資源很難被拆分,模擬的效率低。因此,典型的QEMU軟件僅模擬了VGA設備的基本功能,它通過一個半虛擬化的圖像緩沖區來加速特定的2D圖像訪問,不符合高效、共享的虛擬化要求。由于設備模擬沒有一個確定的機制能使虛擬機進行訪問圖形硬件的能力,因此這些虛擬的顯示設備都是通過使用CPU以及內存的方式對圖形數據進行相應處理。
API Forwarding
API轉發將圖形指令如OpenGL從客戶虛擬機轉發到虛擬機監視器VMM中,實現虛擬化環境下GPU的共享。該方法目前被廣泛應用在VMWare和VirutalBox等軟件中。基于Chromium的VMGL和Oracle的VirtualBox,采用定制過的OpenGL庫來替換原有的OpenGL庫,將虛擬機中的OpenGL指令轉發到虛擬機監視器中去執行。針對GPU運用于通用計算,rCUDA、vCUDA和gVirtuS、都采用轉發CUDA和OpenGL的指令來解決虛擬化環境下運行GPU通用計算程序的問題。然而API轉發受限于平臺,例如Windows采用的接口是DirectX,不兼容于OpenGL或CUDA。因此,一個Linux主機就不能執行Windows客戶機轉發過來的DirectX命令。同時由于API轉發引起大量的上下文切換,性能損失較大。
GPU Pass-Through
顯卡穿透(pass-through)也叫顯卡直通,是指繞過虛擬機管理系統,將GPU單獨分配給某一虛擬機,只有該虛擬機擁有使用GPU的權限,這種獨占設備的方法分配方式保存了GPU的完整性和獨立性,在性能方面與非虛擬化條件下接近,且可以用來進行通用計算。但是顯卡直通需要利用顯卡的一些特殊細節,同時兼容性差,僅在部分GPU中設備可以使用。同時GPU透傳只能將GPU分配給一臺虛擬機使用,無法在多臺虛擬機間共享,其他虛擬機無法使用到GPU提供的計算能力。由于顯卡直通實際上是由客戶操作系統使用原生驅動和硬件,缺少必要的中間層來跟蹤和維護GPU狀態,它不支持實時遷移等虛擬機高級特性。
Full GPU Visualization
顯卡虛擬化就是將顯卡進行切片,并將這些顯卡時間片分配給虛擬機使用的過程。由于支持顯卡虛擬化的顯卡一般可以根據需要切分成不同的規格的時間片,因此可以分配給多臺虛擬機使用。GPU全虛擬化允許虛擬機直接訪問對性能敏感的資源(如GPU訪問顯存),基本解決直通和共享的矛盾。比如類似于IO虛擬化的SR-IOV技術,通過影子頁表隔離每個虛擬GPU的訪問空間,從而大多數的命令執行會不受虛擬機監控器的干預,因此虛擬GPU就可以獲得接近非虛擬化情況下的性能。
不同的顯卡廠商,其全虛擬化的實現方式不同。比如AMD在其最新的GPU上采用了SR-IOV(單根虛擬化)技術來實現;Intel則采用KVMGT技術來實現,Nvidia采用了GPUvm/GRID技術來實現。