上一篇文章,講解了計(jì)算虛擬化之CPU虛擬化和內(nèi)存虛擬化。而GPU從某種意義上來講,其作用也是用于計(jì)算,只不過同CPU應(yīng)用用于通用計(jì)算相比,GPU則主要用于對圖形和圖像要求較高的場景,比如高清視頻編解碼、3D游戲、物理仿真等。本篇帶領(lǐng)大家了解一下GPU虛擬化技術(shù)。
GPU虛擬化
GPU技術(shù)在芯片行業(yè)中也如同CPU技術(shù)一樣快速發(fā)展,而且越來越多的用戶開始部署虛擬桌面方案。因此將GPU技術(shù)與虛擬化技術(shù)融合,是近年來虛擬化行業(yè)中比較熱門的技術(shù)課題,通過此種方式,將大大降低圖形圖像用戶的使用成本以及提高數(shù)據(jù)的處理效率和數(shù)據(jù)安全性。所謂GPU虛擬化,就是將一塊GPU卡的計(jì)算能力進(jìn)行切片,分成多個邏輯上虛擬的GPU,即vGPU,以vGPU為單位分配GPU的計(jì)算能力。以vGPU為單位可以將單塊GPU卡分配給多臺虛擬機(jī)使用,使得虛擬機(jī)能夠運(yùn)行3D軟件、播放高清視頻等,極大地提升了用戶體驗(yàn)。
目前GPU虛擬化主要有如下幾種技術(shù):
Device Simulation
API Forwarding
GPU Pass-Through
Full GPU Visualization
Device Simulation

設(shè)備模擬直接將設(shè)備分配給指定的虛擬機(jī)。采用類似于CPU虛擬化中二進(jìn)制轉(zhuǎn)換方法進(jìn)行模擬。但相對于CPU,GPU的特性復(fù)雜,不同的設(shè)備提供商之間的GPU規(guī)格區(qū)別很大,GPU的資源很難被拆分,模擬的效率低。因此,典型的QEMU軟件僅模擬了VGA設(shè)備的基本功能,它通過一個半虛擬化的圖像緩沖區(qū)來加速特定的2D圖像訪問,不符合高效、共享的虛擬化要求。由于設(shè)備模擬沒有一個確定的機(jī)制能使虛擬機(jī)進(jìn)行訪問圖形硬件的能力,因此這些虛擬的顯示設(shè)備都是通過使用CPU以及內(nèi)存的方式對圖形數(shù)據(jù)進(jìn)行相應(yīng)處理。
API Forwarding

API轉(zhuǎn)發(fā)將圖形指令如OpenGL從客戶虛擬機(jī)轉(zhuǎn)發(fā)到虛擬機(jī)監(jiān)視器VMM中,實(shí)現(xiàn)虛擬化環(huán)境下GPU的共享。該方法目前被廣泛應(yīng)用在VMWare和VirutalBox等軟件中?;贑hromium的VMGL和Oracle的VirtualBox,采用定制過的OpenGL庫來替換原有的OpenGL庫,將虛擬機(jī)中的OpenGL指令轉(zhuǎn)發(fā)到虛擬機(jī)監(jiān)視器中去執(zhí)行。針對GPU運(yùn)用于通用計(jì)算,rCUDA、vCUDA和gVirtuS、都采用轉(zhuǎn)發(fā)CUDA和OpenGL的指令來解決虛擬化環(huán)境下運(yùn)行GPU通用計(jì)算程序的問題。然而API轉(zhuǎn)發(fā)受限于平臺,例如Windows采用的接口是DirectX,不兼容于OpenGL或CUDA。因此,一個Linux主機(jī)就不能執(zhí)行Windows客戶機(jī)轉(zhuǎn)發(fā)過來的DirectX命令。同時由于API轉(zhuǎn)發(fā)引起大量的上下文切換,性能損失較大。
GPU Pass-Through

顯卡穿透(pass-through)也叫顯卡直通,是指繞過虛擬機(jī)管理系統(tǒng),將GPU單獨(dú)分配給某一虛擬機(jī),只有該虛擬機(jī)擁有使用GPU的權(quán)限,這種獨(dú)占設(shè)備的方法分配方式保存了GPU的完整性和獨(dú)立性,在性能方面與非虛擬化條件下接近,且可以用來進(jìn)行通用計(jì)算。但是顯卡直通需要利用顯卡的一些特殊細(xì)節(jié),同時兼容性差,僅在部分GPU中設(shè)備可以使用。同時GPU透傳只能將GPU分配給一臺虛擬機(jī)使用,無法在多臺虛擬機(jī)間共享,其他虛擬機(jī)無法使用到GPU提供的計(jì)算能力。由于顯卡直通實(shí)際上是由客戶操作系統(tǒng)使用原生驅(qū)動和硬件,缺少必要的中間層來跟蹤和維護(hù)GPU狀態(tài),它不支持實(shí)時遷移等虛擬機(jī)高級特性。
Full GPU Visualization

顯卡虛擬化就是將顯卡進(jìn)行切片,并將這些顯卡時間片分配給虛擬機(jī)使用的過程。由于支持顯卡虛擬化的顯卡一般可以根據(jù)需要切分成不同的規(guī)格的時間片,因此可以分配給多臺虛擬機(jī)使用。GPU全虛擬化允許虛擬機(jī)直接訪問對性能敏感的資源(如GPU訪問顯存),基本解決直通和共享的矛盾。比如類似于IO虛擬化的SR-IOV技術(shù),通過影子頁表隔離每個虛擬GPU的訪問空間,從而大多數(shù)的命令執(zhí)行會不受虛擬機(jī)監(jiān)控器的干預(yù),因此虛擬GPU就可以獲得接近非虛擬化情況下的性能。
不同的顯卡廠商,其全虛擬化的實(shí)現(xiàn)方式不同。比如AMD在其最新的GPU上采用了SR-IOV(單根虛擬化)技術(shù)來實(shí)現(xiàn);Intel則采用KVMGT技術(shù)來實(shí)現(xiàn),Nvidia采用了GPUvm/GRID技術(shù)來實(shí)現(xiàn)。