服务器专题 | 第17期:设备能缓存主机内存,变了什么

服务器 · · 九羲科技

一台加速卡向主机要数据,老办法是搬。主机把数据拷一份到设备自己的内存里,设备算完,再把结果拷回去。拷来拷去,数据有两份,到底哪份是真的,靠软件一遍遍对账:拷之前有没有改过,算完之后有没有写回,写回有没有覆盖别人刚改过的部分。对账单是驱动和应用一笔笔写的,写漏一笔,错就藏在里面。

CXL.cache 改的是这个规矩。它允许设备像 CPU 的一个核那样,把主机内存的一行数据缓存进自己的缓存里,并且保证缓存里的副本和主机内存一致1。设备要读主机内存,不用先拷一份到自己的私有内存;主机要读设备算过的数据,也不用等一次完整的写回。两边看到的是同一份数据,至于这份数据的最新副本此刻躺在谁的缓存里,由一致性协议裁决,而不是由应用去猜。

这条分工,在 CXL 的三条协议里写得很干净。CXL.io 管发现、配置与搬运,是 PCIe 那一套的延续;CXL.cache 管一致性,设备可以缓存主机内存;CXL.mem 管主机访问设备上的内存1。三种设备类型,就是这三条协议的不同组合:

Type 1——CXL.io 加 CXL.cache,没有设备内存,典型是需要频繁访问主机端队列与数据结构的加速器

Type 2——三条协议全有,既有自己的高速内存,又能缓存主机内存,典型是带 HBM 的加速器

Type 3——CXL.io 加 CXL.mem,只给主机扩内存,不缓存主机内存

PCIe 老办法是拷两份再对账,CXL.cache 是两边共用一份数据、由协议裁决最新副本在哪(示意图为程序绘制)

一致性这件事,为什么只让主机当裁判

一致性协议最怕的,是两个裁判各说各话。CXL 的解法是不对称:复杂的归属裁决只放在主机一侧,设备一侧只做轻量的缓存代理2。CXL.cache 走 MESI 一致性状态,设备发出请求,主机裁决该行数据的归属;设备要改一行数据,先向主机拿到独占权,主机再让手里有旧副本的一方失效或写回2。链路分两向,每向各有请求、响应、数据三条通道,请求必有响应,响应之外再谈数据搬运2。

不对称的好处,是设备不用背一整套多核一致性引擎。代价是另一条:设备每一次拿独占权、每一次让旧副本失效,都要过一遍主机裁决。缓存命中时很快,命中不了、又要改数据时,裁决的往返就成了账上的一笔。缓存本来是为了省时间省带宽省出来的,但一致性本身也要花时间花带宽。这笔账算不算得过,取决于访问模式:反复读同一批主机端数据,缓存赚得多;写来写去、各方轮流改同一行,裁决的往返可能把缓存的好处吃掉不少。

还有一个细节值得单独拿出来。CXL.cache 解决的是设备缓存主机内存的一致性,设备自己的内存归谁管,是另一条协议的事。老式 GPU 的设备内存是私有的,主机看不见、不参与一致,名字就叫私有设备内存;CXL 里主机可以访问的设备内存叫主机管理设备内存,两者在驱动与地址映射上是两种待遇3。把这两件事混在一起谈,是最容易踩的坑:设备能缓存主机内存,不等于主机能随便读写设备内存;主机能访问设备内存,也不等于那份内存自动参与一致。哪一块内存走哪条协议,要一页一页看配置,不是设备型号一句话能概括的。

偏置是预先说好的归属,省掉每次问裁判

Type 2 设备还有一层更具体的安排,叫偏置。设备内存有两种偏置状态:主机偏置时,设备访问自己的内存也要经过主机裁决,就像访问主机内存一样;设备偏置时,保证主机没有缓存该行数据,设备可以直接访问自己的内存,不用向主机发任何事务4。偏置可以按 4KB 页单独设置,设备里有一张偏置表记录每一页的状态,切换偏置时要有一个过渡代理把主机缓存里的旧行刷干净4。

这套安排的聪明处,是把“每次问”换成了“预先说好”。任务提交阶段,主机往设备内存写操作数,偏置切到主机一边,主机访问顺畅;任务执行阶段,偏置切到设备一边,设备在自己的内存上全速跑,不用每一步都去问主机;任务完成,偏置再切回来,主机把结果读走4。三个阶段,归属各有主人,切换的成本集中发生在阶段交界,而不是摊进每一次访问里。

