显存(Video Memory)
原文:http://happyseeker.github.io/kernel/2016/03/01/about-Video-Memory.html
閑話
在從事圖形優(yōu)化工作之前,一直對顯存(Video Memory)充滿了好奇,很想了解其管理方式、基本原理、與內存的區(qū)別等,但一直沒有時間和機會去研究,現(xiàn)在工作需要,逐漸開始接觸和了解,這里也順便記錄,以免后續(xù)忘記。
什么顯存?
顯存,即Video Memory,簡單來說,就是位于顯卡的內存,其主要用途當然是用作圖形顯示了,現(xiàn)在的家用pc中基本都配置了獨立顯卡,即使是集成顯卡,也有一定的顯存,否則一些游戲玩起來可能就費勁了。
為什么需要顯存?
隨著計算機硬件的飛速發(fā)展,現(xiàn)代的CPU、內存能力已經(jīng)超過了從前的想象,按理說,目前計算機中的主要瓶頸應該還在IO上,內存應該不至于成為瓶頸,那為什么需要顯存呢?
這個問題就如“為什么需要顯卡”一樣,之前的文章中應該做了解釋,所謂術業(yè)有專攻,顯卡專注于圖形顯示,更擅長于圖形顯示,而顯卡進行圖形顯示時是需要內存資源的,如果其所需的內存資源都從內存(CPU主存,后面簡稱內存)分配,那相對于使用顯卡自帶的內存,性能肯定有損耗。 這就跟NUMA節(jié)點中遠程訪問類似,雖然內存硬件本身的能力并不比顯存弱,但“距離”、“親疏關系”、“使用方式”等對其影響很大。
顯存管理
在Linux X11環(huán)境中,顯存通常是通過內核的DRM模塊進行管理,用戶態(tài)和內核程序都可以使用DRM提供的接口分配和釋放顯存。 用戶態(tài)程序通過Libdrm提供的用戶態(tài)接口(本質上為ioctl調用)來分配和釋放顯存。
DRM模塊中,最終使用TTM模塊在管理顯存(或內存)。 TTM模塊中,自己實現(xiàn)了一個內存pool,分配和釋放顯存(或內存)時,會先放到pool中,如此可以提高內存管理的效率,具體的原理和代碼就不深入討論了。
GTT VS. VRam
做過圖形研究的TX應該都了解GTT和VRam,GTT表示顯卡可以訪問的CPU主存,VRam表示顯存。 為什么要將這兩者進行比較呢? 因為對于軟件來說,GTT和VRam的地位是對等的,當軟件中(比如mesa驅動中)需要分配內存時,其可以選擇在內存上分配(分配標志設置為GTT相關的標記),也可以選擇在顯存上分配(分配標志設置為VRam相關的標記), 對于軟件來說,使用GTT或VRam并沒有功能上的影響,通常情況下,任意選哪種都沒有問題。 有影響的只是:
- 性能。 對于顯卡,通常來說,顯示需要的內存在VRam上分配,性能可能會更好,因為相關內存上的內容最終可能都會拷貝到framebuffer中去,而在顯存內存區(qū)域之間的拷貝,顯然比內存到顯存之間的拷貝性能更好。
- Cache一致性等問題。 對于部分硬件,Cache一致性問題可能是很多問題的根源,特別在涉及到CPU和GPU之間的同步和并發(fā)訪問時。 CPU和GPU對于GTT和VRam的訪問,可能會涉及到一些硬件的細節(jié)和特性,比如WC(Write Commbined)和UC(Uncached)特性,這些細節(jié)的處理,在非X86架構上尤其重要,特別是在驅動中,需要時刻考慮這些問題。
Framebuffer
再簡單聊下Framebuffer(后面有時間可單獨再聊),Framebuffer本質上就是一段緩存,通常就是顯存上的一段內存,其直接與最終顯示到終端上的內容對應,所有需要顯示到終端上的圖形內容都必須拷貝到Framebuffer中。
Framebuffer其實由多個buffer組成,這里不詳述。 但需要說明,通常Framebuffer中有前端和后端兩類buffer,就是我們平常見到的double buffer技術,目的是為了解決屏幕撕裂問題。 前端buffer直接對應于欲顯示的內容,需要顯示的數(shù)據(jù)先拷貝到后端buffer,再在一定的時機(比如vblank)將后端buffer的數(shù)據(jù)swap到前端,從而顯示出來。
總結
以上是生活随笔為你收集整理的显存(Video Memory)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 排序算法的代码--选择排序综合训练题
- 下一篇: element click interc