孫立明,吳慶波
(國防科技大學(xué) 計算機學(xué)院,湖南 長沙 410073)
國產(chǎn)飛騰1500A處理器的顯存管理優(yōu)化
孫立明,吳慶波
(國防科技大學(xué) 計算機學(xué)院,湖南 長沙 410073)
基于飛騰1500A處理器的計算機系統(tǒng)中,現(xiàn)有操作系統(tǒng)圖形子系統(tǒng)主存和顯卡VRAM(顯存)之間拷貝圖形運算數(shù)據(jù)時會產(chǎn)生段錯誤,導(dǎo)致圖形子系統(tǒng)只能使用主存作為顯存而不能直接使用VRAM。由于顯卡訪問主存比訪問VRAM的速度慢很多,因此在某些場景下限制了顯卡的工作效率,從而限制了圖形子系統(tǒng)的性能。為此,提出了一種基于飛騰1500A處理器的圖形系統(tǒng)顯存管理的優(yōu)化方法,讓圖形子系統(tǒng)能夠訪問顯卡VRAM,以達到提升性能的目的。該方法把圖形子系統(tǒng)劃分為固定組件和流動組件兩類。對于固定組件,采用飛騰1500A訪問I/O設(shè)備的指令替換內(nèi)存拷貝指令,使固定組件能夠直接訪問VRAM,從而將圖形數(shù)據(jù)拷貝到VRAM中,以提高顯卡工作效率;對于流動組件,則繼續(xù)使用主存作為顯存。實驗結(jié)果表明,采用該管理方法后,基于飛騰1500A處理器的計算機圖形顯示整體性能在某些顯卡中大幅提升,其中3D顯示性能有數(shù)倍的提升,并且不會產(chǎn)生段錯誤;即使對2D圖形大概有10%的性能下降,亦能適于運行大量3D圖形應(yīng)用的場景。
圖形子系統(tǒng);顯示優(yōu)化;顯存;VRAM
國產(chǎn)飛騰1500A處理器是國防科大研制的自主可控國產(chǎn)CPU,采用ARMv8[1]指令集。飛騰1500A處理器有一個獨特的特征,與其他處理器包括同樣采用ARMv8指令集的處理器都不同。飛騰1500A處理器的內(nèi)存訪問指令分為兩類,一類是普通的ld/st訪存指令,可以訪問所有的CPU地址空間[2];另外一類是ldp/stp指令,只能訪問主存地址范圍,不能訪問外設(shè)地址范圍。
ldp/stp指令,在訪問內(nèi)存時,一條指令可以攜帶兩個64比特數(shù)據(jù),從而在一條指令中同時傳輸128比特數(shù)據(jù),而普通的ld/st指令,只攜帶一個數(shù)據(jù),一條指令最多同時傳輸64比特數(shù)據(jù)。很顯然,數(shù)據(jù)拷貝時,使用ldp/stp指令能夠獲得更高的傳輸性能。事實上,基于飛騰1500A處理器的計算機系統(tǒng)中的大量數(shù)據(jù)拷貝操作(如memcpy函數(shù))基本都是調(diào)用ldp/stp指令來進行的。
基于飛騰1500A處理器的計算機系統(tǒng)采用的顯卡是獨立顯卡[3],顯卡上有自帶的顯存,稱為VRAM顯存。顯然顯卡訪問VRAM顯存的地址是處于外設(shè)地址范圍的。顯卡也可以使用系統(tǒng)主存作為顯存,這種類型的顯存稱為GTT顯存。顯卡訪問VRAM顯存的速度要比訪問GTT顯存的速度高出很多[4],一般來說,使用VRAM顯存會獲得更高的顯示性能。
現(xiàn)有操作系統(tǒng)中的圖形子系統(tǒng)主要由應(yīng)用層的Xorg server[5](一種圖形窗口系統(tǒng)服務(wù)程序)、Xorg client(圖形窗口系統(tǒng)應(yīng)用程序,比如gnome桌面等)、DRI[6](3D圖形程序的直接加速渲染框架,為3D[7]應(yīng)用程序提供OpenGL[8]編程接口)、3D圖形程序以及內(nèi)核層的DRM[9]驅(qū)動組成。其中內(nèi)核層的DRM為圖形子系統(tǒng)提供顯存管理、模式設(shè)置及GPU命令提交[10]等功能。圖形子系統(tǒng)中各組成部分使用的顯存由DRM統(tǒng)一管理,當(dāng)圖形應(yīng)用程序或者Xorg server等需要使用顯存時,向DRM申請分配顯存,當(dāng)顯存不再使用時,也由DRM來釋放。
圖形子系統(tǒng)在工作過程中,會產(chǎn)生大量的從主存拷貝的圖形數(shù)據(jù)到顯存中的數(shù)據(jù)拷貝操作,這些數(shù)據(jù)拷貝操作有些是調(diào)用的通用的memcpy函數(shù),有些是圖形應(yīng)用程序自己實現(xiàn)的拷貝函數(shù)。但在基于飛騰1500A處理器的計算機系統(tǒng)上,為了性能考慮,編譯器和操作系統(tǒng)都會把這些拷貝操作翻譯成ldp/stp指令。這時如果使用的是VRAM顯存,在基于飛騰1500A處理器的計算機系統(tǒng)上,則會產(chǎn)生段錯誤(由于ldp/stp指令不能訪問外設(shè)地址范圍)。
圖形子系統(tǒng)提供了參數(shù),能夠控制圖形子系統(tǒng)在工作時是使用GTT顯存還是VRAM顯存或者VRAM顯存與GTT顯存同時使用。由于上述原因,圖形子系統(tǒng)在基于飛騰1500A處理器的計算機系統(tǒng)只能使用GTT顯存(否則會產(chǎn)生段錯誤)。由于顯卡訪問GTT顯存速度較慢,從而導(dǎo)致圖形子系統(tǒng)顯示性能較差。
針對上述問題,提出了一種基于飛騰1500A處理器對顯存管理的優(yōu)化方法,可使圖形子系統(tǒng)利用VRAM顯存,從而提高基于飛騰1500A處理器的計算機系統(tǒng)的圖形顯示性能,且不會產(chǎn)生段錯誤。
基于飛騰1500A處理器的顯存管理優(yōu)化方法把圖形子系統(tǒng)劃分為兩類組件:固定組件和流動組件。把圖形子系統(tǒng)中常用的一些比較重要的組件劃分為固定組件,剩余的組件劃分為流動組件。對固定組件,用飛騰1500A能夠訪問I/O設(shè)備的指令替換內(nèi)存拷貝指令,從而使固定組件能夠使用VRAM。對流動組件,則依然使用主存作為顯存。固定組件涵蓋了圖形子系統(tǒng)中的大部分組件,在通常情況下它們的執(zhí)行時間占有整個圖形子系統(tǒng)執(zhí)行時間的絕大部分(有時甚至是100%)。因此用飛騰1500A能夠訪問I/O設(shè)備的指令替換內(nèi)存拷貝指令,讓固定組件能夠利用VRAM內(nèi)存,可以大大提高圖形系統(tǒng)的性能。同時對于沒有用飛騰1500A能夠訪問I/O設(shè)備的指令替換內(nèi)存拷貝指令的流動組件,仍然使用GTT顯存,所以也不會產(chǎn)生段錯誤。
1.1 圖形子系統(tǒng)的分類
為什么要對圖形子系統(tǒng)進行分類處理?要讓基于飛騰1500A處理器的圖形子系統(tǒng)能夠訪問VRAM顯存,把所有的內(nèi)存拷貝指令都替換成飛騰1500A能夠訪問I/O設(shè)備的指令不就行了嗎?事實上這種方法是行不通的。
一個原因是內(nèi)存拷貝操作在操作系統(tǒng)中是一個很基本的操作,圖形子系統(tǒng)中會使用,拷貝圖形數(shù)據(jù)時也會使用。除拷貝圖形數(shù)據(jù)之外,操作系統(tǒng)中還有大量的數(shù)據(jù)拷貝操作,它們的使用頻率比拷貝圖形數(shù)據(jù)要高出很多。全部替換的話會大大降低整個系統(tǒng)的性能,得不償失。
那只替換圖形數(shù)據(jù)拷貝的操作不替換普通數(shù)據(jù)拷貝的操作是否可行?同樣不行。因為圖形軟件多種多樣,有些軟件比如mesa,Xorg等規(guī)模龐大,分析出每個數(shù)據(jù)拷貝操作進行逐個替換是一個近乎不可能完成的操作。
另一個原因是,有很大一部分的圖形應(yīng)用程序是第三方軟件,不可能對它們進行修改,而它們可能實現(xiàn)自己的數(shù)據(jù)拷貝函數(shù),不會調(diào)用通用的數(shù)據(jù)拷貝函數(shù)。對這種圖形應(yīng)用程序,不可能把它們的內(nèi)存拷貝指令都替換成飛騰1500A能夠訪問I/O設(shè)備的指令。
因此,要對圖形子系統(tǒng)進行分類,一類可以對它們進行指令替換操作,能夠使用VRAM顯存,把它們命名為固定組件;另一類依然使用GTT顯存,把它們命名為流動組件。
考慮圖形子系統(tǒng)中應(yīng)該把哪些組件劃分為固定組件,那么剩下的就歸類為流動組件。從上述可知,被劃分為固定組件的程序應(yīng)該具備如下幾個特征:
(1)不是第三方軟件,而應(yīng)該是操作系統(tǒng)的固定組成部分。這樣可以方便獲取源代碼并對其進行修改。這也是把它們命名為固定組件的原因。
(2)擁有大量的圖形數(shù)據(jù)拷貝操作,同時沒有或有少量的其他數(shù)據(jù)拷貝工作。
(3)它們應(yīng)該占據(jù)系統(tǒng)中圖形拷貝操作的絕大部分,否則不會產(chǎn)生明顯效果。
經(jīng)過篩選之后,把DRM、mesa(DRI)、Xorg server以及gnome桌面歸類為固定組件,其他程序歸類為流動組件。
對圖形子系統(tǒng)分好類之后,如何在圖形子系統(tǒng)中實現(xiàn)分類。
圖形子系統(tǒng)的顯存管理都是由DRM進行的。VRAM內(nèi)存和GTT內(nèi)存都是由DRM管理的。按使用顯存類型對圖形程序進行分類也是由DRM來實現(xiàn)。
實現(xiàn)方法如下:
DRM自身默認屬于固定組件。
對于位于應(yīng)用層的其他組件,都是通過ioctl系統(tǒng)調(diào)用請求DRM分配顯存的。在DRM的ioctl函數(shù)中增加一條ioctl命令-FORCE_VRAM,一旦接收到用戶層傳來的是該命令,則強制性為其分配VRAM顯存。
通過FORCE_VRAM命令,就可以劃分固定組件和流動組件了。應(yīng)用層程序請求顯存分配時如果傳遞下來的是FORCE_VRAM,則屬于固定組件,分配VRAM顯存;如果傳遞的是原來的命令,則屬于流動組件,分配GTT顯存。
1.2 對分類組件的處理
對分好類的組件進行處理主要是對固定組件進行處理,流動組件無需特別處理。對固定組件的處理分為兩點:
(1)修改向DRM請求顯存分配的方式,使用FORCE_VRAM命令分配VRAM顯存。
(2)用飛騰1500A能夠訪問I/O設(shè)備的指令替換內(nèi)存拷貝指令。
對于第一點,方法如下:
在libdrm中實現(xiàn)一個新的顯存分配函數(shù),該函數(shù)調(diào)用ioctl系統(tǒng)調(diào)用攜帶FORCE_VRAM命令分配VRAM顯存。
修改固定組件的所有顯存分配代碼,調(diào)用1中新實現(xiàn)的顯存分配函數(shù)。
對于第二點,方法如下:
實現(xiàn)一個新動態(tài)連接庫,比如命名為libkymem.so,該連接庫中實現(xiàn)新的內(nèi)存拷貝相關(guān)函數(shù):比如把新的函數(shù)命名為kymemcpy,kymemset,kymemmove。
在這些新的函數(shù)中用普通的內(nèi)存訪問指令ld/st(能夠訪問io地址范圍的指令)替換ldp/stp指令,實現(xiàn)內(nèi)存拷貝操作。
修改固定組件中調(diào)用memcpy,memset,memmove等函數(shù)的位置,改為調(diào)用libkymem.so中的kymemcpy,kymemset,kymemmove函數(shù)。
把libkymem.so放入系統(tǒng)中。
進行上述兩點處理后,固定組件在工作時就使用VRAM顯存了,而流動組件還是保持原來的調(diào)用方式不變,因此繼續(xù)使用GTT內(nèi)存。固定組件修改了內(nèi)存拷貝指令,而流動組件使用GTT內(nèi)存,因此在內(nèi)存數(shù)據(jù)拷貝時都不會產(chǎn)生段錯誤。
固定組件使用VRAM內(nèi)存后,由于顯卡訪問VRAM顯存的效率大大高于訪問主存,因此顯卡的工作效率有極大提升。由于固定組件在系統(tǒng)的工作中占據(jù)顯示工作的絕大部分比例,因此基于飛騰1500A處理器的計算機系統(tǒng)的整個顯示性能都會有明顯提升。
基于該方法把圖形子系統(tǒng)劃分為兩類組件:固定組件和流動組件。對固定組件,在飛騰1500A的銀河麒麟操作系統(tǒng)上實現(xiàn)了上述方法,并在HD5450,HD7450,HD7750以及R9 270四款顯卡做了對比測試,分別測試了系統(tǒng)的2D圖形顯示性能,3D圖形顯示性能,以及常用的OpenGL圖形編程及Gtk圖形編程的圖形顯示性能。其中,2D圖形測試、3D圖形測試、OpenGL圖形編程、Gtk圖形編程的測試用例分別是X11perf[11]、glxgears[12]、glmark2[13]、Gtkperf。
圖形測試結(jié)果如圖1~6所示(X11perf由于測試結(jié)果過多,選取了比較有代表性的畫點,畫100像素線段及畫100像素橢圓的測試數(shù)據(jù))。
圖1 glxgears的測試結(jié)果(單位:FPS)
通過測試結(jié)果可以看出,該優(yōu)化方法并不能全面提高2D和3D的圖形顯示性能,其中2D圖形性能還稍微有些下降,3D圖形性能有明顯提升(大概有幾倍)。在體現(xiàn)圖形系統(tǒng)的綜合性能的Gtkperf測試中,對有些顯卡的圖形性能有明顯提升,而glmark2測試中圖形系統(tǒng)性能則有大幅提升。主要是因為在2D圖形環(huán)境下,顯卡的圖形運算壓力并不大,而CPU會有大量的圖形數(shù)據(jù)處理工作,因此CPU的圖形數(shù)據(jù)處理速度就成為瓶頸,CPU每次要把數(shù)據(jù)寫入VRAM相比直接寫入內(nèi)存會慢很多,因此性能有所損失。而在3D圖形環(huán)境下,圖形運算壓力大,而CPU可能經(jīng)常處于空閑狀態(tài),顯卡經(jīng)常需要等待數(shù)據(jù)到來,因此從VRAM取數(shù)據(jù)可以提升性能。
圖2 glmark2的測試結(jié)果
圖3 X11perf畫點的測試結(jié)果(單位:個/s)
圖4 X11perf畫100像素線段的測試結(jié)果(單位:個/s)
圖5 x11perf畫100像素橢圓的測試結(jié)果(單位:個/s)
圖6 Gtkperf的測試結(jié)果
綜合來看,該優(yōu)化方法在某些顯卡下能夠提升圖形子系統(tǒng)的整體性能,對3D圖形的性能有幾倍提升,而在2D圖形環(huán)境下的性能損失在10%左右,是可以接受的。因此該方法特別適于運行大量3D圖形應(yīng)用的場合。
基于飛騰1500A處理器的特征,針對當(dāng)前采用飛騰1500A處理器的計算機系統(tǒng)圖形子系統(tǒng)不能使用VRAM顯存的問題,提出了一種采用飛騰1500A處理器的計算機系統(tǒng)顯存優(yōu)化管理方法。該方法將圖形子系統(tǒng)分成固定組件和流動組件兩類,在飛騰1500A處理器中以能訪問IO地址范圍的指令替換內(nèi)存拷貝指令,使固定組件訪問VRAM顯存,從而實現(xiàn)顯示功能。實驗結(jié)果表明,該方法顯著提升了采用飛騰1500A處理器的計算機系統(tǒng)圖形顯示綜合性能,特別是數(shù)倍提高了3D顯示性能,尤其適用于運行大量3D圖形應(yīng)用的場合,且不會產(chǎn)生段錯誤。不足之處在于2D圖形應(yīng)用的性能會下降10%,但在當(dāng)前大量3D圖形應(yīng)用的條件下是可以接受的。
[1] Rusitoru R.ARMv8 micro-architectural design space exploration for high performance computing using fractional factorial[C]//International workshop on performance modeling.[s.l.]:[s.n.],2015.
[2] Jundt A,Cauble-Chantrenne A,Tiwari A,et al.Compute bottlenecks on the new 64-bit ARM[C]//Proceedings of the 3rd international workshop on energy efficient supercomputing.[s.l.]:[s.n.],2015.
[3] 趙 剛.計算機圖形顯示加速及實現(xiàn)技術(shù)[M].北京:電子工業(yè)出版社,2009.
[4] Carr N A,Hall J D,Hart J C.The ray engine[C]//Proceedings of ACM SIGGRAPH/Eurographics graphics hardware.[s.l.]:[s.n.],2002.
[5] 萬 華.基于X Window圖形分層顯示的實現(xiàn)[J].雷達科學(xué)與技術(shù),2000(1):26-29.
[6] Weo M,Neider J,Davis T.OpenGL programming guide[M].CA,USA:Silicon Graphics Inc.,1997.
[7] 吳恩華.圖形處理器用于通用計算的技術(shù)、現(xiàn)狀及其挑戰(zhàn)[J].軟件學(xué)報,2004,15(10):1493-1504.
[8] McReynolds T,Blythe D.Advanced graphics programming using OpenGL[M].San Francisco,CA,USA:Morgan Kaufmann Publishers Inc.,2005.
[9] Miller K,Przybyla D,Pegah M.Soothing the many-headed beast:improving the rendering process in the world of 3D animation[C]//SIGUCCS'04.[s.l.]:[s.n.],2004.
[10] 孫家廣.計算機圖形學(xué)[M].第3版.北京:清華大學(xué)出版社,1988.
[11] 賈志剛.精通OpenGL[M].北京:電子工業(yè)出版社,1998.
[12] 尚 游.OpenGL高級圖形編程指南[M].哈爾濱:哈爾濱工業(yè)大學(xué)出版社,1999.
[13] Sugita K.Performance evaluation of programmable graphics hardware for image filtering and stereo matching[C]//Proceedings of the ACM symposium on virtual reality software and technology.[s.l.]:ACM,2003.
Video Memory Management Optimization of Domestic Phytium 1500A Processor
SUN Li-ming,WU Qing-bo
(School of Computer Science,National University of Defense Technology,Changsha 410073,China)
In phytium 1500A processor-based computer system,the existing operating system graphics subsystem could produce segment errors when copying data between main memory and graphics card VRAM (video memory),which causes that the graphics subsystem can only use main memory as video memory and cannot be used VRAM directly.Because main memory access is so slower than accessing VRAM directly by graphics card that the problem in some scenes limits the efficiency of the graphics card,thereby limiting the performance of the graphics subsystem.Therefore,an optimization method of graphics system memory management with the Phytium 1500A processor has been presented,which permits the system equipped with graphics card VRAM,for the purpose of performance promotion.The graphics subsystem is composed of two types of components,fixed and mobile components.In the former of which the instructions of I/O devices can be used to replace memory copy instructions with Phytium 1500A processor by using VRAM which could copy the pattern data to the VRAM for efficiency promotion of the graphics card;in the latter of which the main memory can be used as video memory.Experimental results show that the Phytium 1500A processor-based computer graphics display performance has been significantly improved,wherein the 3D display performance has been promoted several times higher without mistake and that even if there is about 10% performance degradation for 2D graphics,the VRAM is also suitable for a large number of scenes with 3D graphics applications.
graphics subsystem;display optimization;video memory;VRAM
2016-06-17
2016-09-22 網(wǎng)絡(luò)出版時間:2017-03-13
國家“863”高技術(shù)發(fā)展計劃項目(2013AA01A212)
孫立明(1988-),男,碩士,研究方向為操作系統(tǒng)。
http://kns.cnki.net/kcms/detail/61.1450.TP.20170313.1547.096.html
TP39
A
1673-629X(2017)05-0006-04
10.3969/j.issn.1673-629X.2017.05.002