但预先说好也有代价。偏置切换本身不是免费的:过渡代理要把一页里主机缓存过的行清理干净,页越大、缓存过的行越多,切换越贵。于是选型时多了一道以前没有的题:工作负载的阶段切得干不干净。阶段分明、每次切换摊到大量计算上的负载,偏置赚得漂亮;阶段切得碎、主机与设备来回抢同一批页的负载,切换成本会反复出现,甚至反噬缓存带来的好处。这道题没有通用答案,只能按自己的访问模式去量。

偏置随任务阶段切换,切换成本集中在阶段交界(示意图为程序绘制)

从拷数据,到管归属:买方清单上多了三问

落到买方清单,这期可以收成三问。第一问,平台一侧是不是真的实现了 CXL.cache 的主机裁决与 Type 2 设备的偏置管理,设备手册上印着 CXL,不等于平台全程支持一致性与偏置切换,要看 CPU、固件、驱动这一串组合在自己的平台上走通过没有。第二问,访问模式里主机与设备抢同一行数据的频率有多高,抢得越勤,裁决往返与偏置切换的成本越要单独算,不能只按缓存命中率算账。第三问,CXL 3.0 之后的一致性语义变了没有:公开说明里,3.0 用增强一致性取代了偏置模式,设备改了本地内存后可以反向让主机缓存里的旧副本失效,还支持同一段内存在多设备之间共享5。这条路现在走到哪一步,自己的平台与设备组合跟到了哪一版,值得在采购前写进确认清单,而不是默认新版语义已经落地。

以小见大的一层判断:服务器里的数据路径,正在从“搬运”转向“归属”。以前的问题是带宽够不够、拷得快不快,现在的问题是谁有权说某一行数据此刻是真的、归谁管。搬运问题靠加宽管子解决,归属问题靠协议与约定解决。管子越宽,归属的约定越值钱;因为数据一旦不止一份,速度就不再是唯一的账,真相的唯一性才是。

没完全想通、留下一个问题:偏置切换的真实成本,在公开资料里多是机制描述,少有按访问模式拆开的实测对照。阶段切得碎的负载,切换成本到底占到总时间的几成,这笔账还缺一组公开的、能复现的测量。没有这组数,选型时的偏置收益只能算个方向,算不出边界。

觉 然 小 注

两份数据不可怕,可怕的是没人裁决哪份是真的。裁判定下来,速度才有意义。

· · ·

九羲科技|服务器 · 私有 AI · 存力方案

系列目录
第1期 | 73% 的整机钱,都给了 GPU 板组
第2期 | 4500 颗芯片撑起 95% 的机架价值
第3期 | 拆一台 2U 双路:通用服务器的钱花在哪
第4期 | 大铁盒子,值钱的不是铁
第5期 | 冻结点:L5 之后结构不许再改
第6期 | 能点亮不等于能交付:十二层验什么
第7期 | 内存离 CPU 有多远:NUMA 的延迟税
第8期 | 带宽不是买速度,是买并行度
第9期 | 一颗坏芯片,怎样不拖垮整机
第10期 | 数据上台三步,每步都在花时间
第11期 | CXL 内存慢一档,为什么还值得买
第12期 | 存力只在关键路径上才算数
第13期 | 链路是谈出来的:开机几秒谈什么
第14期 | 四电平挤带宽:SerDes在替谁赎买
第15期 | 端口数好看,带宽要看上行
第16期 | 把故障关进一个端口

引用与出处
[1] Synopsys. An Introduction to the CXL Device Types. synopsys.com. https://www.synopsys.com/blogs/chip-design/introduction-cxl-device-types.html
[2] Cadence. Demystifying CXL.cache. community.cadence.com. https://community.cadence.com/cadence_blogs_8/b/fv/posts/demystifying-cxl-cache
[3] Compute Express Link Consortium. Compute Express Link Specification Revision 2.0, Version 1.0, 2020(第 2.2 节 Type 2 设备与主机管理设备内存). http://www.biscuitos.cn/assets/PDB/MN/PDF/CXL-SPEC-R2.0.pdf
[4] Compute Express Link Consortium. Compute Express Link Specification Revision 1.1, 2019(第 2.2.1 节偏置一致性模型). http://www.biscuitos.cn/assets/PDB/MN/PDF/CXL-SPEC-R1.1.pdf
[5] Compute Express Link. en.wikipedia.org(CXL 3.0 增强一致性语义的公开综述,二手转引,仅作版本演进参考). https://en.wikipedia.org/wiki/Compute_Express_Link

下一篇|第18期:数据直进 GPU 内存,省掉了什么 —— GPUDirect 绕过 CPU 的那条路。

← 返回资讯中心