天天看点

各种显卡要求的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显卡,到时候再为大家带来具体的测评数据。