本發(fā)明涉及處理器技術(shù)領(lǐng)域,特別是涉及gpu技術(shù)領(lǐng)域,具體為一種gpu任務(wù)調(diào)度方法及系統(tǒng)。
背景技術(shù):
隨著互聯(lián)網(wǎng)用戶的快速增長,數(shù)據(jù)量的急劇膨脹,數(shù)據(jù)中心對計算的需求也在迅猛上漲。諸如深度學習在線預(yù)測、視頻轉(zhuǎn)碼以及圖片壓縮解壓縮等各類新型應(yīng)用的出現(xiàn)對計算的需求已遠遠超出了傳統(tǒng)cpu處理器的能力所及。gpu等有別于cpu的新型處理器的出現(xiàn)為數(shù)據(jù)中心帶來了巨大的體系結(jié)構(gòu)變革。
傳統(tǒng)的高性能計算集群通過mpi等方式作為主要通信方式,利用隊列系統(tǒng)讓每個任務(wù)獨占式地享用集群中的資源。相對于高性能計算集群中的獨占式訪問,數(shù)據(jù)中心需要同時為多個用戶提供服務(wù)。因此為了提高數(shù)據(jù)中心的利用率,用戶往往需要共享數(shù)據(jù)中心中的計算資源。另外,在實際環(huán)境中,不同的用戶會有不同的應(yīng)用請求服務(wù),且不同的服務(wù)請求到達的時間也各不相同,在此情況下,如何有效地解決資源的競爭和共享成為了提高數(shù)據(jù)中心資源的利用率的關(guān)鍵。動態(tài)任務(wù)調(diào)度就是最常見的共享計算資源的解決方案。
對于多任務(wù)共享cpu以及cpu的任務(wù)調(diào)度,研究人員已經(jīng)進行了大量的研究。而對于gpu,由于其產(chǎn)生之初便是為了高性能計算的獨占式服務(wù)而設(shè)計的,因此其原本的硬件架構(gòu)并不支持多任務(wù)共享gpu。gpukernel是一段在gpu上執(zhí)行的代碼。當調(diào)用gpu計算時,需要從cpu端將kernel和對應(yīng)的輸入?yún)?shù)傳遞到gpu上。kernel可以并發(fā)執(zhí)行,目前,用戶可通過定義可并行的kernelstream來實現(xiàn)kernel的并發(fā)執(zhí)行。stream可理解為一堆異步的操作,同一stream中的操作有嚴格的執(zhí)行順序,而不同stream之間則沒有該限制。利用不同stream異步執(zhí)行的特性,就可以通過協(xié)調(diào)不同stream來提高資源的利用率。從軟件角度來看,不同stream中的不同操作可以并行執(zhí)行,但在硬件角度卻不一定如此。kernel并行的程度依賴于pcie接口的帶寬以及kernel在每個streamingmultiprocessor(sm)中可獲得的資源,在資源不足的情況下,stream仍然需要等待其他的stream完成執(zhí)行才能開始執(zhí)行。因此,多任務(wù)共享gpu需要打破現(xiàn)有g(shù)pu硬件框架的限制。意識到該問題,學術(shù)界和工業(yè)界均開始重視起gpu的硬件級共享以及搶占支持。
cpu上的搶占式多任務(wù)是通過上下文切換實現(xiàn)的,上下文切換引入的額外的延遲和吞吐量損失對于cpu來說是完全可以接收的。而對于gpu來說,由于gpu架構(gòu)以及相關(guān)特性與cpu存在較大的差異,在gpu上實現(xiàn)搶占式多任務(wù)將會引入相對cpu上大得多的額外開銷。僅對于一個sm來說,上下文切換可能會涉及到近256kb大小的寄存器以及48kb的共享內(nèi)存的內(nèi)容切換。而目前gpu的性能在很大程度上受到內(nèi)存帶寬的限制,由于內(nèi)存請求引入的延遲過大,即使gpu的多線程計算能力也無法完全掩蓋內(nèi)存延遲所帶來的影響。考慮到內(nèi)存請求對gpu性能的整體影響,在設(shè)計調(diào)度算法時也不能忽視調(diào)度算法所引起的額外的內(nèi)存請求。
現(xiàn)有技術(shù)中,一種方式是chimera通過將不同的sm劃分給不同的kernel實現(xiàn)多kernel共享一個gpu。另外,chimera針對不同的應(yīng)用場景提出了以下三種不同的搶占策略:
1.contextswitching:即通過把一個sm上的正在運行的threadblock(tb)的上下文保存到內(nèi)存里,并發(fā)射一個新的kernel來搶占當前sm。
2.draining:暫停發(fā)射新的kernel,直到一個正在運行的kernel的所有tb運行結(jié)束。
3.flushing:對于具有“冪等性”(idempotent)kernel,即使強制結(jié)束當前正在運行的tb,重新啟動后也不會對kernel最后的結(jié)果產(chǎn)生影響,因此在上下文切換時可直接將其tb強行中止,且不需要保存任何上下文信息。
三種策略各有優(yōu)劣,其中contextswitching所引入的額外開銷對于延遲和吞吐量的影響居于另外兩個策略之間;draining對吞吐量的影響最小,但對延遲的影響最大;flushing對延遲幾乎沒有影響,但若是搶占發(fā)生在tb即將運行結(jié)束時,則會對吞吐量造成很大的影響。
當有一個新的kernel到達時,chimera會根據(jù)三種策略所引入的開銷以及當前正在運行的kernel的狀態(tài),選擇將被搶占的sm,以及其上運行的tb被搶占的方式,從而達到以一個較小的開銷實現(xiàn)搶占的效果。
chimera中采取的三種策略均存在比較嚴重的缺點,如果是通過內(nèi)存進行切換,就會產(chǎn)生大量的內(nèi)存訪問,對性能產(chǎn)生影響。如果等待tb結(jié)束,則會導致不可預(yù)期的搶占延遲。而“冪等性”則對kernel本身有比較大的要求。
這三種策略的綜合結(jié)果是能夠在搶占發(fā)生時,如何根據(jù)當前運行環(huán)境的狀態(tài),盡量減少搶占過程所引入的開銷,而對于任務(wù)動態(tài)到達的場景,chimera沒有提出相對應(yīng)的調(diào)度策略,無法實現(xiàn)全局的吞吐量優(yōu)化。
現(xiàn)有技術(shù)中,還有一種方式是simultaneousmultikernel通過在每個sm增加搶占機制,實現(xiàn)部分上下文切換(partialcontextswitching)從而能夠?qū)φ谶\行的kernel進行部分資源的搶占,使得多個kernel可以共享一個sm的資源。對于多個kernel之間的資源分配,該研究采取的是主導資源公平算法(drf),drf是一種通用的多資源的max-minfairness分配策略。drf的主題思想是在多用戶環(huán)境下一個用戶的資源分配應(yīng)該由用戶的主導份額的資源決定,主導份額的資源指的是在所有已經(jīng)分配給用戶的多種資源中,占據(jù)最大份額的一種資源。在gpu中總共有四種資源:寄存器、共享內(nèi)存、線程以及tb。
simultaneousmultikernel提供了讓不同kernel共享gpu的硬件機制,但沒有對共享gpu的kernel進行進一步限制。在數(shù)據(jù)中心的應(yīng)用場景下,simultaneousmultikerne研究表明,不同的kernel具有不同的資源利用率。有些kernel幾乎不使用scratchpad內(nèi)存,而是頻繁的訪問l1緩存。而另一些kernel則正相反。這導致了gpu整體資源利用率的低下。雖然simultaneousmultikernel在硬件上允許kernel之間利用互補的資源,但其并沒有給出調(diào)度動態(tài)到來的任務(wù)使其資源互補的算法。因此,在數(shù)據(jù)中心的應(yīng)用場景下,simultaneousmultikernel無法徹底解決資源利用率的問題。
技術(shù)實現(xiàn)要素:
鑒于以上所述現(xiàn)有技術(shù)的缺點,本發(fā)明的目的在于提供一種gpu任務(wù)調(diào)度方法及系統(tǒng),用于解決現(xiàn)有技術(shù)中g(shù)pu任務(wù)調(diào)度存在的影響內(nèi)存性能,延遲高以及資源利用率低的問題。
為實現(xiàn)上述目的及他相關(guān)目的,本發(fā)明在一方面提供一種gpu任務(wù)調(diào)度系統(tǒng),所述任務(wù)調(diào)度系統(tǒng)包括:應(yīng)用分析模塊,用于接收用戶的應(yīng)用程序請求,分析應(yīng)用程序,根據(jù)所述應(yīng)用程序的類型和輸入數(shù)據(jù)集的大小分析獲取所述應(yīng)用程序的各個kernel的指令數(shù);動態(tài)任務(wù)調(diào)度模塊,包括:動態(tài)檢測單元,用于動態(tài)檢測、接收用戶的應(yīng)用程序請求并將接收的用戶的應(yīng)用程序請求發(fā)送至所述應(yīng)用分析模塊;數(shù)量查詢單元,用于從運行時系統(tǒng)查詢當前運行的kernel數(shù)量;處理單元,用于判斷當前運行的kernel數(shù)量是否達到預(yù)設(shè)的上限值,若否,則從被搶占的kernel以及新到達的kernel中挑選與當前運的kernel組合形成kernel組合優(yōu)先級最高的kernel并將挑選的kernel發(fā)射至運行時系統(tǒng),若是,則繼續(xù)判斷被搶占的kernel和新到達的kernel中是否存在與當前運行kernel進行組合得到更高優(yōu)先級的kernel組合,若否,則保持當前運行的kernel狀態(tài),若是,則繼續(xù)判斷搶占程序后的gpu性能提升是否大于搶占過程所占用的gpu開銷,若是,則進行搶占,若否,則保持當前運行的kernel狀態(tài)。
于本發(fā)明的一實施例中,被搶占的kernel的優(yōu)先級高于新到達的kernel的優(yōu)先級,使得gpu性能越好的kernel組合的優(yōu)先級越高。
于本發(fā)明的一實施例中,通過預(yù)設(shè)的歸一化ipc衡量gpu性能,歸一化ipc的計算公式為:
于本發(fā)明的一實施例中,搶占程序后的gpu性能提升根據(jù)搶占前歸一化ipc和搶占后歸一化ipc的對比獲取,其中:搶占前歸一化ipc為:
搶占后歸一化ipc為:
preempt_cycle=(0.09526×miss_rate+0.01633)×(reg+smem)×tb;
其中,normalized_ipci表示為第i個kernel的指令數(shù),running1表示為正在運行的第一個kernel,running2表示正在運行的第二個kernel,rest_cycle表示為正在運行的兩個kernel還能一起運行的時鐘周期數(shù),rest_instrunning1表示為正在運行的第一個kernel剩余的指令數(shù),ipcrunning1表示為正在運行的第一個kernel所表現(xiàn)出的ipc,rest_instrunning2表示為正在運行的第二個kernel剩余的指令數(shù),ipcrunning2表示為正在運行的第二個kernel所表現(xiàn)出的ipc,norm_ipci表示為第i個kernel所表現(xiàn)出的歸一化ipc,preempt_cycle表示為搶占過程所持續(xù)的時鐘周期數(shù),miss_rate表示為未被搶占的kernel發(fā)生高速緩存缺失的頻率,reg表示為被搶占的kernel中每個線程塊占用寄存器的字節(jié)數(shù),smem表示為被搶占的kernel中每個線程塊占用共享內(nèi)存的字節(jié)數(shù),tb表示為被搶占的kernel中線程塊的數(shù)量。
于本發(fā)明的一實施例中,搶占過程所占用的gpu開銷通過搶占過程中歸一化ipc衡量,所述搶占過程中歸一化ipc為:
norm_ipcrunning1×decay_rate×preempt_cycle;
其中,norm_ipcrunning1表示為未被搶占kernel所表現(xiàn)出的歸一化ipc,decay_rate表示為未被搶占的kernel由于搶占過程而導致的ipc衰減率,preempt_cycle表示為搶占過程所持續(xù)的時鐘周期數(shù),kernel∈memory_intensive表示為未被搶占的kernel屬于內(nèi)存密集型kernel,kernel∈compute_intensive表示為未被搶占的kernel屬于計算密集型kernel。
實現(xiàn)上述目的,本發(fā)明在另外一方面還提供一種芯片,所述芯片為異構(gòu)多核硬件結(jié)構(gòu),所述芯片內(nèi)裝設(shè)有如上所述的gpu任務(wù)調(diào)度系統(tǒng)。
實現(xiàn)上述目的,本發(fā)明在另外一方面還提供一種gpu任務(wù)調(diào)度方法,所述任務(wù)調(diào)度方法包括:動態(tài)檢測并接收用戶的應(yīng)用程序請求,分析應(yīng)用程序,根據(jù)所述應(yīng)用程序的類型和輸入數(shù)據(jù)集的大小分析獲取所述應(yīng)用程序的各個kernel的指令數(shù);從運行時系統(tǒng)查詢當前運行的kernel數(shù)量,并判斷當前運行的kernel數(shù)量是否達到預(yù)設(shè)的上限值,若否,則從被搶占的kernel以及新到達的kernel中挑選與當前運的kernel組合形成kernel組合優(yōu)先級最高的kernel并將挑選的kernel發(fā)射至運行時系統(tǒng),若是,則繼續(xù)判斷被搶占的kernel和新到達的kernel中是否存在與當前運行kernel進行組合得到更高優(yōu)先級的kernel組合,若否,則保持當前運行的kernel狀態(tài),若是,則繼續(xù)判斷搶占程序后的gpu性能提升是否大于搶占過程所占用的gpu開銷,若是,則進行搶占,若否,則保持當前運行的kernel狀態(tài)。
于本發(fā)明的一實施例中,被搶占的kernel的優(yōu)先級高于新到達的kernel的優(yōu)先級,使得gpu性能越好的kernel組合的優(yōu)先級越高。
于本發(fā)明的一實施例中,通過預(yù)設(shè)的歸一化ipc衡量gpu性能,歸一化ipc的計算公式為:
其中,norm_ipc表示為歸一化ipc,ipcshare表示為kernel與其他kernel共享gpu時gpu表現(xiàn)出的ipc,ipcalone表示為kernel獨占gpu時gpu表現(xiàn)出的ipc。
于本發(fā)明的一實施例中,搶占程序后的gpu性能提升根據(jù)搶占前歸一化ipc和搶占后歸一化ipc的對比獲取,其中:
搶占前歸一化ipc為:
搶占后歸一化ipc為:
preempt_cycle=(0.09526×miss_rate+0.01633)×(reg+smem)×tb;
其中,normalized_ipci表示為第i個kernel的指令數(shù),running1表示為正在運行的第一個kernel,running2表示正在運行的第二個kernel,rest_cycle表示為正在運行的兩個kernel還能一起運行的時鐘周期數(shù),rest_instrunning1表示為正在運行的第一個kernel剩余的指令數(shù),ipcrunning1表示為正在運行的第一個kernel所表現(xiàn)出的ipc,rest_instrunning2表示為正在運行的第二個kernel剩余的指令數(shù),ipcrunning2表示為正在運行的第二個kernel所表現(xiàn)出的ipc,norm_ipci表示為第i個kernel所表現(xiàn)出的歸一化ipc,preempt_cycle表示為搶占過程所持續(xù)的時鐘周期數(shù),miss_rate表示為未被搶占的kernel發(fā)生高速緩存缺失的頻率,reg表示為被搶占的kernel中每個線程塊占用寄存器的字節(jié)數(shù),smem表示為被搶占的kernel中每個線程塊占用共享內(nèi)存的字節(jié)數(shù),tb表示為被搶占的kernel中線程塊的數(shù)量。
于本發(fā)明的一實施例中,搶占過程所占用的gpu開銷通過搶占過程中歸一化ipc衡量,所述搶占過程中歸一化ipc為:
norm_ipcrunning1×decay_rate×preempt_cycle;
其中,norm_ipcrunning1表示為未被搶占kernel所表現(xiàn)出的歸一化ipc,decay_rate表示為未被搶占的kernel由于搶占過程而導致的ipc衰減率,preempt_cycle表示為搶占過程所持續(xù)的時鐘周期數(shù),kernel∈memory_intensive表示為未被搶占的kernel屬于內(nèi)存密集型kernel,kernel∈compute_intensive表示為未被搶占的kernel屬于計算密集型kernel。
如上所述,本發(fā)明的一種gpu任務(wù)調(diào)度方法及系統(tǒng),具有以下有益效果:
1、本發(fā)明提供了一個高性能的gpu搶占式任務(wù)調(diào)度系統(tǒng),其基于硬件式搶占機制和高性能任務(wù)調(diào)度算法,可以在無需升級硬件設(shè)備的情況下,應(yīng)對應(yīng)用請求動態(tài)到達的情況,有效降低延遲,提高資源利用率,提高gpu的性能。
2、本發(fā)明的成果可以用于構(gòu)建具有商業(yè)意義的、基于cpu和異構(gòu)計算芯片gpu的異構(gòu)數(shù)據(jù)中心,面向用戶提供程序動態(tài)任務(wù)調(diào)度服務(wù)。
3、本發(fā)明簡單實用,具有良好的市場前景和廣泛的適用性。
附圖說明
圖1顯示為本發(fā)明的一種gpu任務(wù)調(diào)度方法的流程示意圖。
圖2顯示為本發(fā)明的一種gpu任務(wù)調(diào)度系統(tǒng)的原理框圖。
圖3顯示為本發(fā)明與現(xiàn)有的軟件層的關(guān)系架構(gòu)圖。
圖4顯示為本發(fā)明的gpu任務(wù)調(diào)度方法及系統(tǒng)的實施過程示意圖。
元件標號說明
100gpu任務(wù)調(diào)度系統(tǒng)
110應(yīng)用分析模塊
120動態(tài)任務(wù)調(diào)度模塊
121動態(tài)檢測單元
122數(shù)量查詢單元
123處理單元
s101~s108步驟
具體實施方式
以下通過特定的具體實例說明本發(fā)明的實施方式,本領(lǐng)域技術(shù)人員可由本說明書所揭露的內(nèi)容輕易地了解本發(fā)明的其他優(yōu)點與功效。本發(fā)明還可以通過另外不同的具體實施方式加以實施或應(yīng)用,本說明書中的各項細節(jié)也可以基于不同觀點與應(yīng)用,在沒有背離本發(fā)明的精神下進行各種修飾或改變。
本實施例的目的在于提供一種gpu任務(wù)調(diào)度方法及系統(tǒng),用于解決現(xiàn)有技術(shù)中g(shù)pu任務(wù)調(diào)度存在的影響內(nèi)存性能,延遲高以及資源利用率低的問題。以下將詳細闡述本發(fā)明的一種gpu任務(wù)調(diào)度方法及系統(tǒng)的原理及實施方式,使本領(lǐng)域技術(shù)人員不需要創(chuàng)造性勞動即可理解本發(fā)明的一種gpu任務(wù)調(diào)度方法及系統(tǒng)。
具體地,本實施例旨在實現(xiàn)一個高性能的gpu搶占式任務(wù)調(diào)度,其基于硬件搶占機制和高性能任務(wù)調(diào)度算法,分別完成基于gpu的多任務(wù)共享以及搶占和在任務(wù)動態(tài)到達的情況下動態(tài)調(diào)度的工作。便于開發(fā)人員在無需關(guān)心硬件系統(tǒng)以及調(diào)度細節(jié)的前提下獲得高吞吐和低延遲。
以下對本實施例的gpu任務(wù)調(diào)度方法及系統(tǒng)進行詳細說明。
如圖1所示,本實施例提供一種gpu任務(wù)調(diào)度方法,所述任務(wù)調(diào)度方法包括:
步驟s101,動態(tài)檢測并接收用戶的應(yīng)用程序請求,分析應(yīng)用程序,根據(jù)所述應(yīng)用程序的類型和輸入數(shù)據(jù)集的大小分析獲取所述應(yīng)用程序的各個kernel的指令數(shù)。
步驟s102,從運行時系統(tǒng)查詢當前運行的kernel數(shù)量。
步驟s103,判斷當前運行的kernel數(shù)量是否達到預(yù)設(shè)的上限值,若否,則執(zhí)行步驟s104,若是,則執(zhí)行步驟s105。
步驟s104,從被搶占的kernel以及新到達的kernel中挑選與當前運的kernel組合形成kernel組合優(yōu)先級最高的kernel并將挑選的kernel發(fā)射至運行時系統(tǒng)。
步驟s105,繼續(xù)判斷被搶占的kernel和新到達的kernel中是否存在與當前運行kernel進行組合得到更高優(yōu)先級的kernel組合,若否,則執(zhí)行步驟s106,若是,則執(zhí)行步驟s107。
步驟s106,保持當前運行的kernel狀態(tài)。
步驟s107,繼續(xù)判斷搶占程序后的gpu性能提升是否大于搶占過程所占用的gpu開銷,若是,則執(zhí)行步驟s108,進行搶占,若否,則返回步驟s106保持當前運行的kernel狀態(tài)。
以下對本實施例的gpu任務(wù)調(diào)度方法進行詳細說明。
根據(jù)kernel在運行過程中對不同類型資源的需求程度不同,可將kernel分為內(nèi)存密集型和計算密集型兩種類型。計算密集型的kernel對計算資源的需求較大,而內(nèi)存密集型的kernel在運行過程中對內(nèi)存的訪問表現(xiàn)的比較頻繁。由于兩種類型的kernel對資源的需求表現(xiàn)為互補,因此當兩者共享gpu時,可最大程度的提高資源的利用率,且在最大程度上避免發(fā)生資源爭搶。另外,由于gpu的性能在很大程度上被內(nèi)存帶寬所限制,內(nèi)存密集型的kernel共享gpu時所表現(xiàn)出的性能結(jié)果要差于計算密集型的kernel共享gpu時的性能結(jié)果。根據(jù)不同組合的kernel所表現(xiàn)出的性能結(jié)果,將性能表現(xiàn)更好的kernel組合賦予更高的優(yōu)先級。該優(yōu)先級便作為調(diào)度過程中進行發(fā)射kernel以及實施搶占的重要依據(jù)。另外,出于對延遲的考慮,已經(jīng)被搶占的kernel在優(yōu)先級上要高于新到達的kernel,即在組合優(yōu)先級相等的情況下,優(yōu)先會將已經(jīng)被搶占過的kernel發(fā)射上去。
所以于本實施例中,被搶占的kernel的優(yōu)先級高于新到達的kernel的優(yōu)先級,使得gpu性能越好的kernel組合的優(yōu)先級越高。
當需要發(fā)生搶占時,除了考慮優(yōu)先級的影響,還要考慮搶占過程所引入的額外開銷。于本實施例中,通過預(yù)設(shè)的歸一化ipc(instructionpercycle,每周期執(zhí)行指令數(shù))衡量gpu性能,歸一化ipc的計算公式為:
其中,norm_ipc表示為歸一化ipc,ipcshare表示為kernel與其他kernel共享gpu時gpu表現(xiàn)出的ipc,ipcalone表示為kernel獨占gpu時gpu表現(xiàn)出的ipc。
為了實現(xiàn)吞吐量的最大化,則要盡可能保持各時刻運行分kernel的歸一化ipc之和最大。若被搶占的kernel或者新到達的kernel與正在運行的kernel能到組合出比當前運行的kernel組合更高優(yōu)先級的組合,則進一步考慮是否進行搶占。判斷是否搶占的邏輯取決于搶占前和搶占后的歸一化ipc的對比,即搶占程序后的gpu性能提升根據(jù)搶占前歸一化ipc和搶占后歸一化ipc的對比獲取。搶占前的歸一化ipc取決于當前正在運行的kernel,動態(tài)調(diào)度模塊可通過向運行時系統(tǒng)層發(fā)出請求獲取當前正在運行的kernel的狀態(tài),其中包括各個kernel已經(jīng)運行的指令數(shù)和實際運行的ipc,結(jié)合程序分析模塊分析出的各個kernel的總指令數(shù),則可以預(yù)測出搶占前歸一化ipc為:
搶占后歸一化ipc為:
preempt_cycle=(0.09526×miss_rate+0.01633)×(reg+smem)×tb;
其中,normalized_ipci表示為第i個kernel的指令數(shù),running1表示為正在運行的第一個kernel,running2表示正在運行的第二個kernel,rest_cycle表示為正在運行的兩個kernel還能一起運行的時鐘周期數(shù),rest_instrunning1表示為正在運行的第一個kernel剩余的指令數(shù),ipcrunning1表示為正在運行的第一個kernel所表現(xiàn)出的ipc,rest_instrunning2表示為正在運行的第二個kernel剩余的指令數(shù),ipcrunning2表示為正在運行的第二個kernel所表現(xiàn)出的ipc,norm_ipci表示為第i個kernel所表現(xiàn)出的歸一化ipc,preempt_cycle表示為搶占過程所持續(xù)的時鐘周期數(shù),miss_rate表示為未被搶占的kernel發(fā)生高速緩存缺失的頻率,reg表示為被搶占的kernel中每個線程塊占用寄存器的字節(jié)數(shù),smem表示為被搶占的kernel中每個線程塊占用共享內(nèi)存的字節(jié)數(shù),tb表示為被搶占的kernel中線程塊的數(shù)量。
于本實施例中,搶占過程所占用的gpu開銷通過搶占過程中歸一化ipc衡量,所述搶占過程中歸一化ipc為:
norm_ipcrunning1×decay_rate×preempt_cycle;
其中,norm_ipcrunning1表示為未被搶占kernel所表現(xiàn)出的歸一化ipc,decay_rate表示為未被搶占的kernel由于搶占過程而導致的ipc衰減率,preempt_cycle表示為搶占過程所持續(xù)的時鐘周期數(shù)。
搶占后的歸一化ipc由兩個階段組成,一部分是搶占過程中的ipc表現(xiàn),另一部分是搶占完成后的ipc表現(xiàn)。搶占發(fā)生時,未被搶占的kernel仍在繼續(xù)運行,而被搶占的kernel需要先將相關(guān)的上下文保存到內(nèi)存中,這其中涉及到大量的內(nèi)存訪問操作。根據(jù)實際測試情況可知,當未被搶占的kernel屬于內(nèi)存密集型類型的kernel時,其ipc會減小到原來的83%~97%不等,而計算密集型的kernel基本不受影響,因此根據(jù)kernel的類型,decay_rate定義如下:
kernel∈memory_intensive表示為未被搶占的kernel屬于內(nèi)存密集型kernel,kernel∈compute_intensive表示為未被搶占的kernel屬于計算密集型kernel
搶占過程所占用的時鐘周期數(shù)(cycle)受到兩個因素的影響:第一個因素為被換出的kernel的上下文的大小,其中包括該kernel所占用的tb,以及每個tb所占用的寄存器數(shù)量和共享內(nèi)存的大小,這些數(shù)量決定了保存完整上下文所需要執(zhí)行的內(nèi)存訪問操作的數(shù)量,通過統(tǒng)計測試結(jié)果可知,搶占過程所持續(xù)的cycle數(shù)與所要保存的字節(jié)數(shù)成正相關(guān),且可通過線性模型對兩者的關(guān)系進行擬合;另一個因素是未被換出的kernel執(zhí)行內(nèi)存訪問操作的頻繁程度,由于搶占過程中涉及到較多的內(nèi)存操作,若未被搶占的kernel也涉及到較多的內(nèi)存操作,會更加拖慢搶占過程,可通過l2cachemiss的頻率來衡量kernel涉及內(nèi)存操作的頻率,研究過程中發(fā)現(xiàn),搶占過程cycle數(shù)和上下文切換字節(jié)數(shù)的線性模型的斜率與正在運行的kernel的cachemiss頻率成正相關(guān),且成線性關(guān)系。因此搶占過程的cycle數(shù)可大致擬合以下關(guān)系式:
preempt_cycle=(0.09526×miss_rate+0.01633)×(reg+smem)×tb。
搶占過程中歸一化ipc定義為:norm_ipcrunning1×decay_rate×preempt_cycle。
搶占后的ipc無法精確得知,可通過歷史數(shù)據(jù)獲取一個經(jīng)驗值,搶占后的歸一化ipc定義為:
根據(jù)搶占前歸一化ipc和搶占后歸一化ipc的對比獲取搶占程序后的gpu性能提升,即
兩者相減。具體地,計算搶占前歸一化ipc和搶占后歸一化ipc的差值,獲取搶占程序后的gpu性能提升。
為實現(xiàn)上述gpu任務(wù)調(diào)度方法,本實施例提供一種gpu任務(wù)調(diào)度系統(tǒng)100,如圖2所示,所述gpu任務(wù)調(diào)度系統(tǒng)100包括:應(yīng)用分析模塊110和動態(tài)任務(wù)調(diào)度模塊120。以下對本實施例中的任務(wù)用分析模塊和動態(tài)任務(wù)調(diào)度模塊120進行詳細說明。
如圖3所示,本實施例中g(shù)pu任務(wù)調(diào)度系統(tǒng)100的軟件架構(gòu)分為三層:應(yīng)用層、調(diào)度層和運行時系統(tǒng)層。其中,應(yīng)用層主要由用戶應(yīng)用所組成,用戶遵循一般的gpu編程規(guī)則,編寫能在gpu上運行的kernel程序,即可在本發(fā)明所提供的軟件架構(gòu)中運行。所述gpu任務(wù)調(diào)度系統(tǒng)100運行于調(diào)度層,即調(diào)度層運行應(yīng)用分析模塊110和動態(tài)任務(wù)調(diào)度模塊120。運行時系統(tǒng)層是系統(tǒng)的主要組成部分之一,在用戶可執(zhí)行程序運行時,運行時系統(tǒng)通過調(diào)度層的調(diào)度結(jié)果調(diào)度任務(wù)或者對正在運行的程序進行搶占。運行時系統(tǒng)層通過在每個sm增加搶占機制,實現(xiàn)了部分上下文切換,從而能夠?qū)φ谶\行的kernel進行部分資源的搶占,使得多個kernel可以共享一個sm的資源。當運行時系統(tǒng)層接收到調(diào)度層發(fā)射的新的kernel,運行時系統(tǒng)層優(yōu)先使用各sm中未被占用的資源為新kernel分配tb,當資源不足時,需要搶占部分正在運行的kernel的資源。被換出的tb的上下文被保存到內(nèi)存中,換出過程結(jié)束后,新的kernel的tb被換入,整個上下文切換過程中正在運行的kernel的tb不會被打斷。需要進行搶占時,被換出的kernel的tb會被全部換出,其上下文同樣被保存到內(nèi)存中。
其中,1、用戶與應(yīng)用層的交互包括:a)用戶根據(jù)gpu編程規(guī)范編寫用戶應(yīng)用程序;b)
經(jīng)過本地調(diào)試后,確保程序正確。
2、用戶與調(diào)度層的交互包括:a)用戶向調(diào)度層提交應(yīng)用請求;b)應(yīng)用分析模塊110接收用戶請求。
3、用戶與運行時系統(tǒng)層的交互包括:a)運行時系統(tǒng)層向用戶返回運行結(jié)果。
4、調(diào)度層之間的交互包括:a)應(yīng)用分析模塊110向動態(tài)任務(wù)調(diào)度模塊120轉(zhuǎn)移用戶請求;b)應(yīng)用分析模塊110向動態(tài)任務(wù)調(diào)度模塊120發(fā)送應(yīng)用分析結(jié)果。
5、調(diào)度層與運行時系統(tǒng)層的交互包括:a)調(diào)度層向運行時系統(tǒng)層發(fā)送發(fā)射應(yīng)用請求;b)
調(diào)度層向運行時系統(tǒng)層發(fā)送搶占請求;c)運行時系統(tǒng)層向調(diào)度層發(fā)送運行kernel狀態(tài)。
具體地,于本實施中,所述應(yīng)用分析模塊110負責接收用戶的應(yīng)用請求并分析用戶應(yīng)用程序,通過機器學習算法,根據(jù)所輸入的應(yīng)用程序類型以及輸入數(shù)據(jù)集的大小,分析出應(yīng)用程序的指令數(shù),其輸出信息將作為動態(tài)任務(wù)調(diào)度模塊120的重要參考信息。具體地,所述應(yīng)用分析模塊110用于接收用戶的應(yīng)用程序請求,分析應(yīng)用程序,根據(jù)所述應(yīng)用程序的類型和輸入數(shù)據(jù)集的大小分析獲取所述應(yīng)用程序的各個kernel的指令數(shù)。
所述動態(tài)任務(wù)調(diào)度模塊120與所述應(yīng)用分析模塊110是一個有機整體,但各司其職。所述動態(tài)任務(wù)調(diào)度模塊120接收來自用戶和應(yīng)用分析程序的輸入信息,并根據(jù)綜合信息做出調(diào)度判斷。所述動態(tài)任務(wù)調(diào)度模塊120的第一個功能是接收用戶的請求。由于用戶的請求是動態(tài)到達,因此需要周期性地檢查是否有新的用戶請求到達,新到達的用戶程序需要首先經(jīng)過應(yīng)用分析程序的分析,新的應(yīng)用和其相關(guān)的分析結(jié)果將一起被發(fā)送到所述動態(tài)任務(wù)調(diào)度模塊120;所述動態(tài)任務(wù)調(diào)度模塊120的第二個功能是根據(jù)當前正在運行的程序狀態(tài)以及新到達的應(yīng)用的特征,判斷是否向底層發(fā)射新的任務(wù)或者對正在運行的程序進行搶占。
具體地,所述動態(tài)任務(wù)調(diào)度模塊120包括:動態(tài)檢測單元121,數(shù)量查詢單元122以及處理單元123。所述動態(tài)檢測單元121用于動態(tài)檢測、接收用戶的應(yīng)用程序請求并將接收的用戶的應(yīng)用程序請求發(fā)送至所述應(yīng)用分析模塊110。所述數(shù)量查詢單元122用于從運行時系統(tǒng)查詢當前運行的kernel數(shù)量。
所述處理單元123用于判斷當前運行的kernel數(shù)量是否達到預(yù)設(shè)的上限值,若否,則從被搶占的kernel以及新到達的kernel中挑選與當前運的kernel組合形成kernel組合優(yōu)先級最高的kernel并將挑選的kernel發(fā)射至運行時系統(tǒng),若是,則繼續(xù)判斷被搶占的kernel和新到達的kernel中是否存在與當前運行kernel進行組合得到更高優(yōu)先級的kernel組合,若否,則保持當前運行的kernel狀態(tài),若是,則繼續(xù)判斷搶占程序后的gpu性能提升是否大于搶占過程所占用的gpu開銷,若是,則進行搶占,若否,則保持當前運行的kernel狀態(tài)。
根據(jù)kernel在運行過程中對不同類型資源的需求程度不同,可將kernel分為內(nèi)存密集型和計算密集型兩種類型。計算密集型的kernel對計算資源的需求較大,而內(nèi)存密集型的kernel在運行過程中對內(nèi)存的訪問表現(xiàn)的比較頻繁。由于兩種類型的kernel對資源的需求表現(xiàn)為互補,因此當兩者共享gpu時,可最大程度的提高資源的利用率,且在最大程度上避免發(fā)生資源爭搶。另外,由于gpu的性能在很大程度上被內(nèi)存帶寬所限制,內(nèi)存密集型的kernel共享gpu時所表現(xiàn)出的性能結(jié)果要差于計算密集型的kernel共享gpu時的性能結(jié)果。根據(jù)不同組合的kernel所表現(xiàn)出的性能結(jié)果,將性能表現(xiàn)更好的kernel組合賦予更高的優(yōu)先級。該優(yōu)先級便作為調(diào)度過程中進行發(fā)射kernel以及實施搶占的重要依據(jù)。另外,出于對延遲的考慮,已經(jīng)被搶占的kernel在優(yōu)先級上要高于新到達的kernel,即在組合優(yōu)先級相等的情況下,優(yōu)先會將已經(jīng)被搶占過的kernel發(fā)射上去。
所以于本實施例中,被搶占的kernel的優(yōu)先級高于新到達的kernel的優(yōu)先級,使得gpu性能越好的kernel組合的優(yōu)先級越高。
當需要發(fā)生搶占時,除了考慮優(yōu)先級的影響,還要考慮搶占過程所引入的額外開銷。于本實施例中,通過預(yù)設(shè)的歸一化ipc衡量gpu性能,歸一化ipc的計算公式為:
其中,norm_ipc表示為歸一化ipc,ipcshare表示為kernel與其他kernel共享gpu時gpu表現(xiàn)出的ipc,ipcalone表示為kernel獨占gpu時gpu表現(xiàn)出的ipc。
為了實現(xiàn)吞吐量的最大化,則要盡可能保持各時刻運行分kernel的歸一化ipc之和最大。若被搶占的kernel或者新到達的kernel與正在運行的kernel能到組合出比當前運行的kernel組合更高優(yōu)先級的組合,則進一步考慮是否進行搶占。判斷是否搶占的邏輯取決于搶占前和搶占后的歸一化ipc的對比,即搶占程序后的gpu性能提升根據(jù)搶占前歸一化ipc和搶占后歸一化ipc的對比獲取。搶占前的歸一化ipc取決于當前正在運行的kernel,動態(tài)調(diào)度模塊可通過向運行時系統(tǒng)層發(fā)出請求獲取當前正在運行的kernel的狀態(tài),其中包括各個kernel已經(jīng)運行的指令數(shù)和實際運行的ipc,結(jié)合程序分析模塊分析出的各個kernel的總指令數(shù),則可以預(yù)測出搶占前歸一化ipc為:
搶占后歸一化ipc為:
preempt_cycle=(0.09526×miss_rate+0.01633)×(reg+smem)×tb;
其中,normalized_ipci表示為第i個kernel的指令數(shù),running1表示為正在運行的第一個kernel,running2表示正在運行的第二個kernel,rest_cycle表示為正在運行的兩個kernel還能一起運行的時鐘周期數(shù),rest_instrunning1表示為正在運行的第一個kernel剩余的指令數(shù),ipcrunning1表示為正在運行的第一個kernel所表現(xiàn)出的ipc,rest_instrunning2表示為正在運行的第二個kernel剩余的指令數(shù),ipcrunning2表示為正在運行的第二個kernel所表現(xiàn)出的ipc,norm_ipci表示為第i個kernel所表現(xiàn)出的歸一化ipc,preempt_cycle表示為搶占過程所持續(xù)的時鐘周期數(shù),miss_rate表示為未被搶占的kernel發(fā)生高速緩存缺失的頻率,reg表示為被搶占的kernel中每個線程塊占用寄存器的字節(jié)數(shù),smem表示為被搶占的kernel中每個線程塊占用共享內(nèi)存的字節(jié)數(shù),tb表示為被搶占的kernel中線程塊的數(shù)量。
于本實施例中,搶占過程所占用的gpu開銷通過搶占過程中歸一化ipc衡量,所述搶占過程中歸一化ipc為:
norm_ipcrunning1×decay_rate×preempt_cycle;
其中,norm_ipcrunning1表示為未被搶占kernel所表現(xiàn)出的歸一化ipc,decay_rate表示為未被搶占的kernel由于搶占過程而導致的ipc衰減率,preempt_cycle表示為搶占過程所持續(xù)的時鐘周期數(shù),kernel∈memory_intensive表示為未被搶占的kernel屬于內(nèi)存密集型kernel,kernel∈compute_intensive表示為未被搶占的kernel屬于計算密集型kernel。
搶占后的歸一化ipc由兩個階段組成,一部分是搶占過程中的ipc表現(xiàn),另一部分是搶占完成后的ipc表現(xiàn)。搶占發(fā)生時,未被搶占的kernel仍在繼續(xù)運行,而被搶占的kernel需要先將相關(guān)的上下文保存到內(nèi)存中,這其中涉及到大量的內(nèi)存訪問操作。根據(jù)實際測試情況可知,當未被搶占的kernel屬于內(nèi)存密集型類型的kernel時,其ipc會減小到原來的83%~97%不等,而計算密集型的kernel基本不受影響,因此根據(jù)kernel的類型,decay_rate定義如下:
kernel∈memory_intensive表示為未被搶占的kernel屬于內(nèi)存密集型kernel,kernel∈compute_intensive表示為未被搶占的kernel屬于計算密集型kernel。
搶占過程所占用的時鐘周期數(shù)受到兩個因素的影響:第一個因素為被換出的kernel的上下文的大小,其中包括該所占用的tb,以及每個tb所占用的寄存器數(shù)量和共享內(nèi)存的大小,這些數(shù)量決定了保存完整上下文所需要執(zhí)行的內(nèi)存訪問操作的數(shù)量,通過統(tǒng)計測試結(jié)果可知,搶占過程所持續(xù)的cycle數(shù)與所要保存的字節(jié)數(shù)成正相關(guān),且可通過線性模型對兩者的關(guān)系進行擬合;另一個因素是未被換出的kernel執(zhí)行內(nèi)存訪問操作的頻繁程度,由于搶占過程中涉及到較多的內(nèi)存操作,若未被搶占的kernel也涉及到較多的內(nèi)存操作,會更加拖慢搶占過程,可通過l2cachemiss的頻率來衡量kernel涉及內(nèi)存操作的頻率,研究過程中發(fā)現(xiàn),搶占過程cycle數(shù)和上下文切換字節(jié)數(shù)的線性模型的斜率與正在運行的kernel的cachemiss頻率成正相關(guān),且成線性關(guān)系。因此搶占過程的cycle數(shù)可大致擬合以下關(guān)系式:
preempt_cycle=(0.09526×miss_rate+0.01633)×(reg+smem)×tb。
搶占過程中歸一化ipc定義為:norm_ipcrunning1×decay_rate×preempt_cycle。
搶占后的ipc無法精確得知,可通過歷史數(shù)據(jù)獲取一個經(jīng)驗值,搶占后的歸一化ipc定義為:
根據(jù)搶占前歸一化ipc和搶占后歸一化ipc的對比獲取搶占程序后的gpu性能提升,即具體地,計算搶占前歸一化ipc和搶占后歸一化ipc的差值,獲取搶占程序后的gpu性能提升。
此外,本實施例還提供一種芯片,所述芯片為異構(gòu)多核硬件結(jié)構(gòu),所述芯片內(nèi)裝設(shè)有如上所述的gpu任務(wù)調(diào)度系統(tǒng)1001。上述已經(jīng)對所述gpu任務(wù)調(diào)度系統(tǒng)1001進行了詳細說明,在此不再贅述。
為使本領(lǐng)域技術(shù)人員進一步理解本實施例中的gpu任務(wù)調(diào)度系統(tǒng)100和方法,如圖4所示,以下以具體實例說明本實施例中g(shù)pu任務(wù)調(diào)度系統(tǒng)100和方法的實施過程。
于本實施例中,底層硬件是一個基于numa(nonuniformmemoryaccessarchitecture,非統(tǒng)一內(nèi)存訪問)內(nèi)存系統(tǒng)的異構(gòu)多核架構(gòu)。
1、用戶編寫應(yīng)用程序:屬于應(yīng)用層,用戶按照gpu編程規(guī)范,編寫能在gpu上運行的kernel程序。
2、用戶提交應(yīng)用請求:用戶將應(yīng)用提交給調(diào)度層。
3、應(yīng)用分析模塊110分析應(yīng)用:應(yīng)用分析模塊110接收到用戶提交的請求,分析用戶提交的應(yīng)用,判斷應(yīng)用所屬的類型以及估計應(yīng)用的指令數(shù)。
4、提交應(yīng)交到動態(tài)任務(wù)調(diào)度模塊120:應(yīng)用分析模塊110將應(yīng)用以及相關(guān)的分析數(shù)據(jù)提交到動態(tài)任務(wù)調(diào)度模塊120。
5、查看當前運行kernel狀態(tài):動態(tài)調(diào)度模塊向運行時系統(tǒng)層查詢當前運行的kernel數(shù)量。
6、若未達到運行數(shù)量上限,則從被搶占的kernel以及新到達的knew中挑選與當前運行kernel組合優(yōu)先級最高的kpreempted并進行發(fā)射。
7、若已達到運行數(shù)量上限,則判斷是否需要進行搶占。判斷被搶占的kernel以及新到達的knew中是否存在與當前運行kernel進行組合得到更高優(yōu)先級的kernel。
8、若存在更優(yōu)的組合,則判斷搶占后的性能提升能否掩蓋搶占的開銷。
9.、若能掩蓋,則進行搶占。
綜上所述,本發(fā)明提供了一個高性能的gpu搶占式任務(wù)調(diào)度系統(tǒng),其基于硬件式搶占機制和高性能任務(wù)調(diào)度算法,可以在無需升級硬件設(shè)備的情況下,應(yīng)對應(yīng)用請求動態(tài)到達的情況,有效降低延遲,提高資源利用率,提高gpu的性能;本發(fā)明的成果可以用于構(gòu)建具有商業(yè)意義的、基于cpu和異構(gòu)計算芯片gpu的異構(gòu)數(shù)據(jù)中心,面向用戶提供程序動態(tài)任務(wù)調(diào)度服務(wù);本發(fā)明簡單實用,具有良好的市場前景和廣泛的適用性。所以,本發(fā)明有效克服了現(xiàn)有技術(shù)中的種種缺點而具高度產(chǎn)業(yè)利用價值。
上述實施例僅例示性說明本發(fā)明的原理及功效,而非用于限制本發(fā)明。任何熟悉此技術(shù)的人士皆可在不違背本發(fā)明的精神及范疇下,對上述實施例進行修飾或改變。因此,舉凡所屬技術(shù)領(lǐng)域中具有通常知識者在未脫離本發(fā)明所揭示的精神與技術(shù)思想下所完成的一切等效修飾或改變,仍應(yīng)由本發(fā)明的權(quán)利要求所涵蓋。