一種基于推遲提交的gpu虛擬化優(yōu)化方法
【專利摘要】本發(fā)明公開了一種基于推遲提交的GPU虛擬化優(yōu)化方法。本方法為:1)客戶機上的GPU虛擬化框架前端讀入一待執(zhí)行CUDA應(yīng)用程序的二進制文件,查找并標(biāo)記可推遲提交的循環(huán);2)前端執(zhí)行到可推遲提交的循環(huán)部分時,直到該循環(huán)結(jié)束之前,緩存所有的CUDA函數(shù)調(diào)用信息及其依賴關(guān)系,跳過該函數(shù)調(diào)用的執(zhí)行,然后在該循環(huán)結(jié)束之后將該緩存信息一次發(fā)送到宿主機上的GPU虛擬化框架后端;3)后端根據(jù)該緩存信息重新構(gòu)建函數(shù)調(diào)用并執(zhí)行,然后將所有任務(wù)執(zhí)行結(jié)果打包一次發(fā)送回前端;可推遲提交的循環(huán)指不去執(zhí)行循環(huán)中的CUDA函數(shù)調(diào)用,循環(huán)依然可以正確執(zhí)行。本發(fā)明減少了前后端通信的次數(shù),從而對GPU虛擬化的性能進行優(yōu)化。
【專利說明】一種基于推遲提交的GPU虛擬化優(yōu)化方法
【技術(shù)領(lǐng)域】
[0001]本發(fā)明屬于虛擬化技術(shù),涉及一種GPU虛擬化優(yōu)化方法,尤其涉及一種基于推遲提交的GPU虛擬化優(yōu)化方法。
【背景技術(shù)】
[0002]GPU具有處理能力強、高存儲器帶寬、低成本等特點,不僅能很好地進行圖形處理,在高性能計算方面也具有很強優(yōu)勢。GPU因為其強大的并行計算能力,近年來被廣泛應(yīng)用到科學(xué)計算、生物信息、氣候預(yù)報、工程模擬等領(lǐng)域,發(fā)揮了巨大的作用。
[0003]虛擬化技術(shù)具有資源共享、在線遷移、進程隔離等優(yōu)點,在集群、云計算方面起到了很大作用。它不僅節(jié)約了計算資源,也提高了系統(tǒng)的穩(wěn)定性和可靠性。由于虛擬化技術(shù)具有很多優(yōu)勢,近年來被廣泛應(yīng)用到各個領(lǐng)域,如資源整合、改善軟件生命周期、數(shù)據(jù)中心、云計算等。
[0004]由于虛擬化技術(shù)和GPU各自的優(yōu)勢,越來越多的研究者在虛擬化環(huán)境中利用GPU來進行高性能計算。虛擬化技術(shù)使得程序和軟件運行在一個虛擬出來的計算環(huán)境中,而非真實的計算環(huán)境。在這種環(huán)境中GPU不便被虛擬機直接訪問。再加上GPU廠商對于GPU硬件規(guī)范保密,因此虛擬化環(huán)境中GPU的使用和管理面臨很大挑戰(zhàn)。
[0005]目前有研究者通過遠程API的方法開發(fā)出一些GPU虛擬化框架(如圖1),使得在虛擬機中可以訪問GPU,這里選擇CUDA應(yīng)用程序作為應(yīng)用的例子。遠程API方法的GPU虛擬化框架分為前端和后端兩個部分。前端以動態(tài)庫的形式被客戶機中的CUDA程序加載,這樣在前端可以截獲客戶機中的所有對于CUDA API的調(diào)用。后端則是運行在宿主機中的一個樁模塊,負責(zé)接收前端截獲的調(diào)用信息。在這種機制下,首先由前端將虛擬機中的CUDA函數(shù)重寫,將調(diào)用時的函數(shù)名稱和相應(yīng)參數(shù)傳遞給后端。后端為前端每個CUDA應(yīng)用程序創(chuàng)建一個進程,在該進程中轉(zhuǎn)換來自前端重寫后的CUDA函數(shù),獲得函數(shù)的名稱和參數(shù)。最后通過設(shè)備驅(qū)動,使用宿主機上真實的GPU硬件設(shè)備執(zhí)行相應(yīng)的函數(shù)調(diào)用。最后將函數(shù)的執(zhí)行結(jié)果返回給前端,這樣前端的CUDA程序就可以獲得正確的執(zhí)行結(jié)果。很明顯可以看到,這種方法需要進行大量虛擬機與宿主機之間的數(shù)據(jù)傳輸,所有計算所需要的數(shù)據(jù)信息都需要傳輸?shù)胶蠖瞬拍苓M行計算,導(dǎo)致GPU虛擬化的性能嚴(yán)重下降。在CUDA程序規(guī)模較小時,這些GPU虛擬化框架的性能下降并不太明顯。但在進行實際應(yīng)用中的高性能計算時性能下降非常明顯。某些CUDA程序在虛擬機中的運行時間幾乎是在宿主機中運行時間的17倍左右,無法達到實際應(yīng)用的性能要求。
【發(fā)明內(nèi)容】
[0006]本發(fā)明主要針對基于遠程API的GPU虛擬化框架中數(shù)據(jù)傳輸量大而且頻繁的問題,目的是要在現(xiàn)有的GPU虛擬化框架環(huán)境的基礎(chǔ)上,提出一種基于推遲提交策略的優(yōu)化方法,盡可能多的減少重復(fù)或冗余的數(shù)據(jù)傳輸。該方法檢測客戶機中的CUDA應(yīng)用程序,從中找到可以推遲提交的部分,從而使得程序在執(zhí)行時避免頻繁,重復(fù)的傳輸大量數(shù)據(jù),以減少數(shù)據(jù)傳輸帶來的開銷,從而提高GPU虛擬化的性能。此項發(fā)明可以保證映射之后程序可以準(zhǔn)確無誤的執(zhí)行,保持和未修改之前一樣的行為。同時還能保證效率高于原有框架。
[0007]本發(fā)明的技術(shù)方案為:
[0008]一種基于推遲提交的GPU虛擬化優(yōu)化方法,其步驟為:
[0009]I)客戶機上的GPU虛擬化框架前端調(diào)用二進制分析模塊讀入一待執(zhí)行CUDA應(yīng)用程序的二進制文件,在該二進制文件中查找并標(biāo)記可推遲提交的循環(huán);
[0010]2) GPU虛擬化框架前端執(zhí)行該CUDA應(yīng)用程序,當(dāng)執(zhí)行到可推遲提交的循環(huán)部分時,直到該循環(huán)結(jié)束之前,緩存所有的CUDA函數(shù)調(diào)用信息及其依賴關(guān)系,跳過該函數(shù)調(diào)用的執(zhí)行,然后在該循環(huán)結(jié)束之后將該緩存信息一次發(fā)送到宿主機上的GPU虛擬化框架后端;
[0011]3)宿主機上的GPU虛擬化框架后端根據(jù)該緩存信息重新構(gòu)建函數(shù)調(diào)用并執(zhí)行,然后將所有任務(wù)執(zhí)行結(jié)果打包一次發(fā)送回客戶機上的GPU虛擬化框架前端;
[0012]其中,所述可推遲提交的循環(huán)是指循環(huán)中包含若干CUDA函數(shù)調(diào)用,但在該循環(huán)中不去執(zhí)行這些CUDA函數(shù)調(diào)用,該循環(huán)依然可以正確執(zhí)行的循環(huán)。
[0013]進一步的,查找所述可推遲提交的循環(huán)的方法為:
[0014]I) 二進制分析模塊對該二進制文件進行反匯編,然后為其中的每一用戶級函數(shù)建立一控制流圖;
[0015]2)在每一控制流圖中找到所有的循環(huán);
[0016]3)在每一自然循環(huán)中找到所有的函數(shù)調(diào)用點,識別出所有包含CUDA函數(shù)調(diào)用的循環(huán);
[0017]4)對每一 CUDA函數(shù)調(diào)用的循環(huán)做寄存器級別的變量活性分析和數(shù)據(jù)相關(guān)性分析,根據(jù)每一 CUDA函數(shù)調(diào)用信息及其依賴關(guān)系確定出所述可推遲提交的循環(huán)。
[0018]進一步的,所述可推遲提交的循環(huán)包括三類;其中,第一類循環(huán)為:CUDA函數(shù)調(diào)用的參數(shù)不依賴于循環(huán)變量,且該參數(shù)不依賴循環(huán)中的其他變量,調(diào)用的結(jié)果不影響循環(huán)中其他語句的正常執(zhí)行;第二類循環(huán)為=CUDA函數(shù)調(diào)用的參數(shù)依賴于循環(huán)變量,但該參數(shù)不依賴循環(huán)中的其他變量,調(diào)用的結(jié)果不影響循環(huán)中其他語句的正常執(zhí)行;第三類循環(huán)為:CUDA函數(shù)調(diào)用的參數(shù)僅依賴于之前的CUDA函數(shù)調(diào)用產(chǎn)生的結(jié)果。
[0019]進一步的,所述二進制分析模塊靜態(tài)或動態(tài)的在CUDA程序的二進制文件中插入變量來標(biāo)記所述可推遲提交的循環(huán)的類別。
[0020]進一步的,對于第一類循環(huán),所述緩存的信息包括循環(huán)初值,步長和次數(shù),CUDA函數(shù)調(diào)用的參數(shù)、函數(shù)名,參數(shù)信息及數(shù)據(jù)依賴關(guān)系;對于第二類循環(huán),所述緩存的信息包括循環(huán)初值,步長和次數(shù),CUDA函數(shù)調(diào)用的參數(shù)、函數(shù)名、循環(huán)變量以及依賴于循環(huán)變量的參數(shù);對于所述第三類循環(huán),所述緩存的信息包括循環(huán)初值,步長和次數(shù),相互依賴的函數(shù)、依賴其他變量或參數(shù)的參數(shù)之間的依賴關(guān)系。
[0021]進一步的,對于第一類循環(huán),GPU虛擬化框架后端根據(jù)該緩存信息重新構(gòu)建函數(shù)調(diào)用的方法為:首先根據(jù)GPU虛擬化框架前端發(fā)送來的循環(huán)初值,步長和次數(shù),建立一個循環(huán);然后根據(jù)發(fā)送過來的函數(shù)名在CUDA庫中找到對應(yīng)函數(shù);然后根據(jù)發(fā)送過來的參數(shù)和數(shù)據(jù)重新構(gòu)建函數(shù)調(diào)用。
[0022]進一步的,對于第二類循環(huán),GPU虛擬化框架后端根據(jù)該緩存信息重新構(gòu)建函數(shù)調(diào)用的方法為:首先根據(jù)GPU虛擬化框架前端發(fā)送來的循環(huán)初值,步長和次數(shù),建立一個循環(huán);然后根據(jù)發(fā)送過來的函數(shù)名在CUDA庫中找到對應(yīng)函數(shù),將循環(huán)變量替換為GPU虛擬化框架后端的循環(huán)變量;然后根據(jù)發(fā)送過來的參數(shù)和數(shù)據(jù)重新構(gòu)建函數(shù)調(diào)用。
[0023]進一步的,對于第三類循環(huán),GPU虛擬化框架后端根據(jù)該緩存信息重新構(gòu)建函數(shù)調(diào)用的方法為:首先根據(jù)GPU虛擬化框架前端發(fā)送來的循環(huán)初值,步長和次數(shù),建立一個循環(huán);然后根據(jù)發(fā)送過來的函數(shù)名在CUDA庫中找到對應(yīng)函數(shù),根據(jù)參數(shù)的依賴關(guān)系重新計算參數(shù)的表達式,還原函數(shù)調(diào)用;然后根據(jù)發(fā)送過來的參數(shù)和數(shù)據(jù)重新構(gòu)建函數(shù)調(diào)用。
[0024]進一步的,利用dyninst工具讀取該二進制文件,然后反匯編,最后靜態(tài)或動態(tài)的為每一個函數(shù)建立一控制流圖。
[0025]進一步的,所述GPU虛擬化框架后端設(shè)立一緩沖隊列,將每一次發(fā)送的緩存信息作為一組任務(wù)緩存到所述緩沖隊列。
[0026]本發(fā)明整體方案分為以下幾個部分:
[0027]( I) 二進制文件分析模塊,主要用來分析客戶機中的二進制文件,找到可推遲提交的代碼部分,并進行位置信息記錄等處理。
[0028](2)修改基于遠程API調(diào)用的GPU虛擬化框架的前端,利用二進制文件分析的結(jié)果,對數(shù)據(jù)的傳輸重新調(diào)度,減少重復(fù)的數(shù)據(jù)傳輸。
[0029](3)修改基于遠程API調(diào)用的GPU虛擬化框架的后端,通過前端發(fā)送來的一組調(diào)用信息進行處理,并將結(jié)果返回前端
[0030]推遲提交策略原理
[0031]該策略主要應(yīng)用于CUDA應(yīng)用程序中含有CUDA函數(shù)調(diào)用的循環(huán)部分。在遠程API調(diào)用的GPU虛擬化框架下,每次調(diào)用CUDA函數(shù)前后端都會進行一次通信。該策略通過分析含有CUDA調(diào)用的循環(huán),判斷該循環(huán)是否滿足可以被推遲提交的條件。如果通過分析發(fā)現(xiàn)該循環(huán)可以被推遲提交,那么我們就可以在前端將可被推遲提交的CUDA調(diào)用的函數(shù)名,參數(shù)信息及數(shù)據(jù)依賴關(guān)系等信息緩存起來。在循環(huán)結(jié)束時,一次性的將這些信息發(fā)送到后端,這樣后端就可以根據(jù)發(fā)送來的信息重構(gòu)函數(shù)調(diào)用,從而相當(dāng)于前后端只進行了一次通信,大大減少了通信問題所帶來的開銷(如圖2)。
[0032]這里所謂的可以被推遲提交的循環(huán),指的是循環(huán)中有一部分CUDA函數(shù)調(diào)用,如果我們在循環(huán)中不去執(zhí)行這一部分CUDA函數(shù)調(diào)用,循環(huán)依然可以正確的執(zhí)行。也就是說,我們只需要在循環(huán)的最后,告訴后端我們需要執(zhí)行多少次調(diào)用即可,而不用在循環(huán)中每遇到一次調(diào)用就將請求發(fā)送到后端。
[0033]根據(jù)循環(huán)中CUDA函數(shù)調(diào)用所需的參數(shù)與循環(huán)中其他變量的數(shù)據(jù)依賴等關(guān)系,我們將推遲提交分為以下三種情況:
[0034]第一類推遲提交
[0035]特點為:CUDA函數(shù)調(diào)用的參數(shù)與循環(huán)變量不相關(guān),也不存在與其他變量的數(shù)據(jù)依
賴關(guān)系。如下面代碼就是一個簡單的例子。
[0036]
【權(quán)利要求】
1.一種基于推遲提交的GPU虛擬化優(yōu)化方法,其步驟為: 1)客戶機上的GPU虛擬化框架前端調(diào)用二進制分析模塊讀入一待執(zhí)行CUDA應(yīng)用程序的二進制文件,在該二進制文件中查找并標(biāo)記可推遲提交的循環(huán); 2)GPU虛擬化框架前端執(zhí)行該CUDA應(yīng)用程序,當(dāng)執(zhí)行到可推遲提交的循環(huán)部分時,直到該循環(huán)結(jié)束之前,緩存所有的CUDA函數(shù)調(diào)用信息及其依賴關(guān)系,跳過該函數(shù)調(diào)用的執(zhí)行,然后在該循環(huán)結(jié)束之后將該緩存信息一次發(fā)送到宿主機上的GPU虛擬化框架后端; 3)宿主機上的GPU虛擬化框架后端根據(jù)該緩存信息重新構(gòu)建函數(shù)調(diào)用并執(zhí)行,然后將所有任務(wù)執(zhí)行結(jié)果打包一次發(fā)送回客戶機上的GPU虛擬化框架前端; 其中,所述可推遲提交的循環(huán)是指循環(huán)中包含若干CUDA函數(shù)調(diào)用,但在該循環(huán)中不去執(zhí)行這些CUDA函數(shù)調(diào)用,該循環(huán)依然可以正確執(zhí)行的循環(huán)。
2.如權(quán)利要求1所述的方法,其特征在于查找所述可推遲提交的循環(huán)的方法為: 1)二進制分析模塊對該二進制文件進行反匯編,然后為其中的每一用戶級函數(shù)建立一控制流圖; 2)在每一控制流圖中找到所有的循環(huán); 3)在每一自然循環(huán)中找到所有的函數(shù)調(diào)用點,識別出所有包含CUDA函數(shù)調(diào)用的循環(huán); 4)對每一CUD A函數(shù)調(diào)用的循環(huán)做寄存器級別的變量活性分析和數(shù)據(jù)相關(guān)性分析,根據(jù)每一 CUDA函數(shù)調(diào)用信息及其依賴關(guān)系確定出所述可推遲提交的循環(huán)。
3.如權(quán)利要求1或2所述的方法,其特征在于所述可推遲提交的循環(huán)包括三類;其中,第一類循環(huán)為=CUDA函數(shù)調(diào)用的參數(shù)不依賴于循環(huán)變量,且該參數(shù)不依賴循環(huán)中的其他變量,調(diào)用的結(jié)果不影響循環(huán)中其他語句的正常執(zhí)行;第二類循環(huán)為=CUDA函數(shù)調(diào)用的參數(shù)依賴于循環(huán)變量,但該參數(shù)不依賴循環(huán)中的其他變量,調(diào)用的結(jié)果不影響循環(huán)中其他語句的正常執(zhí)行;第三類循環(huán)為=CUDA函數(shù)調(diào)用的參數(shù)僅依賴于之前的CUDA函數(shù)調(diào)用產(chǎn)生的結(jié)果O
4.如權(quán)利要求3所述的方法,其特征在于所述二進制分析模塊靜態(tài)或動態(tài)的在CUDA程序的二進制文件中插入變量來標(biāo)記所述可推遲提交的循環(huán)的類別。
5.如權(quán)利要求3所述的方法,其特征在于對于第一類循環(huán),所述緩存的信息包括循環(huán)初值,步長和次數(shù),CUDA函數(shù)調(diào)用的參數(shù)、函數(shù)名,參數(shù)信息及數(shù)據(jù)依賴關(guān)系;對于第二類循環(huán),所述緩存的信息包括循環(huán)初值,步長和次數(shù),CUDA函數(shù)調(diào)用的參數(shù)、函數(shù)名、循環(huán)變量以及依賴于循環(huán)變量的參數(shù);對于所述第三類循環(huán),所述緩存的信息包括循環(huán)初值,步長和次數(shù),相互依賴的函數(shù)、依賴其他變量或參數(shù)的參數(shù)之間的依賴關(guān)系。
6.如權(quán)利要求5所述的方法,其特征在于對于第一類循環(huán),GPU虛擬化框架后端根據(jù)該緩存信息重新構(gòu)建函數(shù)調(diào)用的方法為:首先根據(jù)GPU虛擬化框架前端發(fā)送來的循環(huán)初值,步長和次數(shù),建立一個循環(huán);然后根據(jù)發(fā)送過來的函數(shù)名在CUDA庫中找到對應(yīng)函數(shù);然后根據(jù)發(fā)送過來的參數(shù)和數(shù)據(jù)重新構(gòu)建函數(shù)調(diào)用。
7.如權(quán)利要求5所述的方法,其特征在于對于第二類循環(huán),GPU虛擬化框架后端根據(jù)該緩存信息重新構(gòu)建函數(shù)調(diào)用的方法為:首先根據(jù)GPU虛擬化框架前端發(fā)送來的循環(huán)初值,步長和次數(shù),建立一個循環(huán);然后根據(jù)發(fā)送過來的函數(shù)名在CUDA庫中找到對應(yīng)函數(shù),將循環(huán)變量替換為GPU虛擬化框架后端的循環(huán)變量;然后根據(jù)發(fā)送過來的參數(shù)和數(shù)據(jù)重新構(gòu)建函數(shù)調(diào)用。
8.如權(quán)利要求5所述的方法,其特征在于對于第三類循環(huán),GPU虛擬化框架后端根據(jù)該緩存信息重新構(gòu)建函數(shù)調(diào)用的方法為:首先根據(jù)GPU虛擬化框架前端發(fā)送來的循環(huán)初值,步長和次數(shù),建立一個循環(huán);然后根據(jù)發(fā)送過來的函數(shù)名在CUDA庫中找到對應(yīng)函數(shù),根據(jù)參數(shù)的依賴關(guān)系重新計算參數(shù)的表達式,還原函數(shù)調(diào)用;然后根據(jù)發(fā)送過來的參數(shù)和數(shù)據(jù)重新構(gòu)建函數(shù)調(diào)用。
9.如權(quán)利要求1或2所述的方法,其特征在于利用dyninst工具讀取該二進制文件,然后反匯編,最后靜態(tài)或動態(tài)的為每一個用戶級函數(shù)建立一控制流圖。
10.如權(quán)利要求1或2所述的方法,其特征在于所述GPU虛擬化框架后端設(shè)立一緩沖隊列,將每一次發(fā)送的緩存 信息作為一組任務(wù)緩存到所述緩沖隊列。
【文檔編號】G06F9/455GK103955394SQ201410133294
【公開日】2014年7月30日 申請日期:2014年4月3日 優(yōu)先權(quán)日:2014年4月3日
【發(fā)明者】汪小林, 王寒冰, 劉宇璽, 桑燕, 羅英偉 申請人:北京大學(xué)