1、GPU概述前端
GPU的英文名稱爲Graphic Processing Unit,GPU中文全稱爲計算機圖形處理器,由1999 年NVIDIA 公司提出。GPU這一律念也是相對於計算機系統中的CPU而言的,因爲人們對圖形的需求愈來愈大,尤爲是在家用系統和遊戲發燒友,而傳統的CPU不能知足現狀,所以須要提供一個專門處理圖形的核心處理器。GPU 做爲硬件顯卡的「心臟」,地位等同於CPU在計算機系統中的做用。同時GPU也能夠用來做爲區分2D硬件顯卡和3D硬件顯卡的重要依據。2D硬件顯卡主要經過使用CPU 來處理特性和3D 圖像,將其稱做「軟加速」。3D 硬件顯卡則是把特性和3D 圖像的處理能力集中到硬件顯卡中,也就是「硬件加速」。目前市場上流行的顯卡多半是由NVIDIA 及ATI這兩家公司生產的。linux
1.一、爲何須要專門出現GPU來處理圖形工做,CPU爲啥不能夠?算法
GPU 是並行編程模型,和CPU的串行編程模型徹底不一樣,致使不少CPU 上優秀的算法都沒法直接映射到GPU 上,而且GPU的結構至關於共享存儲式多處理結構,所以在GPU上設計的並行程序與CPU 上的串行程序具備很大的差別。GPU主要採用立方環境的材質貼圖、硬體T&L、頂點混合、凹凸的映射貼圖和紋理壓縮、雙重紋理四像素256 位的渲染引擎等重要技術。因爲圖形渲染任務具備高度的並行性,所以GPU能夠僅僅經過增長並行處理單元和存儲器控制單元即可有效的提升處理能力和存儲器帶寬。GPU設計目的和CPU大相徑庭,CPU是設計用來處理通用任務,所以具備複雜的控制單元,而GPU主要用來處理計算性強而邏輯性不強的計算任務,GPU中可利用的處理單元能夠更多的做爲執行單元。所以,相較於CPU,GPU在具有大量重複數據集運算和頻繁內存訪問等特色的應用場景中具備無可比擬的優點。編程
1.二、GPU如何使用?後端
使用GPU有兩種方式,一種是開發的應用程序經過通用的圖形庫接口調用GPU設備,另外一種是GPU自身提供API編程接口,應用程序經過GPU提供的API編程接口直接調用GPU設備。緩存
1.2.一、通用圖形庫服務器
經過通用的圖形庫的方式使用GPU,都是經過 OpenGL 或Direct3D這一類現有的圖形函數庫,以編寫渲染語言(shading language)的方法控制 GPU 內部的渲染器(shader)來完成須要的計算。網絡
目前業界公認的圖形編程接口主要有OpenGL和DirectX這兩種接口。OpenGL是當前可用於開發可交互、可移植的2D與3D圖形應用程序的首選環境,也是當前圖形應用最普遍的標準。OpenGL是SGI公司開發的計算機圖形處理系統,是圖形硬件的軟件接口,GL爲圖形庫(Graphics Library),OpenGL應用程序不須要關注所在運行環境所處的操做系統與平臺。只要在任何一個遵循OpenGL標準的環境下都會產生同樣的可視化效果。與OpenGL 相似,DirectX(DirecteXtension)也是一種圖形API。它是由Microsoft建立的多媒體編程接口,並已經成爲微軟視窗的標準。爲適應GPU應用的需求,DirectX則根據GPU新產品功能的擴充與進展及時地定義新的版本,它所提供的功能幾乎與GPU提供的功能同步。數據結構
1.2.二、GPU自身編程接口架構
GPU自身提供的編程接口主要由提供GPU設備的兩家公司提供,分別是括NVIDIA 的CUDA 框架和AMD(ATI)公司於2006年提出了CTM(Close ToMetal)框架(備註,最初是ATI公司生產GPU設備,後被AMD收購)。AMD的CTM框架如今已不在使用,主要是AMD(ATI)於2007 年推出了ATI Stream SDK架構,2008 年AMD(ATI)徹底轉向了公開的OpenCL標準,所以AMD(ATI)公司目前已沒有獨立的、私有的通用計算框架。
CUDA(ComputeUnified Device Architecture)是在2007 年6 月由NVIDIA公司發佈的專用通用計算框架。使用CUDA進行通用計算編程再也不須要藉助圖形學API,而是使用與C語言十分相似的方式進行開發。在CUDA編程模型中,有一個被稱爲主機(Host)的CPU 和若干個被稱做設備(Device)或者協處理器(Co-Processor)的GPU。在該模型中,CPU 和GPU 協同工做,各司其職。CPU負責進行邏輯性較強的事務處理和串行計算,而GPU 則專一於執行線程化的並行處理任務。CPU、GPU各自擁有相互獨立的存儲器地址空間主機端的內存和設備端的顯存。通常採用CUDA框架本身進行編程的都一些大型的應用程序,好比石油勘測、流體力學模擬、分子動力學仿真、生物計算、音視頻編解碼、天文計算等領域。而咱們通常企業級的應用程序因爲開發成本以及兼容性等緣由,大多數都是採用通用的圖形庫來進行開發調用GPU設備。
1.三、GPU如何工做?
GPU 對於通用計算和圖形處理的內部組件主要有兩部分:頂點處理器(vertex processor)和子素處理器(fragment processor)。這種處理器具有流處理機的模式,即不具備大容量的快存/存儲器能夠讀寫,只是直接在芯片上利用臨時寄存器進行流數據的操做。
當GPU 用於圖形處理時,此時GPU 內部的頂點渲染、像素渲染以及幾何渲染操做均可以經過流處理器完成。從圖中能夠看出,此時GPU 內部的全部流處理器至關於一個多核的處理器,數據能夠很方便的在不一樣的流處理器之間的輸入和輸出之間移動,同時GPU分派器和控制邏輯能夠動態的指派流處理器進行相應的頂點,像素,幾何等操做,由於流處理器都是通用的。
2、GPU虛擬化
開始咱們的正題,目前虛擬機系統中的圖形處理方式有三種:一種是採用虛擬顯卡的方式,另外一種是直接採用物理顯卡,最後是採用GPU虛擬化。
2.一、虛擬顯卡
第一種採用虛擬顯卡是如今主流的虛擬化系統的選擇,由於專業的顯卡硬件價格不菲。目前採用虛擬顯卡的這些技術包括:虛擬網絡計算機VNC(Virtual Network Computing),Xen 虛擬幀緩存,VMware虛擬圖形顯示處理器GPU(Graphics Processing Unit)以及獨立於虛擬機管理器的圖形加速系統VMGL(VMM-Independent Graphics Acceleration)。
VNC(VirtualNetwork Computing)基本上是屬於一種顯示系統,也就是說它能將完整的窗口界面經過網絡,傳輸到另外一臺計算機的屏幕上。Windows 服務器中包含的"Terminal Server"便是屬於這種原理的設計。VNC 是由AT&T 實驗室所開發的,其採用GPL(General PublicLicense)受權條款,任何人均可免費取得該軟件。VNC軟件要由兩個部分組成:VNC server 及VNC viewer。用戶需先將VNC server安裝在被遠程操控的計算機上後,才能在主控端執行VNC viewer 進行遠程操控。
XEN虛擬幀緩存是指XEN提供的一個虛擬的顯示設備。該虛擬顯示設備採用特權域的VNC服務器,所以該虛擬顯示設備具備類似的VNC接口。客戶機在XEN虛擬幀緩存中寫入數據,而後經過VNC 協議來傳輸已修改的圖片,最後通知前端進行相應區域的更新。這個虛擬幀緩存設備的源碼是來自開源的Qemu。咱們在XenServer上看見虛擬機的操做系統桌面界面,便是這種技術的顯示。
虛擬網絡計算機VNC 和XEN 虛擬幀緩存這兩種模式至今在虛擬機中仍未提供必定的硬件圖形加速能力。因爲目前仍沒有一個機制能使虛擬機進行訪問圖形硬件的能力,所以這些虛擬的顯示設備都是經過使用CPU以及內存的方式對圖形數據進行相應處理。並無採用物理顯示設備的功能。然而VMGL這種模式已經實現了這種機制,這個機制一般被稱爲前端-後端虛擬化機制(front-end virtualization)。VMGL這種模式採用這個機制將須要圖形處理的數據發送到一個擁有硬件圖形加速功能的虛擬監控機上進行相應的圖形數據處理。目前存在的比較主流可用於GPU應用程序開發的圖形處理接口有兩類:OpenGL 和Direct3D。在這兩類圖形處理接口中,OpenGL是惟一一類可以在主流操做系統中跨平臺操做的圖形API接口。在虛擬機平臺中,VMGL是首個針對OpenGL API進行虛擬化的項目。VMGL的工做原理是,它在客戶端操做系統中部署了一個僞庫(Fake library)用來取代標準的OPENGL 庫,僞庫(Fake library)擁有與標準的OPENG庫相同的接口,在客戶端操做系統中的僞庫也實現了指向遠程服務器的宿主機操做系統的遠程調用。這樣一來,全部的本地OPENGL調用都將被解釋爲對遠程服務器的一次服務請求,遠程服務器的宿主機操做系統擁有真正的OPENGL庫、顯卡驅動和物理硬件GPU,它負責完成OPENGL請求並將執行結果顯示到屏幕上。因爲VMGL在整個過程操做中都是徹底透明的,所以調用OPENGL的應用程序不須要修改源代碼也不須要進行二進制改寫,無需爲虛擬機平臺做任何改動。
2.二、顯卡直通
顯卡直通也叫作顯卡穿透(pass-through),是指繞過虛擬機管理系統,將GPU 單獨分配給某一虛擬機,只有該虛擬機擁有使用GPU的權限,這種獨佔設備的方法分配方式保存了GPU的完整性和獨立性,在性能方面與非虛擬化條件下接近,且能夠用來進行通用計算。可是顯卡直通須要利用顯卡的一些特殊細節,同時兼容性差,僅在部分GPU 中設備可使用。Xen 4.0增長了VGA passthrough技術,所以XenServer也擁有了該技術,XenServer的Passthrough 就是利用英特爾設備虛擬化(Intel VT-d)技術將顯示設備暴露給某一個客戶虛擬機,不只其它客戶虛擬機不能訪問,就連宿主虛擬機也失去了使用該GPU的能力。它在客戶虛擬機中實現了顯卡的一些特殊細節,如VGA BIOS、文本模式、IO 端口、內存映射、VESA模式等,以支持直接訪問。使用XenServer的 VGA Passthrough 技術的GPU執行效率高,功能全,但只能被單一系統獨佔使用,失去了設備複用的功能。VMwareESX 中包括一個VMDirectPath I/O框架,使用該技術也能夠將咱們的顯卡設備直通給某一虛擬機進行使用。XenServer和VMware使用的是不一樣的技術可是實現的效果都是同樣的,即將物理顯卡設備直通給其中的某一虛擬機使用,以達到虛擬機進行3D顯示和渲染的效果。
因爲顯卡直通其實是由客戶操做系統使用原生驅動和硬件,缺乏必要的中間層來跟蹤和維護GPU 狀態,它不支持實時遷移等虛擬機高級特性。如XenServer Passthrough禁止執行save/restore/migration 等操做。VMware的虛擬機中,一旦開啓VMDirectPath I/O功能,其對應的虛擬機將失去執行掛起/恢復、實時遷移的能力。
2.三、顯卡虛擬化(GPU虛擬化)
顯卡虛擬化就是將顯卡進行切片,並將這些顯卡時間片分配給虛擬機使用的過程。因爲支持顯卡虛擬化的顯卡通常能夠根據須要切分紅不一樣的規格的時間片,所以能夠分配給多臺虛擬機使用。其實現原理其實就是利用應用層接口虛擬化(API remoting),API重定向是指在應用層進行攔截與GPU相關的應用程序編程接口(Application ProgrammingInterface,API),經過重定向(仍然使用GPU)的方式完成相應功能,再將執行結果返回應用程序。
咱們如今使用3D桌面虛擬化解決方案中,大部分是使用NVIDIA公司提供的顯卡虛擬化技術,便是vCUDA(virtual CUDA)技術,前面咱們說過了CUDA框架。vCUDA採用在用戶層攔截和重定向CUDA API的方法,在虛擬機中創建物理GPU的邏輯映像――虛擬GPU,實現GPU資源的細粒度劃分、重組和再利用,支持多機併發、掛起恢復等虛擬機高級特性。
其vCUDA的實現原理大概以下:包括三個模塊:CUDA客戶端、CUDA服務端和CUDA管理端。以XenServer爲例,在物理硬件資源上運行着一個VMM用於向上提供硬件映像,在VMM上運行着若干個虛擬機。其中一個虛擬機爲特權虛擬機(Host VM),即爲XenServer中的Domain 0,在虛擬機中運行的操做系統稱爲Host OS。Host OS可以直接控制硬件,系統內安裝着原生的CUDA庫以及GPU驅動,使得Host OS能夠直接訪問GPU和使用CUDA。其它的虛擬機屬於非特權虛擬機(Guest VM),其上運行的操做系統(Guest OS)不能直接操縱GPU。在這裏咱們將CUDA客戶端稱之爲客戶端驅動,CUDA服務端稱之爲宿主機的驅動,CUDA管理端稱之爲GPU管理器。
2.3.一、客戶端
客戶端驅動其實質就是咱們安裝在虛擬機好比Windows 7上的顯卡驅動程序。主要的功能是在用戶層提供針對CUDA API的庫以及一個維護CUDA相關軟硬件狀態的虛擬GPU(vGPU)。客戶端驅動直接面向CUDA應用程序,其做用包括:
1)攔截應用程序中CUDA API調用;
2)選擇通訊策略,爲虛擬化提供更高層語義的支持;
3)對調用的接口和參數進行封裝、編碼;
4)對服務端返回的數據進行解碼,並返回給應用。
此外,客戶端驅動在第一個API調用到來以前,首先到管理端索取GPU資源。每個獨立的調用過程都必須到宿主管理端驅動申請資源,以實現對GPU資源和任務的實時調度。
此外,客戶端驅動同時設置了vGPU用來維護與顯卡相關的軟硬件狀態。vGPU自己實質上僅僅是一個鍵值對的數據結構,在其中存儲了當前使用的地址空間、顯存對象、內存對象等,同時記錄了API的調用次序。當計算結果返回時,客戶端驅動會根據結果更新vGPU。
2.3.二、服務器端
服務端組件位於特權虛擬機(XenServer術語:特權域)中的應用層。特權虛擬機能夠直接與硬件交互,所以服務端組件能夠直接操縱物理GPU來完成通用計算任務。
服務端面向真實GPU,其做用包括:
1)接收客戶端的數據報,並解析出調用和參數;
2)對調用和參數進行審覈;
3)利用CUDA和物理GPU計算審覈經過的調用;
4)將結果編碼,並返回給客戶端;
5)對計算系統中支持CUDA的GPU進行管理。
此外,服務端運行的第一個任務是將自身支持CUDA的GPU設備的信息註冊到管理端中。服務端應對客戶端的請求時,爲每一個應用分配獨立的服務線程。服務端統一管理本地GPU資源,按照必定的策略提供GPU資源,並將因爲API調用修改的相關軟硬件狀態更新至vGPU。
2.3.三、管理端
管理端組件位於特權域,在實現CUDA編程接口虛擬化的基礎上,將GPU強大的計算能力和計算資源在更高的邏輯層次上進行隔離、劃分、調度。在CUDA服務端使用計算線程和工做線程在必定程度上使同在一個物理機上的GPU間負載均衡,設置CUDA管理端組件在更高的邏輯層次上進行負載均衡,使在同一個GPU虛擬集羣中的GPU負載均衡。管理端組件
調度的原則是儘可能使在同一個物理機上的GPU需求自給,若是該物理機上具有知足條件的GPU資源,在通常狀況下,該物理機上的虛擬機的GPU需求都重定向到該物理機的CUDA服務端。
理端對GPU資源進行統一管理,採用集中、靈活的機制,實現:
1)動態調度:當用戶所佔資源空閒時間超過必定閾值或者任務結束時,管理端回收該資源,當該用戶再次發佈計算任務時,從新爲其任務分配GPU資源;
2)負載平衡:當局部計算壓力過大時,調整計算負載,經過動態調度時選擇合適的GPU資源來分散計算負載;
3)故障恢復:當出現故障時,將任務轉移到新的可用GPU資源上。
備註:一些相關驅動
Nvidia驅動: NVIDIA-Linux-x86_64-390.46.run
官網下載地址: http://www.nvidia.cn/Download/index.aspx?lang=cn (選好本身的GPU型號以後能夠直接下載)
CUDA包:cuda_8.0.61_375.26_linux.run
官網下載地址: https://developer.nvidia.com/cuda-toolkit-archive (下載時須要註冊帳號)
文件太大發不上來,請自行下載
CUDNN包:cudnn-8.0-linux-x64-v6.0.tgz
官網下載地址: https://developer.nvidia.com/rdp/cudnn-archive(下載時須要註冊帳號)