您現(xiàn)在的位置: 首頁 > GPU虛擬化,什么是gpu虛擬化
新聞資訊
NEWS INFORMATION
郵箱:dellchina@163.com
地址:地址:鄭州市金水區(qū)東風(fēng)路82號匯寶商務(wù)23層2311號
咨詢熱線
0371-60905151
公司新聞
GPU虛擬化,什么是gpu虛擬化
添加時間:2023/4/13 16:53:55
什么是GPU?
GPU英文名稱為Graphic Processing Unit,GPU中文全稱為計算機(jī)圖形處理器,1999年由NVIDIA公司提出。
GPU俗稱是顯卡,也叫GPU計算加速器卡
一、GPU概述
GPU這一概念也是相對于計算機(jī)系統(tǒng)中的CPU而言的,由于人們對圖形計算的需求越來越大,尤其是在家用系統(tǒng)和游戲發(fā)燒友,而傳統(tǒng)的CPU不能滿足現(xiàn)狀,因此需要提供一個專門處理圖形的核心處理器。嚴(yán)格來說,GPU與顯卡還是有區(qū)別的,GPU實質(zhì)上是作為硬件顯卡的“心臟-核心處理器”,地位等同于CPU在計算機(jī)系統(tǒng)中的作用。同時GPU也可以用來作為區(qū)分2D硬件顯卡和3D硬件顯卡的重要依據(jù)。2D硬件顯卡主要通過使用CPU 來處理特性和3D 圖像,將其稱作“軟加速”。而3D 硬件顯卡則是把特性和3D 圖像的處理能力集中到單獨的硬件顯卡中,也就是真正意義上的“硬件加速”。
問題1:為什么需要單獨的GPU,與CPU有何區(qū)別?
GPU與CPU不同的,最大特點它是并行編程模型,和CPU的串行編程模型完全不同,導(dǎo)致很多CPU上優(yōu)秀的算法都無法直接映射到GPU上,并且GPU的結(jié)構(gòu)相當(dāng)于共享存儲式多處理結(jié)構(gòu),因此在GPU上設(shè)計的并行程序與CPU上的串行程序具有很大的差異。GPU主要采用立方環(huán)境的材質(zhì)貼圖、硬體T&L、頂點混合、凹凸的映射貼圖和紋理壓縮、雙重紋理四像素256位的渲染引擎等重要技術(shù)。
由于圖形渲染任務(wù)具有高度的并行性,因此GPU可以僅僅通過增加并行處理單元和存儲器控制單元便可有效的提高處理能力和存儲器帶寬。
GPU設(shè)計目的和CPU截然不同,CPU是設(shè)計用來處理通用的復(fù)雜的任務(wù),而GPU主要用來處理計算性強(qiáng)而邏輯性不強(qiáng)的計算任務(wù),GPU中可利用的處理單元可以更多的作為執(zhí)行單元。因此,相較于CPU來說,GPU在具備大量重復(fù)數(shù)據(jù)集運(yùn)算和頻繁內(nèi)存訪問等特點的應(yīng)用場景中具有無可比擬的優(yōu)勢。
問題2:GPU是如何使用的?
其實GPU的使用有兩種方式:
一種是開發(fā)的應(yīng)用程序通過通用的圖形庫接口調(diào)用GPU設(shè)備,另一種是GPU自身提供API編程接口,應(yīng)用程序通過GPU提供的API編程接口直接調(diào)用GPU設(shè)備。
(1)通用圖形庫
通過通用的圖形庫的方式使用GPU,都是通過 OpenGL 或Direct3D這一類現(xiàn)有的圖形函數(shù)庫,以編寫渲染語言(Shading Language)的方法控制 GPU 內(nèi)部的渲染器(Shader)來完成需要的計算。
目前業(yè)界公認(rèn)的圖形編程接口主要有OpenGL和DirectX這兩種接口。
OpenGL是當(dāng)前可用于開發(fā)可交互、可移植的2D與3D圖形應(yīng)用程序的首選環(huán)境,也是當(dāng)前圖形應(yīng)用最廣泛的標(biāo)準(zhǔn)。OpenGL是SGI公司開發(fā)的計算機(jī)圖形處理系統(tǒng),是圖形硬件的軟件接口,GL為圖形庫(Graphics Library),OpenGL應(yīng)用程序不需要關(guān)注所在運(yùn)行環(huán)境所處的操作系統(tǒng)與平臺。
DirectX (Directe Xtension)也是一種圖形API。它是由Microsoft創(chuàng)建的多媒體編程接口,并已經(jīng)成為微軟視窗的標(biāo)準(zhǔn)。為適應(yīng)GPU應(yīng)用的需求,DirectX則根據(jù)GPU新產(chǎn)品功能的擴(kuò)充與進(jìn)展及時地定義新的版本,它所提供的功能幾乎與GPU提供的功能同步。
(2)GPU自身編程接口
GPU自身提供的編程接口主要由提供GPU設(shè)備的兩家公司提供,分別是括NVIDIA的CUDA框架和AMD公司的CTM(Close To Metal)框架(備注,最初是ATI公司生產(chǎn)GPU設(shè)備,后被AMD收購)。AMD的CTM框架現(xiàn)在已不在使用,主要是AMD(ATI)于2007 年推出了ATI Stream SDK架構(gòu),2008 年AMD(ATI)完全轉(zhuǎn)向了公開的OpenCL標(biāo)準(zhǔn),因此AMD(ATI)公司目前已沒有獨立的、私有的通用計算框架。
2007年NVIDIA公司發(fā)布CUDA (Compute Unified Device Architecture)專用通用計算框架。使用CUDA 進(jìn)行通用計算編程不再需要借助圖形學(xué)API,而是使用與C 語言十分類似的方式進(jìn)行開發(fā)。在CUDA 編程模型中,有一個被稱為主機(jī)(Host)的CPU 和若干個被稱作設(shè)備(Device)或者協(xié)處理器(Co-Processor)的GPU。
在該模型中,CPU和GPU協(xié)同工作,各司其職。CPU負(fù)責(zé)進(jìn)行邏輯性較強(qiáng)的事務(wù)處理和串行計算,而GPU 則專注于執(zhí)行線程化的并行處理任務(wù)。CPU、GPU 各自擁有相互獨立的存儲器地址空間主機(jī)端的內(nèi)存和設(shè)備端的顯存。一般采用CUDA 框架自己進(jìn)行編程的都一些大型的應(yīng)用程序,比如石油勘測、流體力學(xué)模擬、分子動力學(xué)仿真、生物計算、音視頻編解碼、天文計算等領(lǐng)域。
而我們一般企業(yè)級的應(yīng)用程序由于開發(fā)成本以及兼容性等原因,大多數(shù)都是采用通用的圖形庫來進(jìn)行開發(fā)調(diào)用GPU設(shè)備。
問題3:GPU是如何工作的?
GPU 對于通用計算和圖形處理的內(nèi)部組件主要有兩部分: 頂點處理器(Vertex Processor)和子素處理器(Fragment Processor)。這種處理器具備流處理機(jī)的模式,即不具有大容量的快存/存儲器可以讀寫,只是直接在芯片上利用臨時寄存器進(jìn)行流數(shù)據(jù)的操作。
當(dāng)GPU 用于圖形處理時,此時GPU 內(nèi)部的頂點渲染、像素渲染以及幾何渲染操作都可以通過流處理器完成。從圖中可以看出,此時GPU 內(nèi)部的所有流處理器相當(dāng)于一個多核的處理器,數(shù)據(jù)可以很方便的在不同的流處理器之間的輸入和輸出之間移動,同時GPU分派器和控制邏輯可以動態(tài)的指派流處理器進(jìn)行相應(yīng)的頂點,像素,幾何等操作,因為流處理器都是通用的。
二、GPU虛擬化技術(shù)
通常在虛擬機(jī)系統(tǒng)中的圖形處理方式有三種:一是采用虛擬顯卡的方式,二是直接采用物理顯卡,三是采用GPU虛擬化
1、虛擬顯卡
采用虛擬顯卡是現(xiàn)在主流的虛擬化系統(tǒng)的選擇,因為專業(yè)的顯卡硬件價格不菲。
目前采用虛擬顯卡的這些技術(shù)包括:
1)虛擬網(wǎng)絡(luò)計算機(jī)VNC (Virtual Network Computing)
VNC(Virtual Network Computing)基本上是屬于一種顯示系統(tǒng),也就是說它能將完整的窗口界面通過網(wǎng)絡(luò),傳輸?shù)搅硪慌_計算機(jī)的屏幕上。Windows 服務(wù)器中包含的"Terminal Server"即是屬于這種原理的設(shè)計。VNC 是由AT&T 實驗室所開發(fā)的,其采用GPL(General Public License)授權(quán)條款,任何人都可免費(fèi)取得該軟件。VNC軟件要由兩個部分組成:VNC server和VNC viewer。用戶需先將VNC server安裝在被遠(yuǎn)程操控的計算機(jī)上后,才能在主控端執(zhí)行VNC viewer 進(jìn)行遠(yuǎn)程操控。
2)Xen 虛擬幀緩存
XEN虛擬幀緩存是指XEN提供的一個虛擬的顯示設(shè)備。該虛擬顯示設(shè)備采用特權(quán)域的VNC服務(wù)器,因此該虛擬顯示設(shè)備具有相似的VNC接口。客戶機(jī)在XEN虛擬幀緩存中寫入數(shù)據(jù),然后通過VNC 協(xié)議來傳輸已修改的圖片,最后通知前端進(jìn)行相應(yīng)區(qū)域的更新。這個虛擬幀緩存設(shè)備的源碼是來自開源的Qemu。我們在XenServer上看見虛擬機(jī)的操作系統(tǒng)桌面界面,即是這種技術(shù)的顯示。
3)VMware虛擬圖形顯示處理器GPU (Graphics Processing Unit)
虛擬網(wǎng)絡(luò)計算機(jī)VNC 和XEN 虛擬幀緩存這兩種模式至今在虛擬機(jī)中仍未提供一定的硬件圖形加速能力。由于目前仍沒有一個機(jī)制能使虛擬機(jī)進(jìn)行訪問圖形硬件的能力,因此這些虛擬的顯示設(shè)備都是通過使用CPU以及內(nèi)存的方式對圖形數(shù)據(jù)進(jìn)行相應(yīng)處理。并沒有采用物理顯示設(shè)備的功能。
4)獨立于虛擬機(jī)管理器的圖形加速系統(tǒng)VMGL (VMM-Independent Graphics Acceleration)。
VMGL這種模式通常被稱為前端-后端虛擬化機(jī)制(Front-end virtualization)。VMGL這種模式采用這個機(jī)制將需要圖形處理的數(shù)據(jù)發(fā)送到一個擁有硬件圖形加速功能的虛擬監(jiān)控機(jī)上進(jìn)行相應(yīng)的圖形數(shù)據(jù)處理。目前存在的比較主流可用于GPU應(yīng)用程序開發(fā)的圖形處理接口有兩類:OpenGL和Direct3D。
在這兩類圖形處理接口中,OpenGL是唯一一類能夠在主流操作系統(tǒng)中跨平臺操作的圖形API接口。在虛擬機(jī)平臺中,VMGL是首個針對OpenGL API進(jìn)行虛擬化的項目。VMGL的工作原理是,它在客戶端操作系統(tǒng)中部署了一個偽庫(Fake Library)用來取代標(biāo)準(zhǔn)的OpenGL 庫,偽庫(Fake Library)擁有與標(biāo)準(zhǔn)的OpenGL庫相同的接口,在客戶端操作系統(tǒng)中的偽庫也實現(xiàn)了指向遠(yuǎn)程服務(wù)器的宿主機(jī)操作系統(tǒng)的遠(yuǎn)程調(diào)用。
這樣一來,所有的本地OPENGL調(diào)用都將被解釋為對遠(yuǎn)程服務(wù)器的一次服務(wù)請求,遠(yuǎn)程服務(wù)器的宿主機(jī)操作系統(tǒng)擁有真正的OPENGL庫、顯卡驅(qū)動和物理硬件GPU,它負(fù)責(zé)完成OPENGL請求并將執(zhí)行結(jié)果顯示到屏幕上。由于VMGL在整個過程操作中都是完全透明的,因此調(diào)用OPENGL的應(yīng)用程序不需要修改源代碼也不需要進(jìn)行二進(jìn)制改寫,無需為虛擬機(jī)平臺作任何改動。
2、顯卡直通
顯卡直通也叫做顯卡透傳(Pass-Through),是指繞過虛擬機(jī)管理系統(tǒng),將GPU 單獨分配給某一虛擬機(jī),只有該虛擬機(jī)擁有使用GPU的權(quán)限,這種獨占設(shè)備的方法分配方式保存了GPU的完整性和獨立性,在性能方面與非虛擬化條件下接近,且可以用來進(jìn)行通用計算。但是顯卡直通需要利用顯卡的一些特殊細(xì)節(jié),同時兼容性差,僅在部分GPU 中設(shè)備可以使用。
Xen 4.0增加了VGA Passthrough技術(shù),因此XenServer也擁有了該技術(shù),XenServer的Passthrough 就是利用英特爾設(shè)備虛擬化(Intel VT-d)技術(shù)將顯示設(shè)備暴露給某一個客戶虛擬機(jī),不僅其它客戶虛擬機(jī)不能訪問,就連宿主虛擬機(jī)也失去了使用該GPU的能力。它在客戶虛擬機(jī)中實現(xiàn)了顯卡的一些特殊細(xì)節(jié),如VGA BIOS、文本模式、IO 端口、內(nèi)存映射、VESA模式等,以支持直接訪問。使用Xen Server的 VGA Pass-Through 技術(shù)的GPU執(zhí)行效率高,功能全,但只能被單一系統(tǒng)獨占使用,失去了設(shè)備復(fù)用的功能。VMware ESXi 中包括一個VM Direct Path I/O框架,使用該技術(shù)也可以將我們的顯卡設(shè)備直通給某一虛擬機(jī)進(jìn)行使用。
XenServer和VMware使用的是不同的技術(shù)但是實現(xiàn)的效果都是一樣的,即將物理顯卡設(shè)備直通給其中的某一虛擬機(jī)使用,以達(dá)到虛擬機(jī)進(jìn)行3D顯示和渲染的效果。
由于顯卡直通實際上是由客戶操作系統(tǒng)使用原生驅(qū)動和硬件,缺少必要的中間層來跟蹤和維護(hù)GPU 狀態(tài),它不支持實時遷移等虛擬機(jī)高級特性。如XenServer Passthrough禁止執(zhí)行Save/Restore/Migration 等操作。VMware的虛擬機(jī)中,一旦開啟VMDirectPath I/O功能,其對應(yīng)的虛擬機(jī)將失去執(zhí)行掛起/恢復(fù)、實時遷移的能力。
3、顯卡虛擬化(GPU虛擬化)
顯卡虛擬化就是將顯卡進(jìn)行切片,并將這些顯卡時間片分配給虛擬機(jī)使用的過程。由于支持顯卡虛擬化的顯卡一般可以根據(jù)需要切分成不同的規(guī)格的時間片,因此可以分配給多臺虛擬機(jī)使用。其實現(xiàn)原理其實就是利用應(yīng)用層接口虛擬化(API remoting),API重定向是指在應(yīng)用層進(jìn)行攔截與GPU相關(guān)的應(yīng)用程序編程接口(API),通過重定向(仍然使用GPU)的方式完成相應(yīng)功能,再將執(zhí)行結(jié)果返回應(yīng)用程序。
我們現(xiàn)在使用Citrix的3D桌面虛擬化解決方案中,大部分是使用NVIDIA公司提供的顯卡虛擬化技術(shù),即是vCUDA(virtual CUDA)技術(shù),前面我們說過了CUDA框架,再此不在說明。vCUDA采用在用戶層攔截和重定向CUDA API的方法,在虛擬機(jī)中建立物理GPU的邏輯映像——虛擬GPU,實現(xiàn)GPU資源的細(xì)粒度劃分、重組和再利用,支持多機(jī)并發(fā)、掛起恢復(fù)等虛擬機(jī)高級特性。
其vCUDA的實現(xiàn)原理大概包括三個模塊:CUDA客戶端、CUDA服務(wù)端和CUDA管理端。以XenServer為例,在物理硬件資源上運(yùn)行著一個VMM用于向上提供硬件映像,在VMM上運(yùn)行著若干個虛擬機(jī)。其中一個虛擬機(jī)為特權(quán)虛擬機(jī)(Host VM),即為XenServer中的Domain 0,在虛擬機(jī)中運(yùn)行的操作系統(tǒng)稱為Host OS。
Host OS能夠直接控制硬件,系統(tǒng)內(nèi)安裝著原生的CUDA庫以及GPU驅(qū)動,使得Host OS可以直接訪問GPU和使用CUDA。其它的虛擬機(jī)屬于非特權(quán)虛擬機(jī)(Guest VM),其上運(yùn)行的操作系統(tǒng)(Guest OS)不能直接操縱GPU。在這里我們將CUDA客戶端稱之為客戶端驅(qū)動,CUDA服務(wù)端稱之為宿主機(jī)的驅(qū)動,CUDA管理端稱之為GPU管理器。
3.1、客戶端
客戶端驅(qū)動其實質(zhì)就是我們安裝在虛擬機(jī)比如Windows 7上的顯卡驅(qū)動程序。主要的功能是在用戶層提供針對CUDA API的庫以及一個維護(hù)CUDA相關(guān)軟硬件狀態(tài)的虛擬GPU(vGPU)??蛻舳蓑?qū)動直接面向CUDA應(yīng)用程序,其作用包括:
1)攔截應(yīng)用程序中CUDA API調(diào)用;
2)選擇通信策略,為虛擬化提供更高層語義的支持;
3)對調(diào)用的接口和參數(shù)進(jìn)行封裝、編碼;
4)對服務(wù)端返回的數(shù)據(jù)進(jìn)行解碼,并返回給應(yīng)用。
此外,客戶端驅(qū)動在第一個API調(diào)用到來之前,首先到管理端索取GPU資源。每一個獨立的調(diào)用過程都必須到宿主管理端驅(qū)動申請資源,以實現(xiàn)對GPU資源和任務(wù)的實時調(diào)度。
此外,客戶端驅(qū)動同時設(shè)置了vGPU用來維護(hù)與顯卡相關(guān)的軟硬件狀態(tài)。vGPU本身實質(zhì)上僅僅是一個鍵值對的數(shù)據(jù)結(jié)構(gòu),在其中存儲了當(dāng)前使用的地址空間、顯存對象、內(nèi)存對象等,同時記錄了API的調(diào)用次序。當(dāng)計算結(jié)果返回時,客戶端驅(qū)動會根據(jù)結(jié)果更新vGPU。
3.2、服務(wù)器端
服務(wù)端組件位于特權(quán)虛擬機(jī)(XenServer術(shù)語:特權(quán)域)中的應(yīng)用層。特權(quán)虛擬機(jī)可以直接與硬件交互,因此服務(wù)端組件可以直接操縱物理GPU來完成通用計算任務(wù)。
服務(wù)端面向真實GPU,其作用包括:
1)接收客戶端的數(shù)據(jù)報,并解析出調(diào)用和參數(shù);
2)對調(diào)用和參數(shù)進(jìn)行審核;
3)利用CUDA和物理GPU計算審核通過的調(diào)用;
4)將結(jié)果編碼,并返回給客戶端;
5)對計算系統(tǒng)中支持CUDA的GPU進(jìn)行管理。
此外,服務(wù)端運(yùn)行的第一個任務(wù)是將自身支持CUDA的GPU設(shè)備的信息注冊到管理端中。服務(wù)端應(yīng)對客戶端的請求時,為每個應(yīng)用分配獨立的服務(wù)線程。服務(wù)端統(tǒng)一管理本地GPU資源,按照一定的策略提供GPU資源,并將由于API調(diào)用修改的相關(guān)軟硬件狀態(tài)更新至vGPU。
3.3、管理端
管理端組件位于特權(quán)域,在實現(xiàn)CUDA編程接口虛擬化的基礎(chǔ)上,將GPU強(qiáng)大的計算能力和計算資源在更高的邏輯層次上進(jìn)行隔離、劃分、調(diào)度。在CUDA服務(wù)端使用計算線程和工作線程在一定程度上使同在一個物理機(jī)上的GPU間負(fù)載均衡,設(shè)置CUDA管理端組件在更高的邏輯層次上進(jìn)行負(fù)載均衡,使在同一個GPU虛擬集群中的GPU負(fù)載均衡。
管理端組件調(diào)度的原則是盡量使在同一個物理機(jī)上的GPU需求自給,如果該物理機(jī)上具備滿足條件的GPU資源,在一般情況下,該物理機(jī)上的虛擬機(jī)的GPU需求都重定向到該物理機(jī)的CUDA服務(wù)端。
管理端對GPU資源進(jìn)行統(tǒng)一管理,采用集中、靈活的機(jī)制,實現(xiàn):
1)動態(tài)調(diào)度:當(dāng)用戶所占資源空閑時間超過一定閾值或者任務(wù)結(jié)束時,管理端回收該資源,當(dāng)該用戶再次發(fā)布計算任務(wù)時,重新為其任務(wù)分配GPU資源;
2)負(fù)載平衡:當(dāng)局部計算壓力過大時,調(diào)整計算負(fù)載,通過動態(tài)調(diào)度時選擇合適的GPU資源來分散計算負(fù)載;
3)故障恢復(fù):當(dāng)出現(xiàn)故障時,將任務(wù)轉(zhuǎn)移到新的可用GPU資源上。
GPU英文名稱為Graphic Processing Unit,GPU中文全稱為計算機(jī)圖形處理器,1999年由NVIDIA公司提出。
GPU俗稱是顯卡,也叫GPU計算加速器卡
一、GPU概述
GPU這一概念也是相對于計算機(jī)系統(tǒng)中的CPU而言的,由于人們對圖形計算的需求越來越大,尤其是在家用系統(tǒng)和游戲發(fā)燒友,而傳統(tǒng)的CPU不能滿足現(xiàn)狀,因此需要提供一個專門處理圖形的核心處理器。嚴(yán)格來說,GPU與顯卡還是有區(qū)別的,GPU實質(zhì)上是作為硬件顯卡的“心臟-核心處理器”,地位等同于CPU在計算機(jī)系統(tǒng)中的作用。同時GPU也可以用來作為區(qū)分2D硬件顯卡和3D硬件顯卡的重要依據(jù)。2D硬件顯卡主要通過使用CPU 來處理特性和3D 圖像,將其稱作“軟加速”。而3D 硬件顯卡則是把特性和3D 圖像的處理能力集中到單獨的硬件顯卡中,也就是真正意義上的“硬件加速”。
問題1:為什么需要單獨的GPU,與CPU有何區(qū)別?
GPU與CPU不同的,最大特點它是并行編程模型,和CPU的串行編程模型完全不同,導(dǎo)致很多CPU上優(yōu)秀的算法都無法直接映射到GPU上,并且GPU的結(jié)構(gòu)相當(dāng)于共享存儲式多處理結(jié)構(gòu),因此在GPU上設(shè)計的并行程序與CPU上的串行程序具有很大的差異。GPU主要采用立方環(huán)境的材質(zhì)貼圖、硬體T&L、頂點混合、凹凸的映射貼圖和紋理壓縮、雙重紋理四像素256位的渲染引擎等重要技術(shù)。
由于圖形渲染任務(wù)具有高度的并行性,因此GPU可以僅僅通過增加并行處理單元和存儲器控制單元便可有效的提高處理能力和存儲器帶寬。
GPU設(shè)計目的和CPU截然不同,CPU是設(shè)計用來處理通用的復(fù)雜的任務(wù),而GPU主要用來處理計算性強(qiáng)而邏輯性不強(qiáng)的計算任務(wù),GPU中可利用的處理單元可以更多的作為執(zhí)行單元。因此,相較于CPU來說,GPU在具備大量重復(fù)數(shù)據(jù)集運(yùn)算和頻繁內(nèi)存訪問等特點的應(yīng)用場景中具有無可比擬的優(yōu)勢。
問題2:GPU是如何使用的?
其實GPU的使用有兩種方式:
一種是開發(fā)的應(yīng)用程序通過通用的圖形庫接口調(diào)用GPU設(shè)備,另一種是GPU自身提供API編程接口,應(yīng)用程序通過GPU提供的API編程接口直接調(diào)用GPU設(shè)備。
(1)通用圖形庫
通過通用的圖形庫的方式使用GPU,都是通過 OpenGL 或Direct3D這一類現(xiàn)有的圖形函數(shù)庫,以編寫渲染語言(Shading Language)的方法控制 GPU 內(nèi)部的渲染器(Shader)來完成需要的計算。
目前業(yè)界公認(rèn)的圖形編程接口主要有OpenGL和DirectX這兩種接口。
OpenGL是當(dāng)前可用于開發(fā)可交互、可移植的2D與3D圖形應(yīng)用程序的首選環(huán)境,也是當(dāng)前圖形應(yīng)用最廣泛的標(biāo)準(zhǔn)。OpenGL是SGI公司開發(fā)的計算機(jī)圖形處理系統(tǒng),是圖形硬件的軟件接口,GL為圖形庫(Graphics Library),OpenGL應(yīng)用程序不需要關(guān)注所在運(yùn)行環(huán)境所處的操作系統(tǒng)與平臺。
DirectX (Directe Xtension)也是一種圖形API。它是由Microsoft創(chuàng)建的多媒體編程接口,并已經(jīng)成為微軟視窗的標(biāo)準(zhǔn)。為適應(yīng)GPU應(yīng)用的需求,DirectX則根據(jù)GPU新產(chǎn)品功能的擴(kuò)充與進(jìn)展及時地定義新的版本,它所提供的功能幾乎與GPU提供的功能同步。
(2)GPU自身編程接口
GPU自身提供的編程接口主要由提供GPU設(shè)備的兩家公司提供,分別是括NVIDIA的CUDA框架和AMD公司的CTM(Close To Metal)框架(備注,最初是ATI公司生產(chǎn)GPU設(shè)備,后被AMD收購)。AMD的CTM框架現(xiàn)在已不在使用,主要是AMD(ATI)于2007 年推出了ATI Stream SDK架構(gòu),2008 年AMD(ATI)完全轉(zhuǎn)向了公開的OpenCL標(biāo)準(zhǔn),因此AMD(ATI)公司目前已沒有獨立的、私有的通用計算框架。
2007年NVIDIA公司發(fā)布CUDA (Compute Unified Device Architecture)專用通用計算框架。使用CUDA 進(jìn)行通用計算編程不再需要借助圖形學(xué)API,而是使用與C 語言十分類似的方式進(jìn)行開發(fā)。在CUDA 編程模型中,有一個被稱為主機(jī)(Host)的CPU 和若干個被稱作設(shè)備(Device)或者協(xié)處理器(Co-Processor)的GPU。
在該模型中,CPU和GPU協(xié)同工作,各司其職。CPU負(fù)責(zé)進(jìn)行邏輯性較強(qiáng)的事務(wù)處理和串行計算,而GPU 則專注于執(zhí)行線程化的并行處理任務(wù)。CPU、GPU 各自擁有相互獨立的存儲器地址空間主機(jī)端的內(nèi)存和設(shè)備端的顯存。一般采用CUDA 框架自己進(jìn)行編程的都一些大型的應(yīng)用程序,比如石油勘測、流體力學(xué)模擬、分子動力學(xué)仿真、生物計算、音視頻編解碼、天文計算等領(lǐng)域。
而我們一般企業(yè)級的應(yīng)用程序由于開發(fā)成本以及兼容性等原因,大多數(shù)都是采用通用的圖形庫來進(jìn)行開發(fā)調(diào)用GPU設(shè)備。
問題3:GPU是如何工作的?
GPU 對于通用計算和圖形處理的內(nèi)部組件主要有兩部分: 頂點處理器(Vertex Processor)和子素處理器(Fragment Processor)。這種處理器具備流處理機(jī)的模式,即不具有大容量的快存/存儲器可以讀寫,只是直接在芯片上利用臨時寄存器進(jìn)行流數(shù)據(jù)的操作。
當(dāng)GPU 用于圖形處理時,此時GPU 內(nèi)部的頂點渲染、像素渲染以及幾何渲染操作都可以通過流處理器完成。從圖中可以看出,此時GPU 內(nèi)部的所有流處理器相當(dāng)于一個多核的處理器,數(shù)據(jù)可以很方便的在不同的流處理器之間的輸入和輸出之間移動,同時GPU分派器和控制邏輯可以動態(tài)的指派流處理器進(jìn)行相應(yīng)的頂點,像素,幾何等操作,因為流處理器都是通用的。
二、GPU虛擬化技術(shù)
通常在虛擬機(jī)系統(tǒng)中的圖形處理方式有三種:一是采用虛擬顯卡的方式,二是直接采用物理顯卡,三是采用GPU虛擬化
1、虛擬顯卡
采用虛擬顯卡是現(xiàn)在主流的虛擬化系統(tǒng)的選擇,因為專業(yè)的顯卡硬件價格不菲。
目前采用虛擬顯卡的這些技術(shù)包括:
1)虛擬網(wǎng)絡(luò)計算機(jī)VNC (Virtual Network Computing)
VNC(Virtual Network Computing)基本上是屬于一種顯示系統(tǒng),也就是說它能將完整的窗口界面通過網(wǎng)絡(luò),傳輸?shù)搅硪慌_計算機(jī)的屏幕上。Windows 服務(wù)器中包含的"Terminal Server"即是屬于這種原理的設(shè)計。VNC 是由AT&T 實驗室所開發(fā)的,其采用GPL(General Public License)授權(quán)條款,任何人都可免費(fèi)取得該軟件。VNC軟件要由兩個部分組成:VNC server和VNC viewer。用戶需先將VNC server安裝在被遠(yuǎn)程操控的計算機(jī)上后,才能在主控端執(zhí)行VNC viewer 進(jìn)行遠(yuǎn)程操控。
2)Xen 虛擬幀緩存
XEN虛擬幀緩存是指XEN提供的一個虛擬的顯示設(shè)備。該虛擬顯示設(shè)備采用特權(quán)域的VNC服務(wù)器,因此該虛擬顯示設(shè)備具有相似的VNC接口。客戶機(jī)在XEN虛擬幀緩存中寫入數(shù)據(jù),然后通過VNC 協(xié)議來傳輸已修改的圖片,最后通知前端進(jìn)行相應(yīng)區(qū)域的更新。這個虛擬幀緩存設(shè)備的源碼是來自開源的Qemu。我們在XenServer上看見虛擬機(jī)的操作系統(tǒng)桌面界面,即是這種技術(shù)的顯示。
3)VMware虛擬圖形顯示處理器GPU (Graphics Processing Unit)
虛擬網(wǎng)絡(luò)計算機(jī)VNC 和XEN 虛擬幀緩存這兩種模式至今在虛擬機(jī)中仍未提供一定的硬件圖形加速能力。由于目前仍沒有一個機(jī)制能使虛擬機(jī)進(jìn)行訪問圖形硬件的能力,因此這些虛擬的顯示設(shè)備都是通過使用CPU以及內(nèi)存的方式對圖形數(shù)據(jù)進(jìn)行相應(yīng)處理。并沒有采用物理顯示設(shè)備的功能。
4)獨立于虛擬機(jī)管理器的圖形加速系統(tǒng)VMGL (VMM-Independent Graphics Acceleration)。
VMGL這種模式通常被稱為前端-后端虛擬化機(jī)制(Front-end virtualization)。VMGL這種模式采用這個機(jī)制將需要圖形處理的數(shù)據(jù)發(fā)送到一個擁有硬件圖形加速功能的虛擬監(jiān)控機(jī)上進(jìn)行相應(yīng)的圖形數(shù)據(jù)處理。目前存在的比較主流可用于GPU應(yīng)用程序開發(fā)的圖形處理接口有兩類:OpenGL和Direct3D。
在這兩類圖形處理接口中,OpenGL是唯一一類能夠在主流操作系統(tǒng)中跨平臺操作的圖形API接口。在虛擬機(jī)平臺中,VMGL是首個針對OpenGL API進(jìn)行虛擬化的項目。VMGL的工作原理是,它在客戶端操作系統(tǒng)中部署了一個偽庫(Fake Library)用來取代標(biāo)準(zhǔn)的OpenGL 庫,偽庫(Fake Library)擁有與標(biāo)準(zhǔn)的OpenGL庫相同的接口,在客戶端操作系統(tǒng)中的偽庫也實現(xiàn)了指向遠(yuǎn)程服務(wù)器的宿主機(jī)操作系統(tǒng)的遠(yuǎn)程調(diào)用。
這樣一來,所有的本地OPENGL調(diào)用都將被解釋為對遠(yuǎn)程服務(wù)器的一次服務(wù)請求,遠(yuǎn)程服務(wù)器的宿主機(jī)操作系統(tǒng)擁有真正的OPENGL庫、顯卡驅(qū)動和物理硬件GPU,它負(fù)責(zé)完成OPENGL請求并將執(zhí)行結(jié)果顯示到屏幕上。由于VMGL在整個過程操作中都是完全透明的,因此調(diào)用OPENGL的應(yīng)用程序不需要修改源代碼也不需要進(jìn)行二進(jìn)制改寫,無需為虛擬機(jī)平臺作任何改動。
2、顯卡直通
顯卡直通也叫做顯卡透傳(Pass-Through),是指繞過虛擬機(jī)管理系統(tǒng),將GPU 單獨分配給某一虛擬機(jī),只有該虛擬機(jī)擁有使用GPU的權(quán)限,這種獨占設(shè)備的方法分配方式保存了GPU的完整性和獨立性,在性能方面與非虛擬化條件下接近,且可以用來進(jìn)行通用計算。但是顯卡直通需要利用顯卡的一些特殊細(xì)節(jié),同時兼容性差,僅在部分GPU 中設(shè)備可以使用。
Xen 4.0增加了VGA Passthrough技術(shù),因此XenServer也擁有了該技術(shù),XenServer的Passthrough 就是利用英特爾設(shè)備虛擬化(Intel VT-d)技術(shù)將顯示設(shè)備暴露給某一個客戶虛擬機(jī),不僅其它客戶虛擬機(jī)不能訪問,就連宿主虛擬機(jī)也失去了使用該GPU的能力。它在客戶虛擬機(jī)中實現(xiàn)了顯卡的一些特殊細(xì)節(jié),如VGA BIOS、文本模式、IO 端口、內(nèi)存映射、VESA模式等,以支持直接訪問。使用Xen Server的 VGA Pass-Through 技術(shù)的GPU執(zhí)行效率高,功能全,但只能被單一系統(tǒng)獨占使用,失去了設(shè)備復(fù)用的功能。VMware ESXi 中包括一個VM Direct Path I/O框架,使用該技術(shù)也可以將我們的顯卡設(shè)備直通給某一虛擬機(jī)進(jìn)行使用。
XenServer和VMware使用的是不同的技術(shù)但是實現(xiàn)的效果都是一樣的,即將物理顯卡設(shè)備直通給其中的某一虛擬機(jī)使用,以達(dá)到虛擬機(jī)進(jìn)行3D顯示和渲染的效果。
由于顯卡直通實際上是由客戶操作系統(tǒng)使用原生驅(qū)動和硬件,缺少必要的中間層來跟蹤和維護(hù)GPU 狀態(tài),它不支持實時遷移等虛擬機(jī)高級特性。如XenServer Passthrough禁止執(zhí)行Save/Restore/Migration 等操作。VMware的虛擬機(jī)中,一旦開啟VMDirectPath I/O功能,其對應(yīng)的虛擬機(jī)將失去執(zhí)行掛起/恢復(fù)、實時遷移的能力。
3、顯卡虛擬化(GPU虛擬化)
顯卡虛擬化就是將顯卡進(jìn)行切片,并將這些顯卡時間片分配給虛擬機(jī)使用的過程。由于支持顯卡虛擬化的顯卡一般可以根據(jù)需要切分成不同的規(guī)格的時間片,因此可以分配給多臺虛擬機(jī)使用。其實現(xiàn)原理其實就是利用應(yīng)用層接口虛擬化(API remoting),API重定向是指在應(yīng)用層進(jìn)行攔截與GPU相關(guān)的應(yīng)用程序編程接口(API),通過重定向(仍然使用GPU)的方式完成相應(yīng)功能,再將執(zhí)行結(jié)果返回應(yīng)用程序。
我們現(xiàn)在使用Citrix的3D桌面虛擬化解決方案中,大部分是使用NVIDIA公司提供的顯卡虛擬化技術(shù),即是vCUDA(virtual CUDA)技術(shù),前面我們說過了CUDA框架,再此不在說明。vCUDA采用在用戶層攔截和重定向CUDA API的方法,在虛擬機(jī)中建立物理GPU的邏輯映像——虛擬GPU,實現(xiàn)GPU資源的細(xì)粒度劃分、重組和再利用,支持多機(jī)并發(fā)、掛起恢復(fù)等虛擬機(jī)高級特性。
其vCUDA的實現(xiàn)原理大概包括三個模塊:CUDA客戶端、CUDA服務(wù)端和CUDA管理端。以XenServer為例,在物理硬件資源上運(yùn)行著一個VMM用于向上提供硬件映像,在VMM上運(yùn)行著若干個虛擬機(jī)。其中一個虛擬機(jī)為特權(quán)虛擬機(jī)(Host VM),即為XenServer中的Domain 0,在虛擬機(jī)中運(yùn)行的操作系統(tǒng)稱為Host OS。
Host OS能夠直接控制硬件,系統(tǒng)內(nèi)安裝著原生的CUDA庫以及GPU驅(qū)動,使得Host OS可以直接訪問GPU和使用CUDA。其它的虛擬機(jī)屬于非特權(quán)虛擬機(jī)(Guest VM),其上運(yùn)行的操作系統(tǒng)(Guest OS)不能直接操縱GPU。在這里我們將CUDA客戶端稱之為客戶端驅(qū)動,CUDA服務(wù)端稱之為宿主機(jī)的驅(qū)動,CUDA管理端稱之為GPU管理器。
3.1、客戶端
客戶端驅(qū)動其實質(zhì)就是我們安裝在虛擬機(jī)比如Windows 7上的顯卡驅(qū)動程序。主要的功能是在用戶層提供針對CUDA API的庫以及一個維護(hù)CUDA相關(guān)軟硬件狀態(tài)的虛擬GPU(vGPU)??蛻舳蓑?qū)動直接面向CUDA應(yīng)用程序,其作用包括:
1)攔截應(yīng)用程序中CUDA API調(diào)用;
2)選擇通信策略,為虛擬化提供更高層語義的支持;
3)對調(diào)用的接口和參數(shù)進(jìn)行封裝、編碼;
4)對服務(wù)端返回的數(shù)據(jù)進(jìn)行解碼,并返回給應(yīng)用。
此外,客戶端驅(qū)動在第一個API調(diào)用到來之前,首先到管理端索取GPU資源。每一個獨立的調(diào)用過程都必須到宿主管理端驅(qū)動申請資源,以實現(xiàn)對GPU資源和任務(wù)的實時調(diào)度。
此外,客戶端驅(qū)動同時設(shè)置了vGPU用來維護(hù)與顯卡相關(guān)的軟硬件狀態(tài)。vGPU本身實質(zhì)上僅僅是一個鍵值對的數(shù)據(jù)結(jié)構(gòu),在其中存儲了當(dāng)前使用的地址空間、顯存對象、內(nèi)存對象等,同時記錄了API的調(diào)用次序。當(dāng)計算結(jié)果返回時,客戶端驅(qū)動會根據(jù)結(jié)果更新vGPU。
3.2、服務(wù)器端
服務(wù)端組件位于特權(quán)虛擬機(jī)(XenServer術(shù)語:特權(quán)域)中的應(yīng)用層。特權(quán)虛擬機(jī)可以直接與硬件交互,因此服務(wù)端組件可以直接操縱物理GPU來完成通用計算任務(wù)。
服務(wù)端面向真實GPU,其作用包括:
1)接收客戶端的數(shù)據(jù)報,并解析出調(diào)用和參數(shù);
2)對調(diào)用和參數(shù)進(jìn)行審核;
3)利用CUDA和物理GPU計算審核通過的調(diào)用;
4)將結(jié)果編碼,并返回給客戶端;
5)對計算系統(tǒng)中支持CUDA的GPU進(jìn)行管理。
此外,服務(wù)端運(yùn)行的第一個任務(wù)是將自身支持CUDA的GPU設(shè)備的信息注冊到管理端中。服務(wù)端應(yīng)對客戶端的請求時,為每個應(yīng)用分配獨立的服務(wù)線程。服務(wù)端統(tǒng)一管理本地GPU資源,按照一定的策略提供GPU資源,并將由于API調(diào)用修改的相關(guān)軟硬件狀態(tài)更新至vGPU。
3.3、管理端
管理端組件位于特權(quán)域,在實現(xiàn)CUDA編程接口虛擬化的基礎(chǔ)上,將GPU強(qiáng)大的計算能力和計算資源在更高的邏輯層次上進(jìn)行隔離、劃分、調(diào)度。在CUDA服務(wù)端使用計算線程和工作線程在一定程度上使同在一個物理機(jī)上的GPU間負(fù)載均衡,設(shè)置CUDA管理端組件在更高的邏輯層次上進(jìn)行負(fù)載均衡,使在同一個GPU虛擬集群中的GPU負(fù)載均衡。
管理端組件調(diào)度的原則是盡量使在同一個物理機(jī)上的GPU需求自給,如果該物理機(jī)上具備滿足條件的GPU資源,在一般情況下,該物理機(jī)上的虛擬機(jī)的GPU需求都重定向到該物理機(jī)的CUDA服務(wù)端。
管理端對GPU資源進(jìn)行統(tǒng)一管理,采用集中、靈活的機(jī)制,實現(xiàn):
1)動態(tài)調(diào)度:當(dāng)用戶所占資源空閑時間超過一定閾值或者任務(wù)結(jié)束時,管理端回收該資源,當(dāng)該用戶再次發(fā)布計算任務(wù)時,重新為其任務(wù)分配GPU資源;
2)負(fù)載平衡:當(dāng)局部計算壓力過大時,調(diào)整計算負(fù)載,通過動態(tài)調(diào)度時選擇合適的GPU資源來分散計算負(fù)載;
3)故障恢復(fù):當(dāng)出現(xiàn)故障時,將任務(wù)轉(zhuǎn)移到新的可用GPU資源上。