本發(fā)明涉及虛擬機(jī)技術(shù)領(lǐng)域,尤其涉及一種基于半虛擬化的通用計(jì)算方法及系統(tǒng)。
背景技術(shù):
在大數(shù)據(jù)背景下,對(duì)于計(jì)算機(jī)的通用計(jì)算能力有越來(lái)越多的要求,通用計(jì)算是由GPU提供,主要有OPENCL和CUDA兩種實(shí)現(xiàn),目前的虛擬化方案沒(méi)有高效的通用計(jì)算模塊的虛擬化方案。目前比較成熟的兩種實(shí)現(xiàn):一是XEN使用GRID卡,GRID卡是NVIDIA的專(zhuān)用顯卡,價(jià)格昂貴,虛擬化成本很高;二是將單個(gè)普通GPU passthrough,這樣每一個(gè)VM都要獨(dú)占一個(gè)GPU進(jìn)行通用計(jì)算,虛擬化成本也很高。
所謂通用計(jì)算,general purpose computing,是相對(duì)于圖形計(jì)算而言的。由于圖形處理器在歷史上是專(zhuān)門(mén)為圖形應(yīng)用而設(shè)計(jì)的,因而只能作圖形計(jì)算,在軟件層只擁有圖形接口,如OPENGL、DIRECT3D。但隨著GPU處理能力的增強(qiáng),工業(yè)界和學(xué)術(shù)界發(fā)現(xiàn)它可以處理圖形之外的計(jì)算,這種計(jì)算形式由于相對(duì)圖形這一單一應(yīng)用而言顯得更加一般、通用,所以被稱(chēng)為通用計(jì)算,相應(yīng)的接口被稱(chēng)為通用計(jì)算接口,目前的代表有CUDA、OPENCL等。
最好的方法是可以多個(gè)VM共用一個(gè)GPU并提供通用計(jì)算能力。如果按照目前全虛擬化方向,需要模擬完整GPU設(shè)備,使用GPU廠家提供的驅(qū)動(dòng),但是有兩個(gè)局限性:一是全虛擬化效率低;二是GPU實(shí)現(xiàn)復(fù)雜,還需要有對(duì)應(yīng)的GPU設(shè)計(jì)手冊(cè)可參考。另一種可用的思路是使用半虛擬化,使用自定義的驅(qū)動(dòng)模擬GPU設(shè)備,將用戶(hù)態(tài)發(fā)送到內(nèi)核態(tài)的通用計(jì)算指令截獲,在宿主機(jī)中進(jìn)行相應(yīng)操作。
技術(shù)實(shí)現(xiàn)要素:
鑒于此,本發(fā)明提供的一種基于半虛擬化的通用計(jì)算方法及系統(tǒng),在多個(gè)虛擬機(jī)中配置多個(gè)虛擬GPU,生成通用計(jì)算命令,并在內(nèi)核中截獲通用計(jì)算命令發(fā)送到物理機(jī)中,在物理機(jī)中實(shí)現(xiàn)實(shí)際通用計(jì)算后將結(jié)果返回虛擬機(jī),實(shí)現(xiàn)虛擬機(jī)通用計(jì)算。
為了達(dá)到上述目的,本發(fā)明是通過(guò)以下技術(shù)方案實(shí)現(xiàn)的:
本發(fā)明提供一種基于半虛擬化的通用計(jì)算方法,包括:
將多個(gè)虛擬機(jī)對(duì)應(yīng)于一個(gè)物理機(jī);
配置多個(gè)虛擬GPU分別對(duì)應(yīng)多個(gè)虛擬機(jī);
將虛擬GPU的通用計(jì)算命令發(fā)送給物理機(jī)的物理GPU;
物理GPU將通用計(jì)算結(jié)果返回給虛擬機(jī)。
進(jìn)一步地,配置多個(gè)虛擬GPU分別對(duì)應(yīng)多個(gè)虛擬機(jī),包括:
在每個(gè)虛擬機(jī)中,使用前端驅(qū)動(dòng)創(chuàng)建虛擬GPU。
優(yōu)選地,所述前端驅(qū)動(dòng)為virtio驅(qū)動(dòng)。
進(jìn)一步地,將虛擬GPU的通用計(jì)算命令發(fā)送給物理機(jī)的物理GPU,包括:
在虛擬機(jī)內(nèi)核態(tài)中截獲通用計(jì)算命令;
通過(guò)virtio queue將所截獲的通用計(jì)算命令發(fā)送到物理機(jī)的虛擬化程序;
虛擬化程序調(diào)用物理GPU接收通用計(jì)算命令。
進(jìn)一步地,在虛擬機(jī)內(nèi)核態(tài)中截獲通用計(jì)算命令,包括:通過(guò)驅(qū)動(dòng)接口在虛擬機(jī)內(nèi)核態(tài)中截獲通用計(jì)算命令。
進(jìn)一步地,物理GPU將通用計(jì)算結(jié)果返回給虛擬機(jī),包括:物理GPU將通用計(jì)算結(jié)果通過(guò)virtio queue返回給虛擬機(jī)。
本發(fā)明還提供一種基于半虛擬化的通用計(jì)算系統(tǒng),包括一個(gè)物理機(jī),在物理機(jī)下配置多個(gè)虛擬機(jī),虛擬機(jī)中設(shè)有對(duì)應(yīng)的前端驅(qū)動(dòng)模塊和驅(qū)動(dòng)接口,其中:
前端驅(qū)動(dòng)模塊用于創(chuàng)建虛擬GPU;
虛擬GPU用于生成通用計(jì)算命令;
驅(qū)動(dòng)接口用于在虛擬機(jī)內(nèi)核態(tài)中截獲通用計(jì)算命令;
進(jìn)一步地,所述物理機(jī)包括虛擬化程序模塊和一個(gè)物理GPU,虛擬化程序模塊用于接收虛擬機(jī)傳來(lái)的通用計(jì)算命令,并調(diào)用物理機(jī)中的物理GPU處理通用計(jì)算命令;物理GPU用于實(shí)現(xiàn)虛擬機(jī)發(fā)送來(lái)的通用計(jì)算命令,并輸出計(jì)算結(jié)果。
優(yōu)選地,所述前端驅(qū)動(dòng)模塊通過(guò)virtio驅(qū)動(dòng)創(chuàng)建虛擬GPU。
優(yōu)選地,所述虛擬機(jī)通過(guò)virtio queue將通用計(jì)算命令發(fā)送到物理機(jī),所述物理機(jī)通過(guò)virtio queue將通用計(jì)算結(jié)果返回給虛擬機(jī)。
本發(fā)明提供一種基于半虛擬化的通用計(jì)算方法,有益效果如下:
提供了一種半虛擬化方案,在多個(gè)虛擬機(jī)中配置多個(gè)虛擬GPU,生成通用計(jì)算命令,并在內(nèi)核中截獲通用計(jì)算命令發(fā)送到物理機(jī)中,在物理機(jī)中實(shí)現(xiàn)實(shí)際通用計(jì)算后將結(jié)果返回虛擬機(jī),實(shí)現(xiàn)虛擬機(jī)通用計(jì)算的方法。同時(shí),將多個(gè)虛擬機(jī)共用同一個(gè)物理GPU,相當(dāng)于多個(gè)進(jìn)程操作同一個(gè)物理GPU,降低虛擬化成本,使用半虛擬化的方式提高虛擬機(jī)的性能。
本發(fā)明還提供一種基于半虛擬化的通用計(jì)算系統(tǒng),其有益效果與基于半虛擬化的通用計(jì)算方法類(lèi)似,不再贅述。
附圖說(shuō)明:
圖1為本發(fā)明實(shí)施例所提供的基于半虛擬化的通用計(jì)算方法流程示意圖;
圖2為本發(fā)明實(shí)施例所提供的基于半虛擬化的通用計(jì)算系統(tǒng)框架示意圖;
具體實(shí)施方式:
為了便于理解,對(duì)本發(fā)明中出現(xiàn)的部分名詞作以下解釋說(shuō)明:
虛擬機(jī):即VM,是指一種特殊的軟件,可以在計(jì)算機(jī)平臺(tái)和終端用戶(hù)之間創(chuàng)建一種環(huán)境,而終端用戶(hù)則是基于這個(gè)軟件所創(chuàng)建的環(huán)境來(lái)操作軟件。在計(jì)算機(jī)科學(xué)中,虛擬機(jī)是指可以像真實(shí)機(jī)器一樣運(yùn)行程序的計(jì)算機(jī)的軟件實(shí)現(xiàn)。
物理機(jī):在本發(fā)明中,物理機(jī)與虛擬機(jī)對(duì)應(yīng),作為虛擬機(jī)的宿主機(jī),一般指實(shí)體計(jì)算機(jī)。
virtio :是指半虛擬化 hypervisor 中位于設(shè)備之上的抽象層。
virtio queue:virtio是通過(guò)使用virtqueue來(lái)實(shí)現(xiàn)其I/O機(jī)制的,每個(gè) virtio queue就是一個(gè)承載大量數(shù)據(jù)的queue。
依照附圖詳細(xì)說(shuō)明關(guān)于本發(fā)明的示例性實(shí)施例。
本實(shí)施例提供一種基于半虛擬化的通用計(jì)算方法,通過(guò)半虛擬化方法在虛擬機(jī)中創(chuàng)建虛擬GPU設(shè)備,將對(duì)應(yīng)的通用計(jì)算命令截獲轉(zhuǎn)發(fā)到宿主機(jī)的物理GPU中,在虛擬機(jī)中實(shí)現(xiàn)通用計(jì)算,包括以下步驟:
將多個(gè)虛擬機(jī)對(duì)應(yīng)于一個(gè)物理機(jī);
配置多個(gè)虛擬GPU分別對(duì)應(yīng)多個(gè)虛擬機(jī);
將虛擬GPU的通用計(jì)算命令發(fā)送給物理機(jī)的物理GPU;
物理GPU將通用計(jì)算結(jié)果返回給虛擬機(jī)。
請(qǐng)參考圖1,圖1為本發(fā)明實(shí)施例所提供的基于半虛擬化的通用計(jì)算方法流程示意圖;本實(shí)施例提供一種基于半虛擬化的通用計(jì)算方法,包括:
步驟S101、將多個(gè)虛擬機(jī)對(duì)應(yīng)于一個(gè)物理機(jī);
步驟S102、在每個(gè)虛擬機(jī)中,使用前端驅(qū)動(dòng)創(chuàng)建虛擬GPU;
其中,在每個(gè)虛擬機(jī)中均使用前端驅(qū)動(dòng)創(chuàng)建一個(gè)虛擬GPU,虛擬機(jī)在運(yùn)算的過(guò)程中,通過(guò)虛擬GPU生成通用計(jì)算命令,因?yàn)橐粋€(gè)物理機(jī)下設(shè)有多個(gè)虛擬機(jī),通過(guò)調(diào)用物理機(jī)中的物理GPU,形成了一個(gè)物理GPU對(duì)應(yīng)多個(gè)虛擬GPU的整體框架,多個(gè)虛擬GPU在運(yùn)行時(shí)生成多個(gè)通用計(jì)算命令,這些通用計(jì)算命令可能為一種,也可能為多種。
在本實(shí)施例中,前端驅(qū)動(dòng)為virtio驅(qū)動(dòng),即前端驅(qū)動(dòng)是基于virtio的驅(qū)動(dòng),由此創(chuàng)建的虛擬GPU可表示為virtio GPU。
作為一種可實(shí)施方式,前端驅(qū)動(dòng)可選取基于xen或VMware的驅(qū)動(dòng)程序或工具。
步驟S103、在虛擬機(jī)內(nèi)核態(tài)中截獲通用計(jì)算命令;
多個(gè)虛擬機(jī)的虛擬GPU生成通用計(jì)算命令,通過(guò)驅(qū)動(dòng)接口在虛擬機(jī)內(nèi)核態(tài)中截獲這些通用計(jì)算命令,內(nèi)核態(tài)的接口較少,只要實(shí)現(xiàn)內(nèi)核態(tài)對(duì)應(yīng)的幾個(gè)接口就可以截獲全部通用計(jì)算命令。
步驟S104、通過(guò)virtio queue將所截獲的通用計(jì)算命令發(fā)送到物理機(jī)的虛擬化程序;在本實(shí)施例中,虛擬GPU是基于virtio的驅(qū)動(dòng)創(chuàng)建出來(lái)的,之后將通用計(jì)算命令通過(guò)virtio queue傳遞到物理機(jī)的虛擬化程序,物理機(jī)中的虛擬化程序?qū)⑻幚磉@些通用計(jì)算命令,virtio queue中可以包括大量的數(shù)據(jù),因此保證了通用計(jì)算命令的傳輸能力;同時(shí)virtio queue作為一種連接虛擬機(jī)和物理機(jī)的通道,傳輸通用計(jì)算命令。
步驟S105、虛擬化程序調(diào)用物理GPU接收通用計(jì)算命令;
步驟S106、物理GPU將通用計(jì)算結(jié)果通過(guò)virtio queue返回給虛擬機(jī);
在物理機(jī)中可以直接操作物理GPU設(shè)備,在虛擬機(jī)中的操作虛擬GPU的命令都可以對(duì)應(yīng)到物理機(jī)的物理GPU上,將對(duì)應(yīng)的通用計(jì)算命令在物理GPU上實(shí)現(xiàn)后將結(jié)果反饋給虛擬機(jī),多個(gè)虛擬機(jī)可共用同一個(gè)物理GPU,相當(dāng)于多個(gè)進(jìn)程操作同一個(gè)物理GPU,實(shí)現(xiàn)通用計(jì)算。
本實(shí)施例提供一種基于半虛擬化的通用計(jì)算系統(tǒng),包括一個(gè)物理機(jī),在物理機(jī)下配置多個(gè)虛擬機(jī),虛擬機(jī)中設(shè)有對(duì)應(yīng)的前端驅(qū)動(dòng)模塊和驅(qū)動(dòng)接口,其中:
前端驅(qū)動(dòng)模塊用于創(chuàng)建虛擬GPU;
虛擬GPU用于生成通用計(jì)算命令;
驅(qū)動(dòng)接口用于在虛擬機(jī)內(nèi)核態(tài)中截獲通用計(jì)算命令;
請(qǐng)參考圖2,圖2為本發(fā)明實(shí)施例所提供的基于半虛擬化的通用計(jì)算系統(tǒng)框架示意圖;本實(shí)施例提供一種基于半虛擬化的通用計(jì)算系統(tǒng),包括一個(gè)物理機(jī),在物理機(jī)下配置多個(gè)虛擬機(jī),虛擬機(jī)中設(shè)有對(duì)應(yīng)的前端驅(qū)動(dòng)模塊和驅(qū)動(dòng)接口,其中:
前端驅(qū)動(dòng)模塊用于創(chuàng)建虛擬GPU;
虛擬GPU用于生成通用計(jì)算命令;
驅(qū)動(dòng)接口用于在虛擬機(jī)內(nèi)核態(tài)中截獲通用計(jì)算命令;
進(jìn)一步地,所述物理機(jī)包括虛擬化程序模塊和一個(gè)物理GPU,虛擬化程序模塊用于接收虛擬機(jī)傳來(lái)的通用計(jì)算命令,并調(diào)用物理機(jī)中的物理GPU處理通用計(jì)算命令;物理GPU用于實(shí)現(xiàn)虛擬機(jī)發(fā)送來(lái)的通用計(jì)算命令,并輸出計(jì)算結(jié)果。
優(yōu)選地,所述前端驅(qū)動(dòng)模塊通過(guò)virtio驅(qū)動(dòng)創(chuàng)建虛擬GPU。
優(yōu)選地,所述虛擬機(jī)通過(guò)virtio queue將通用計(jì)算命令發(fā)送到物理機(jī),所述物理機(jī)通過(guò)virtio queue將通用計(jì)算結(jié)果返回給虛擬機(jī)。
以上所述僅為本發(fā)明示意性的具體實(shí)施方式,并非用以限定本發(fā)明的范圍,任何本領(lǐng)域的技術(shù)人員在不脫離本發(fā)明構(gòu)思和原則的前提下所做出的等同變化與修改,均應(yīng)屬于本發(fā)明保護(hù)的范圍。