@[TOC](Linux drm內(nèi)存管理(一) 為什么我們需要TTM和GEM?)
系列文章(更新中):
Linux drm內(nèi)存管理(二) TTM內(nèi)存管理基礎概念
前言
??目前Kernel中DRM中GPU的VRAM(GPU片上顯存)的管理框架是有GEM和TTM,其中TTM早于GEM出現(xiàn),GEM的出現(xiàn)是為了解決TTM復雜的使用方法,將大部分的VRAM管理實現(xiàn)邏輯交由廠商實現(xiàn)。
正文
??如果你看了何總的GEM相關的博客,我這里額外補充一點我了解到的知識點,我們都知道了內(nèi)核層的GEM指向或者說包含一片內(nèi)存,應用層只能獲取到GEM的handle,但是可以通過mmap獲取到內(nèi)核層GEM所指向的內(nèi)存,從而實現(xiàn)CPU讀寫。
??GPU可以使用自己的片上顯存,同時也能使用CPU的內(nèi)存。假設我們GEM指向的內(nèi)存都在GPU的片上顯存上,那我們多次創(chuàng)建和釋放GEM,片上顯存是如何實現(xiàn)管理的?比如第一個GEM指向的是GPU的0-16MB,第二個GEM指向的是16-32MB,第三個GEM指向的是CPU的某塊內(nèi)存。很明顯GEM只能負責完成內(nèi)存的映射,我們額外需要一個管理GEM的框架去管理顯存的分配,或者說我們需要一個框架去統(tǒng)一GPU的內(nèi)存尋址總線
思考
??我看GEM和TTM還有AMD DRM的源碼一直在思考一個問題,為什么要創(chuàng)建GEM\TTM框架去管理GPU的VRAM?
??我們都知道CPU的內(nèi)存 在Linux中通過伙伴系統(tǒng)進行管理,為什么GPU不能簡單套用CPU的內(nèi)存管理子系統(tǒng),而要額外創(chuàng)建GEM和TTM框架來管理GPU的VRAM?
??CPU 使用內(nèi)存的方法:直接用alloc_pages向伙伴系統(tǒng)申請page,伙伴系統(tǒng)找一片空閑的內(nèi)存返回,或者通過slab\slub\CMA\shmem等子系統(tǒng)間接申請page,申請成功后再對這些page進行讀寫。
??GPU和CPU類似,想辦法在顯存中找一片空閑的區(qū)域,成功找到后再對這片區(qū)域讀寫。共同點都是申請一片內(nèi)存區(qū)域,然后讀寫使用,為什么GPU要用GEM和TTM進行管理呢?
根本原因上面提到過,GPU的內(nèi)存總類很多,尋址總線無法統(tǒng)一
GPU使用內(nèi)存相比CPU有以下缺點
1.GPU的內(nèi)存種類多
??GPU有獨顯也有核顯,核顯借用CPU的RAM當作VRAM,獨顯有著自己的VRAM,當然也可以借用CPU的RAM當作VRAM,GPU的內(nèi)存種類多,既能訪問自己的顯存,也能訪問CPU的內(nèi)存,GPU的內(nèi)存總線沒有統(tǒng)一,不同的bus訪問方式甚至物理屬性不同(解釋下屬性不同:如果Texture放RAM中,S3睡眠的時候內(nèi)存是不斷電的,如果Texture放VRAM中,S3睡眠數(shù)據(jù)全丟了),所以CPU內(nèi)存管理框架無法運用在GPU上。
2.CPU與GPU之間帶寬有限
??內(nèi)存直接掛在CPU的地址和數(shù)據(jù)總線上,CPU訪問自己的內(nèi)存很簡單。
??GPU一般是掛在CPU的外設總線上例如PCIE上,所以GPU的VRAM地址需要映射后訪問。CPU和GPU不是直連,通訊帶寬是有限的,我們當然可以通過將IO映射到總線上來,通過MMIO直接進行數(shù)據(jù)傳輸,但是訪問會不斷的觸發(fā)外設的數(shù)據(jù)傳輸,而CPU和GPU的帶寬肯定沒有CPU和內(nèi)存之間的帶寬大,最好還是得借助老朋友DMA,去節(jié)省有限的帶寬
3.GPU的內(nèi)存使用方式與CPU不同
??GPU的使用上,往往使用一片顯存作為最小使用單位,例如一個Texture,Shader,而非單個字節(jié)做為最小單位。實際上對于應用層來說,我們不關心Texture被分配會在顯存的哪個位置,也不關心Texture是如何分配的,所以我們建立Buffer Object(BO)的概念,作為GPU顯存使用的最小單位。
??綜上,這就是GPU內(nèi)存管理框架產(chǎn)生的原因,我們需要一套框架去管理BO的分配與釋放,這套內(nèi)存管理框架和核心思想:應用層并不需要在乎我們BO被分配在哪,但是內(nèi)核層需要去處理GPU不同的bus,將bo放在合適的位置(例如VRAM或者是CPU的RAM)
TTM與GEM有什么不同
??TTM是用GEM的實現(xiàn)內(nèi)存管理框架(AMD提出),GEM一般被GPU廠商嵌入自己的數(shù)據(jù)結構,構造自己的內(nèi)存管理框架。文章來源:http://www.zghlxwxcb.cn/news/detail-418960.html
BO主要的應用場景實現(xiàn)區(qū)別
1.BO需要從VRAM 轉(zhuǎn)移到 RAM,或者是從RAM轉(zhuǎn)移到VRAM。(TTM提供實現(xiàn)接口)
2.BO需要將指向的內(nèi)存映射出來,供應用層CPU訪問。(TTM/GEM提供實現(xiàn)接口)
所以說TTM要比GEM復雜。文章來源地址http://www.zghlxwxcb.cn/news/detail-418960.html
到了這里,關于Linux drm內(nèi)存管理(一) 淺談TTM與GEM,為什么我們需要TTM和GEM?的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!