本發(fā)明是關于計算機領域,具體涉及數(shù)據分析和并行計算領域,尤其涉及一種基于gpu片上的數(shù)據處理方法。
背景技術:
gpu早期用于圖形處理,之后逐漸用于一般的計算任務,利用gpu的眾核特性進行并行計算,加速任務處理。雖然gpu的每個性能在計算能力上弱于cpu的性能,但其內核數(shù)量遠多于cpu內核。實驗表明,對于一般可并行的計算任務而言,gpu的性能可達到cpu的數(shù)十倍。由于gpu結構的特殊性,一般用于對可高度并行的任務進行加速,而對于其他任務的加速效果可能尚不足以彌補cpu與gpu之間轉換所消耗的代價。通常情況下,在多數(shù)實際系統(tǒng)部署中,任務處理以cpu為主,其中可高度并行的部分使用gpu處理,提高任務處理速度。
由于gpu的計算吞吐率的增長速度遠大于其片下存儲帶寬的增長,因此要充分合理的利用片上存儲才能有效的利用gpu的計算資源。不同gpu片上存儲的容量增長速度不同,如寄存器文件的容量增長速度比共享資源的容量增長速度快很多,因此在一個gpu上的最優(yōu)化執(zhí)行代碼并不一定適用于其他gpu。現(xiàn)有的gpu程序性能優(yōu)化方法主要通過修改gpu程序代碼,受限于應用程序類別和gpu設備參數(shù),該優(yōu)化方法的通用性和可移植性較差。
對于應用開發(fā)者而言,手動調節(jié)片上存儲的問題主要表現(xiàn)在:一是gpu的三類片上存儲均對性能有所影響,但對于某個應用中指定的數(shù)據元素而言,很難確定合適的片上存儲資源的分配情況;二是不同時期gpu之間資源的發(fā)展是非線性的,因此不同gpu的最優(yōu)化片上資源使用情況也不同。
技術實現(xiàn)要素:
本發(fā)明提出一種gpu片上的數(shù)據處理方法,對給定的gpu程序自動進行片上存儲空間的優(yōu)化,從而提高gpu程序的處理性能。
為了達到上述目的,本發(fā)明采用的技術方案為:
一種基于gpu片上的數(shù)據處理方法,包括以下步驟:分析gpu程序代碼,統(tǒng)計當前gpu片上共享存儲空間的所有數(shù)組變量;將統(tǒng)計得到的所有數(shù)組變量按訪問次數(shù)排序;選擇訪問次數(shù)最高的數(shù)組變量從共享存儲空間遷移到寄存器或l1緩存;若遷移后的系統(tǒng)性能優(yōu)于遷移前的性能,則從共享存儲空間中遷移出更多的數(shù)組變量,否則終止。
優(yōu)選的,統(tǒng)計當前gpu片上共享存儲空間的所有數(shù)組變量,包括采用變量統(tǒng)計流程(collectarray)統(tǒng)計當前gpu程序中存儲在片上共享存儲空間的所有數(shù)組變量。
優(yōu)選的,變量統(tǒng)計流程(collectarray)包括:分析編程序代碼;找出其中所有存儲在片上共享存儲空間內的數(shù)組變量,記為smarray。
優(yōu)選的,統(tǒng)計當前gpu片上共享存儲空間的所有數(shù)組變量,包括采用參數(shù)統(tǒng)計流程(collectlnfo)統(tǒng)計每個共享存儲數(shù)組變量的相關參數(shù)。
優(yōu)選的,參數(shù)統(tǒng)計流程(collectlnfo)包括:統(tǒng)計smarray中每個共享存儲數(shù)組變量的參數(shù)信息,包括訪問次數(shù)、是否被多線程訪問以及下標是否為常數(shù)三個參數(shù);對于smarray中某個數(shù)組變量arrayi而言,其訪問次數(shù)記為arrayi.count。依次遍歷gpu程序,若數(shù)組變量arrayi的該次訪問在條件語句中,則假設本次訪問有一半的概率可被執(zhí)行,即arrayi.count+=0.5;若本次訪問在循環(huán)體內且循環(huán)次數(shù)為常數(shù),則訪問次數(shù)arrayi.count+=loops,若循環(huán)體次數(shù)為變量則arrayi.count+=loops_app,其中l(wèi)oops表示常量的循環(huán)次數(shù),loops_app表示近似的非常量的循環(huán)次數(shù);loops_app是經驗值;對于smarray中某個數(shù)組變量arrayi而言,該參數(shù)記為arrayi.threads,如果數(shù)組變量arrayi在某次訪問中被多個線程訪問則arrayi.threads=true,否則arrayi.threads=false;對于smarray中某個數(shù)組變量arrayi而言,該參數(shù)記為arrayi.constant,如果數(shù)組變量arrayi的長度為常量則arrayi.constant=true,否則arrayi.constant=false。
優(yōu)選的,將統(tǒng)計得到的所有數(shù)組變量按訪問次數(shù)排序,包括采用變量排序流程(sortarray)將所有共享存儲數(shù)組變量按其訪問次序從高到低排序,具體為:調用程序開發(fā)平臺集成的快速排序函數(shù);將smarray中的數(shù)組變量按照每個數(shù)組變量的訪問次數(shù)從高到低排序。
優(yōu)選的,選擇訪問次數(shù)最高的數(shù)組變量從共享存儲空間遷移到寄存器或l1緩存,包括采用變量遷移流程(promotearray)將部分共享存儲數(shù)組變量從共享存儲空間遷移到其他片上存儲空間。
優(yōu)選的,變量遷移流程(promotearray)包括:選擇當前smarray中訪問次數(shù)最高的數(shù)組變量arrayi;若arrayi.threads=false且arrayi.constant=true,則arrayi遷移到寄存器中,否則遷移到l1緩存中;進一步判斷若arrayi.threads=false且arrayi.constant=false,則arrayi遷移到l1緩存的局部存儲空間中;否則遷移到l1緩存的全局存儲空間中。
優(yōu)選的,若遷移后的系統(tǒng)性能優(yōu)于遷移前的性能,則從共享存儲空間中遷移出更多的數(shù)組變量,否則終止包括:估算數(shù)組變量arrayi遷移后的任務處理時間new_runtime,若new_runtime>current_runtime,則撤銷本次遷移操作并終止整個優(yōu)化過程;否則將數(shù)組變量arrayi從smarray中刪除,并重復執(zhí)行promotearray()算法。
一種采用基于gpu片上的數(shù)據處理方法的數(shù)據處理設備,數(shù)據處理設備內部設有gpu(圖形處理器)。
與現(xiàn)有技術相比,本發(fā)明的優(yōu)點和積極效果在于:
1、本發(fā)明可以與傳統(tǒng)的提升gpu程序性能的方法共同使用,在傳統(tǒng)的優(yōu)化方法基礎上進一步提高性能;
2、可以自主執(zhí)行,不需要應用程序開發(fā)者手動對gpu程序修改;
3、適用性很廣,可以適用于各種類型的gpu應用程序以及當前所有的gpu設備,但對性能的提升程度與具體的應用類型和gpu設備有關。
附圖說明
通過閱讀參照以下附圖所作的對非限制性實施例所作的詳細描述,本申請的其它特征、目的和優(yōu)點將會變得更明顯:
圖1總體方案流程框圖
圖2變量統(tǒng)計流程框圖
圖3參數(shù)統(tǒng)計流程框圖
圖4變量排序流程框圖
圖5變量遷移流程框圖
圖6變量遷移流程框圖
具體實施方式
本發(fā)明提出一種基于gpu片上的數(shù)據處理方法,對給定的gpu程序自動進行片上存儲空間的優(yōu)化,從而提高gpu程序的處理性能。
collectarray():用于統(tǒng)計當前gpu程序中的所有共享存儲數(shù)組變量;
collectlnfo():用于統(tǒng)計每個共享存儲數(shù)組變量的相關參數(shù);
sortarray():用于將共享存儲數(shù)組變量按訪問次數(shù)的降序排序;
promotearray():用于確定將那些共享存儲數(shù)據變量的遷移到其他存儲空間;
collectvariables():用于優(yōu)化共享存儲數(shù)組變量及其相關參數(shù)的統(tǒng)計過程;
下面結合附圖和實施例對本申請作進一步的詳細說明??梢岳斫獾氖?,此處所描述的具體實施例僅僅用于解釋相關發(fā)明,而非對該發(fā)明的限定。另外還需要說明的是,為了便于描述,附圖中僅示出了與發(fā)明相關的部分。
需要說明的是,在不沖突的情況下,本申請中的實施例及實施例中的特征可以相互組合。下面將參考附圖并結合實施例來詳細說明本申請。
總體方案如下,如圖1所示:
101、首先分析gpu程序代碼,統(tǒng)計當前片上共享存儲空間的所有數(shù)組變量,包括每個數(shù)組變量的訪問次數(shù)、是否用于多線程通信、數(shù)組下表是否為常量等參數(shù)。
102、其次將統(tǒng)計得到的所有數(shù)組變量按訪問次數(shù)排序。
103、然后選擇訪問次數(shù)最高的數(shù)組變量從共享存儲空間遷移到寄存器或l1緩存。
104、若遷移后的系統(tǒng)性能優(yōu)于遷移前的性能,則從共享存儲空間中遷移出更多的數(shù)組變量,否則終止優(yōu)化流程。
具體實施方式如下,變量統(tǒng)計流程框圖如圖2所示:
201、分析代碼:首先利用gpu程序編譯工具對當前gpu程序進行編譯。
202、找出變量:然后找出其中所有存儲在片上共享存儲空間內的數(shù)組變量。
203、記為smarray。
參數(shù)統(tǒng)計流程框圖如圖3所示:
301、統(tǒng)計參數(shù):統(tǒng)計smarray中每個共享存儲數(shù)組變量的參數(shù)信息,包括訪問次數(shù)、是否被多線程訪問以及下標是否為常數(shù)三個參數(shù)。
302、arrayi的長度為常量:對于smarray中某個數(shù)組變量arrayi而言,該參數(shù)記為arrayi.constant,如果數(shù)組變量arrayi的長度為常量則arrayi.constant=true,否則arrayi.constant=false。
303、arrayi的次數(shù)為常量:對于smarray中某個數(shù)組變量arrayi而言,其訪問次數(shù)記為arrayi.count。依次遍歷gpu程序,若數(shù)組變量arrayi的該次訪問在條件語句中,則假設本次訪問有一半的概率可被執(zhí)行,即arrayi.count+=0.5;若本次訪問在循環(huán)體內且循環(huán)次數(shù)為常數(shù),則訪問次數(shù)arrayi.count+=loops,若循環(huán)體次數(shù)為變量則arrayi.count+=loops_app,其中l(wèi)oops表示常量的循環(huán)次數(shù),loops_app表示近似的非常量的循環(huán)次數(shù)。loops_app是經驗值,其獲取方法如下:統(tǒng)計開源的gpu標準測試程序或其他業(yè)務相關的gpu程序在運行過程中,每個循環(huán)次數(shù)為不確定的循環(huán)體的實際執(zhí)行次數(shù),然后將其累加并求得平均執(zhí)行次數(shù)即為loops的近似取值。
304、arrayi被多線程訪問:對于smarray中某個數(shù)組變量arrayi而言,該參數(shù)記為arrayi.threads,如果數(shù)組變量arrayi在某次訪問中被多個線程訪問則arrayi.threads=true,否則arrayi.threads=false。
變量排序流程框圖如圖4所示:
401、調用程序開發(fā)平臺集成的快速排序函數(shù)。
402、按訪問次數(shù)排序:將smarray中的數(shù)組變量按照每個數(shù)組變量的訪問次數(shù)從高到低排序。
變量遷移流程框圖如圖5、圖6所示:
變量遷移是一個迭代過程,每次迭代判斷是否需要將當前smarray中訪問次數(shù)最高的共享存儲數(shù)組變量遷移到其他存儲空間。
501、arrayi遷移到寄存器:首先選擇當前smarray中訪問次數(shù)最高的數(shù)組變量arrayi而言,若arrayi.threads=false且arrayi.constant=true,則arrayi遷移到寄存器中。
502、arrayi遷移到l1緩存的局部存儲空間:進一步判斷若arrayi.threads=false且arrayi.constant=false,則arrayi遷移到l1緩存的局部存儲空間中。
503、arrayi遷移到l1緩存的全局存儲空間:否則遷移到l1緩存的全局存儲空間中。
600、然后,估算數(shù)組變量arrayi遷移后的任務處理時間new_runtime,若new_runtime>current_runtime,則撤銷本次遷移操作并終止整個優(yōu)化過程;否則將數(shù)組變量arrayi從smarray中刪除,并重復執(zhí)行promotearray()算法。
變量統(tǒng)計和參數(shù)統(tǒng)計在執(zhí)行過程中需要多次遍歷gpu程序,時間開銷較大。為了提高系統(tǒng)的效率,變量統(tǒng)計和參數(shù)統(tǒng)計在執(zhí)行可同時執(zhí)行,在一次遍歷gpu程序的過程中完成smarray及每個數(shù)組變量所有參數(shù)的統(tǒng)計。因為在gpu程序中變量需要先聲明后才能使用,因此可以確定每個數(shù)組變量arrayi是否存儲在共享存儲空間中,然后再統(tǒng)計arrayi.count、arrayi.threads、arrayi.constant等相關參數(shù)。
具體算法表述如下:
其中,所述kernal和list均為gpu程序的變量類型,kernal為當前的gpu程序,smarray為kernal中所有共享存儲數(shù)組變量的列表,!eof(kernal)表示順序遍歷kernal程序直到遍歷完整個程序為止,arrayi表示kernal中的一個共享存儲數(shù)組變量,smarray.add(arrayi)表示將arrayi表插入到列表smarray中,arrayi.count參數(shù)為浮點類型,表示數(shù)組變量arrayi的訪問次數(shù),arrayi.threads和arrayi.constant參數(shù)均為布爾類型,分別表示數(shù)組變量arrayi是否被多線程訪問和是否為常數(shù)下標,access表示對數(shù)組變量arrayi的訪問。
通過上述過程,提供一種gpu片上的數(shù)據處理方法,可以與當前的更新設備和手動優(yōu)化gpu程序的方法項結合,適用于各類gpu應用程序也可以在各種gpu設備上進行移植,尤其適用于大數(shù)據領域,可以對gpu程序的性能進行一定的提升。
以上描述僅為本申請的較佳實施例以及對所運用技術原理的說明。本領域技術人員應當理解,本申請中所涉及的發(fā)明范圍,并不限于上述技術特征的特定組合而成的技術方案,同時也應涵蓋在不脫離所述發(fā)明構思的情況下,由上述技術特征或其等同特征進行任意組合而形成的其它技術方案。例如上述特征與本申請中公開的(但不限于)具有類似功能的技術特征進行互相替換而形成的技術方案。