各種顯示卡要求的Resizable BAR功能,是什麼?

期待已久的Intel DG2獨立顯示卡Arc終於面世!中國全球首發的自豪感,和京東3999的感人價格,讓眾多等等黨心情複雜,到底要不要嚐鮮呢?目前,市面靠譜的評測不多,但謠言不少,有些謠言發端於Intel最新的ARC使用快速導引

。因為導引要求主機板需要開啟

Resizable BAR功能

,並且只列出了幾種Intel CPU:

各種顯示卡要求的Resizable BAR功能,是什麼?

一知半解者將這個需求視為Intel獨有技術,是為了排除競爭者,有些網文還將之稱作“Intel最後的堅持”云云。實際上Resizable BAR技術在十幾年前,PCIe 3。0後就已經進入PCIe標準了(2022年現在是PCIe 5。0,PCIe 6。0正在撰寫),而Smart Access Memory更是AMD的對應術語。

所謂造謠一張嘴,闢謠跑斷腿。實際上,Intel顯示卡並不是第一個要求Resizable BAR的顯示卡。N卡RTX30早就宣佈Resizable BAR功能可以提高效能

,某些遊戲效能可以提高10%!無獨有偶,N卡官網提出的CPU適配列表是不是看著很眼熟?

各種顯示卡要求的Resizable BAR功能,是什麼?

各種顯示卡要求的Resizable BAR功能,是什麼?

N卡測試結果,來源:參考資料2

好了,闢謠結束,Resizable BAR不是新功能,可以提高效能。那麼問題來了:Resizable BAR為什麼能提高效能?這麼好,為什麼好多年不用?怎麼確定自己的主機板是否支援Resizeable BAR功能呢?又如何開啟呢?

Resizable BAR是什麼?為什麼能提高效能?

在介紹PCI的系列文章中,我描述了PCI配置空間中的傳統PCI裝置空間。簡單來講,PCI裝置配置空間中從0x10到0x24,有6個暫存器:

各種顯示卡要求的Resizable BAR功能,是什麼?

每個暫存器4個位元組,叫做基地址暫存器(Base Address Register,

BAR

)。BAR用來讓每個PCI裝置在BAR中描述自己需要佔用多少地址空間,PCI列舉器透過所有裝置的這些資訊構建一張完整的關係圖,描述系統中資源的分配情況,然後在合理的將地址空間配置給每個PCI裝置。

BAR可以認為是PCI/PCIe裝置內的記憶體和暫存器,在CPU地址空間中的對映視窗,理解這點十分關鍵

傳統BAR的大小是固定的,PCI列舉器透過寫入0xFFFFFFFFF到裡面,然後讀出來,mask掉最後的幾個特殊位,從而知道該視窗有多大。這個Size是裝置最小需要的,是固定寫死的,沒有任何商量的餘地。PCI列舉器必須滿足,否則該裝置將不能正常工作。

Resizable BAR也是一種BAR,不過這種BAR並不是Fixed的,而是可以變大小的。它的位置不在傳統PCI配置空間中,而在PCIe Spec規定的擴充套件功能(Extend Cap)連結串列中,透過協議規定的方式,讓PCIe host可以根據實際地址空間分配情況動態設定一個裝置和CPU配置空間都可以接受的大小。

現在大家也許有點被繞迷糊了,我們通俗一點來講。

BAR是PCI裝置在CPU地址空間的視窗,讓CPU和裝置可以通訊和傳遞資料。傳統BAR是最小視窗,不能討價還價;而Resizable BAR最開始報告了一個最大的視窗,CPU可以根據情況,和裝置商量出來一個合理大小的視窗

功能如此簡單,那麼為什麼它在PCIe Spec 3。0提出了一直沒人用呢?它怎麼能提高效能呢?我們知道,現在PCIe的顯示卡動輒視訊記憶體幾個G,眾多渲染需要頻繁訪問視訊記憶體中的內容。而傳統視訊記憶體BAR為了相容起見,BAR size一般只有256MB,並處於4GB地址空間之內。這會帶來效能問題,這個管窺視訊記憶體的視窗需要頻繁移動,來操作其他的視訊記憶體位置。很自然,大家會覺得,如果視窗開的大小和視訊記憶體一樣大就好了!正式這樣,Resizable BAR才誕生。

需要注意的是,這麼大的空間浪費放在4GB之內是不恰當的,BIOS必須開啟64Bit MMIO和Above 4G Decoding的分配才行,畢竟64bit的地址空間足夠大,可以放得下更多G的視訊記憶體對映。

如何開啟Resizable BAR?

想必讀到這裡,大家已經瞭解Resizable BAR的執行機理了吧。但是因為相容性的問題,Resizable BAR預設都是關閉的。如何開啟呢?

作為一個UEFI和BIOS專欄,大家應該已經猜出來我的答案了。對的,需要BIOS來開啟。首先,對於BIOS程式設計師來講,UEFI EDKII基礎程式碼Tiano已經支援Resizable BAR,需要將PcdPcieResizableBarSupport設定為TRUE,並根據平臺設定好相關Policy。

對一般使用者來講,Intel 10代CPU以後的主機板很多都已經支援Resizable BAR功能,但不少和Above 4G MMIO Decode的選項有聯動關係,需要先開啟Above 4G MMIO Decode,然後Resizable BAR選擇才可以顯示,並需要設定為開啟或者Auto。

各種顯示卡要求的Resizable BAR功能,是什麼?

結語

Resizable BAR介紹完畢,另外,Smart Access Memory的部分類似我這裡就不再贅述了,Arc對它的要求描述似乎暗示了在AMD系列主機板也能夠支援。過一陣似乎我能得到一張Intel Arc顯示卡,到時候再為大家帶來具體的測評資料。