CPU和GPU內存訪問會衝突嗎?
CPU和GPU共享內存,CPU向內存(顯存)寫數據,GPU再從內存讀數據,兩者應該不能同時讀取內存,這樣的話,數據傳輸的速度是不是嚴重影響CPU和GPU的效率。有沒有其他解決辦法,比如兩條匯流排啥的。但是好像只要統一定址,就避免不了衝突。
是的,它們得排隊。因為內存讀寫要先鎖存了地址線然後從數據線讀寫數據。
不過內存讀寫非常的快,一次讀寫佔用時間也非常短,所以影響是有的,但並不嚴重。
至於數據傳輸的速度是不是影響GPU效率,是的,內存帶寬確實非常影響GPU效率,所以內存帶寬是GPU性能的重要檔次劃分。你看GDDR5內存的顯卡跟GDDR6內存的顯卡,性能就完全不是一個檔次。
但是內存帶寬對CPU的影響相對比較小,因為CPU一般並不需要如此大量的內存讀寫,除非這個CPU集成了GPU。
題主說到了cpu寫數據給gpu讀,那麼這裡的衝突應該是指同地址數據讀寫的衝突。
在驅動等底層軟體編寫正確時,實際運行時是不會衝突的。
cpu給gpu送數據時,在寫完之後再通知gpu可以讀取,gpu讀取時cpu不再向同一塊地址寫數據,這個是共享內存系統中最基本的同步操作。如果同地址衝突了,實際運行時的結果是不確定的。所以才要求軟體要正確使用同步機制來保證。
至於匯流排帶寬上的衝突,這個是gpu,cpu等爭搶帶寬,一般並不影響程序正確性,只是在處理不好qos時影響性能。
某些答案都不知道在說些啥東西。
看現有兩個答案 @木頭龍 @Kerbalism ,和我所理解的知識差別還是蠻大的。不知道哪個正確,我也說說我的理解,權當拋磚引玉,希望有大架構師過來答疑解惑。
如果GPU採用獨立的顯存。那很明顯,不會衝突。但顯存也就只能GPU自己用了,有點浪費,因此採用共享內存的方法。讓CPU管理的內存也分配一些給GPU來用。所以,這種情況下,所有的內存都是CPU體系裡面的,或者說,是CPU定址空間內統一管理的。只不過,在MMU,BIOS或者操作系統層面,划出一部分,給GPU用,告訴CPU不要用。
雖然CPU不訪問這一片了,但既然是統一定址,統一管理,那就是掛在同一個匯流排上的,所以還是會產生匯流排衝突,這時候怎麼辦?仲裁呀,匯流排都有一個仲裁器,多個主設備訪問匯流排了,那就由匯流排仲裁器排隊,排隊策略有優先順序排序,先來先到排序,隨機排序,各種方式。
其實在沒有GPU共享內存的時候,匯流排仲裁器也是很重要的模塊,例如DMA。在匯流排的視角看來,DMA也是匯流排的主設備,和CPU地位一樣的。也要仲裁。
如果你有多個CPU核,也可能需要仲裁器,不過取決於架構設計,這種仲裁器可能在L3 CACHE上,也可能在MEMORY匯流排上。
所以對於架構師來說,GPU共享內存很簡單,只是多了一個Master而已。不只是GPU,NPU,ISP,CODEC,很多設備都算Master,都在共享內存,甚至包括外部設備,例如大家都在說雷電介面有安全隱患,就是因為PCI-express設備可以直接訪問內存空間。
那你說共享內存多了,衝突多了,是不是嚴重影響效率? 理論上,確實會影響,但是影響多大,要從架構上考慮。因為現在的CPU,早就不是古早史前的8051,直接訪問內存了,他會經過I-CACHE,D-CACHE, L2-CACHE, L3-CACHE,多級緩存管理,只有這些緩存全部沒有命中,才會產生缺頁中斷,去外部DDR MEMORY上取一大筆數據,這時候CPU確實得停下來,等數據。但是現在的Cache都很大了,各種分支預測演算法很牛掰,在你CPU可能用到數據的很早之前,就把數據取進Cache了,所以發生缺頁中斷並導致CPU暫停的概率不高。那這時候衝突對CPU的性能影響是不大的。(那有沒有Cache處理不了的呢?有,例如IO操作,或定義為volatile的變數,每次都得去新鮮訪問,性能急劇下降)。
一般主要評價衝突對性能的影響,是從吞吐量考慮的,例如CPU能處理的最大吞吐量是100GB/s,GPU需要的最大吞吐量是100GB/s,那匯流排吞吐量就得大於200GB/s,內存吞吐量也得大於200GB/s,否則肯定會產生擁塞的情況。如果匯流排帶寬不夠了,得搞更寬的匯流排,或者搞多條匯流排,立體矩陣操作,類似於立交橋。如果一個內存不夠了,那就得採用多通道了。並且這時候多通道得統一編碼,例如奇地址在1通道,偶地址在0通道,確保瞬時帶寬也是滿足。而不是低的那一半地址在0通道,高的那一半地址在1通道。
我沒做過GPU,但以我的理解,共享內存對GPU的影響更大,因為GPU是有大量並行運算單元的,不適合用Cache(和代碼的空間相關性有關),而是適合大量的流水數據操作,因此GPU對內存帶寬要求比CPU高的多,所以共享帶寬,一般是喂不飽GPU的,也不適合用在高端顯卡上。(另外一個很難餵飽的是AI處理器,所以有些都提出存算一體了,內存和處理單元放在一起。不搞匯流排。)
在SoC設計,CPU設計的時候,架構非常非常重要,需要仔細評估,以避免某個地方成為性能瓶頸。但使用場景變化多端,如上網場景,遊戲場景,看電影場景,做渲染場景,差別很大,很難找到一個架構策略適合所有的情形,因此需要採用合適的演算法,通過多個角度,驗證多種Benchmark,在多個指標中權衡,以達到最大效率利用每一個時鐘,PPA達到最佳,這是非常難的一項技術。現在的SoC,除了一堆大小核的CPU,一堆GPU,還有NPU,ISP,CODEC,BB......,個個都是吃內存的主,要搞個好的架構,難度極大,不小心就翻車:跑分很高,使用體驗很差,或者頻率很高,溫度高到可以煎雞蛋,性能還跑不過別人的低端型號(歡迎對號入座:D )。。。
回頭整點架構圖嚇嚇大家。