清晰展示一个简易CPU内部的处理流程

PCIe设备与CPU交互的流量有2种:控制流量,访存流量。其中控制流量又分为多种:配置信息读写,电源管理,中断传送等等。访存流量则是PCIe设备与Host交互的主要通道,Host通过访问PCIe设备内部的存储器来获取或者更改信息,或者传送数据,PCIe设备也会通过访问Host端的主存来获取或者更改信息。

通常来讲,如果有数据要被传送给PCIe设备,Host端程序预先将数据准备在主存中,PCIe设备主动通过PCIe通道读取主存;PCIe如果有数据要传送给Host,也需要Host端程序预先在主存中准备好缓冲区,PCIe设备主动将数据写入到该缓冲区。PCIe设备处于主动,Host端处于被动。为什么不让Host主动把数据推送到设备呢?原因有2个,一个是会增加Host端的管理压力,需要维护状态机,而是由于设备内部状态对外界不可知,Host主动推送数据,一旦设备内部并没有做好接收准备,各种阻塞就会出现,Host可没空再去管这些底层的破事儿的。

一般来讲,Host端程序(通常为PCIe设备的驱动程序)会预先在Host端主存中准备好收/发两个队列,并将队列的指针(队列位于主存中的地址)写入到PCIe设备内部某存储器/寄存器中,这个写入指针的过程也是访存操作,访问PCIe设备上的存储器。然后双方通过向队列中写入信息的方式来通告各自需要完成的任务,比如向队列中插入一条任务:”PCIe设备,请到主存中xx地址取数据和I/O指令“,或者”Host,我已完成xx号任务,处理完的数据已经写入xx地址“。

如果上面这段你看的云里雾里,那么证明你应该赶紧先去当当买一套《大话计算机》了,第8章详细讲解了PCIe原理以及设备与Host交互步骤分步详解。扫码直接购买:

仔细的读者可能已经注意到,除了将一些控制信息比如队列指针等写入PCIe存储器之外,好像Host很少主动写PCIe设备存储器?是的。主要原因就是:  Host主动把大量数据移动到设备的存储器,太慢。Host端程序可以使用Load/Stor指令直接访问PCIe设备端的存储器,向其中写入或者从中读出数据。这个过程会耗费CPU周期,如果需要移动的数据量非常庞大,CPU核心会被耗死。所以,需要采用DMA(Direct Memory Access)的方式后台异步进行,也就是采用独立于Host CPU之外的执行单元来负责,这个执行单元叫做DMA Controller,几乎所有的主流PCIe设备都会在自己的主控芯片内继承DMA Controller。Host CPU为何不集成?两个原因,之前说了,PCIe设备处于主动角色,所以DMA控制器放在自己这里是最佳方案。再就是CPU内部集成DMA控制器,选用什么样的规格不好界定,有些需要高并发DMA,有些则完全不需要太高的性能,所以还是设备自主集成比较好。所以,移动数据的任务就交给设备自身了。

既然数据可以放到Host端主存中,那么为何PCIe设备非要把数据拿到自己存储器里再处理呢?这得看是什么类型的设备,比如SAS HBA,它原本就是要把主存中的数据写入到硬盘,它的作用并不是数据处理,而是把数据在不同总线/协议通道上传送,同样的还有网卡。

而对于一些数据处理类设备,比如GPU/FPGA等等,又分为两种情况,第一种情况是需要处理的数据量较大,迭代次数较高,频繁访存,典型的比如AI训练,图形渲染。此时如果让设备每次访存都访问主存,就会非常慢,因为访问本地存储器可以走DDR4/5接口甚至本地缓存,访问Host端主存则走PCIe通道,前者带宽50GB/s,延迟大概50ns,而后者则只有16GB/s(PCIe 3.0),延迟200ns+,这势必会大大降低性能,所以将数据批量拷贝到设备内部存储器,本地处理,才是正路。而另一种情况是,需要处理的数据量并不是很大,而且访存频率较低,此时每次访问先拷贝回来再处理就本末倒置了,此时,最好是直接访问主存。明白了上述过程,背景,原理,我们再往下走。

此时问题来了,对于这些可以直接访问主存的场景,是否可以加把劲在加速一下?访存加速,最好的办法就是使用缓存。如果能够在设备端设置一个缓存来存储经常访问的Host端主存的数据,就可以了,由于缓存一般使用SRAM介质,比SDRAM介质快十倍甚至几十倍,所以加速效果非常明显。

那么问题又来了。缓存会产生缓存一致性问题(详见《大话计算机》第6章),比如CPU和GPU如果缓存了同样的数据,CPU对数据的更改,GPU是不知道的,会产生错乱的计算结果。所以,必须在设备与Host之间,实现缓存一致性管理协议,比如MESIF/MESI/MOESI等模型(详见《大话计算机》第6章)。所以,势必要在设备端加入缓存一致性管理模块,按照Intel CPU平台为准,也即是ccAgent,由于设备端也有大容量存储,所以需要一个Home Agent。(这些Agent详细机制详见《大话计算机》第6章)。

出自《大话计算机》第6章

那么问题又来了,这些Agent势必会增加设备端的复杂度和开发量。没办法。但是可以把管理设备内部存储器缓存一致性的Home Agent移动到Host端,也就是移动到CPU里,这样外设只需要实现一个ccAgent即可。

现在,设备可以不用把数据先从Host主存拷贝到本地,就可以直接访问主存处理数据了,现用现访问。那么,礼尚往来,设备端是不是也可以把自己更广阔的内部存储器空间开放给Host端直接处理?当然可以,但是由于Home Agent在Host端,那么此时设备即便是访问自己内部的存储器,也需要发送一些控制消息到Home Agent用来实现缓存一致性,此时有点本末倒置了。解决办法,可以对这块存储器中的区域(按照Page位单位)左标记,“xx Page在主存中不被缓存,设备可以肆无忌惮的本地读写而不用发送控制信息到Home Agent”,或者 “xx page在主存中有缓存,设备要么先别访问,要么就发送控制信息通告给Home Agent”。

那么,CXL是什么?CXL就是你把上述过程通透的理解之后,基于现有体系产生的方案,协议。记住,CXL仅对 “直接访问Host主存处理数据,或者Host直接访问设备存储器处理数据” 模式的场景有提速作用,对于原本就必须进行数据拷贝之后本地处理的场景,基本无效。篇幅所限,就不具体介绍CXL的各种概念了,比如:Type1/2/3 Device,Bais,CXL.io,CXL.mem,CLX.cache,等等,只要上面的你懂了,这些概念并不是问题。

CXL2.0版本协议引入了CXL Switch,能够将CXL协议网络化实现。与此同时,格局更宏大的Gen-Z协议也在同时发展,目前看来Gen-Z更注重大规模组网,而CXL注重小规模局部组网,二者目前业界认为是相辅相成的关系。但是后续就不知道了。

其实,早在5年前,本公众号第一篇文章,介绍的就是CXL的老前辈,由IBM定义的CAPI加速协议,CXL实际上是CAPI的跟随者,毕竟x86生态吊打Power平台。CAPI目前已经过渡到了OpenCAPI,大家有兴趣可以自行了解。不得不说,IBM还是瘦死骆驼比马大,IBM对硬件基本上差不多玩够了,现在除了大型机等镇界之宝,开放的平台都卖了,或者深度合作,离着彻底脱手也不远了,就看业界小喽啰们能否继承好IBM的衣钵并将其发扬光大。

这篇文章的写法与《大话计算机》一样,都是从源头讲起,遇到问题,思考问题,解决问题,引出结论,最终再介绍抽象概念。而并非网络上千篇一律的 “CXL是Intel定义的一套外设与Host之间的加速访问协议,xxxxx”,保你看完了等于没看,而且还浪费了时间,文中不仅一点其他线索也没有,你根本没法深究下去,而且前因后果,场景,一概不跟你说,懂的原本就懂,不懂的还是不懂。大话计算机》打破了这一恶性循环,让你的学习时间数倍的降低。当然, 本文如果你看不懂,也是意料之中,原因很简单,因为你没看《大话计算机》,没有吃第一个第二个面包,又怎么可能直接吃第三个面包?哈哈。要在一篇小文中通俗易懂的讲清楚PCIe,CXL的详细机制,不太可能,所以还是推荐大家阅读《大话计算机》,你想要的,里面不说100%,90%都是有的。

年龄最小的《大话计算机》读者(15岁)

扫码入当当直购《大话计算机》

展阅读展

扩展阅读

连书都得看国外写的才能做好芯片?这儿有人不服!

《大话计算机》同款T恤,我要了!!

《大话计算机》动图一则展示

《大话计算机》序言① by廖恒

《大话计算机》序言② by 包云岗老师

《大话计算机》序言③ by 何万青

《大话计算机》序言④ by 雷迎春

《大话计算机》序言⑤ by 汪利文

《大话计算机》序言⑥ by 张勇

《大话计算机》序言⑦ by @去流浪

  

博主简介:冬瓜哥,《大话计算机》与《大话存储 终极版》、《大话存储 后传》图书作者。多项专利发明人。

现任某半导体公司高级资深架构师。

大话计算机   大话存储

长按扫码可关注

强力科普一下PCIe/CXL(Compute Express Link)相关推荐

  1. Compute Express Link CXL 3.0 是令人兴奋的分解构建块

    本周在 FMS 2022 上,宣布了 CXL 3.0.这个新标准为 CXL 带来了许多非常酷的进步.它还伴随着 OpenCAPI 失去动力并将其 IP 引入 CXL.这个新的 CXL 3.0 版本仍为 ...

  2. CXL™联盟发布Compute Express Link ™ 2.0规范

    CXL 2.0添加新功能,以满足下一代数据中心的性能要求,同时保持与CXL 1.1和1.0的向后兼容性 俄勒冈州比弗顿--(美国商业资讯)--致力于推进Compute Express Link™ (C ...

  3. pci串行端口找不到驱动程序_科普:PCI-E插槽都有哪些样子?

    主板上的扩展插槽曾经是多种多样的,例如曾经非常流行的组合就是PCI插槽搭配AGP插槽,其中AGP插槽主要用在显卡上,而PCI插槽的用途则更广一些,不仅有用在显卡上,还能用于扩展其它设备,如网卡.声卡. ...

  4. [PCIE] 1 - PCI Express 简介

    本系列文章目录: [PCIE] 1 - PCI Express 简介 [PCIE] 2 - 设备层简介 [PCIE] 3 - 协议回顾示例 PCI Express 简介 PCI Express 代表了 ...

  5. pci-e插槽gen2 x4 link什么意思

    PCI Express是新一代的总线接口.2001年,英特尔公司就提出了新一代的取代PCI总线,称为第三代I/O总线技术.随后在2002年Intel.AMD.DELL.IBM在内的业界主导公司起草完成 ...

  6. 科普:PCI-E插槽都有哪些样子?

    主板上的扩展插槽曾经是多种多样的,例如曾经非常流行的组合就是PCI插槽搭配AGP插槽,其中AGP插槽主要用在显卡上,而PCI插槽的用途则更广一些,不仅有用在显卡上,还能用于扩展其它设备,如网卡.声卡. ...

  7. [SSD科普1] PCIE接口详解及应用模式

    PCI-Express(peripheral component interconnect express)是一种高速串行计算机扩展总线标准,它原来的名称为"3GIO",是由英特尔 ...

  8. 一文告诉你CXL是什么,有什么新的机会 (上)

    为了节省大家时间,摘要奉上,enjoy~ 大数据AI/ML应用爆发驱动大内存需求,但内存增长受限,CXL互联方案应运而生 CXL分为1.0/2.0/3.0版本,分别提供直连.池化.Fabric能力,预 ...

  9. SK hynix announces 96GB DDR5 CXL 2.0 memory expansion solution【搬运外媒VedioCardz报道(手工翻译)】

    SK hynix announces 96GB DDR5 CXL 2.0 memory expansion solution (SK海力士发布最新CXL2.0标准的DDR5 96GB内存扩展方案) S ...

最新文章

  1. java实现指数分布_Nim 语言编程实现指数分布的随机数
  2. 适合 Python 入门的 8 款强大工具,赶紧收藏一波!
  3. Adobe Photoshop CC 打开时报错~配置错误:请卸载并重新安装该产品
  4. PHP的几个常用加密函数
  5. LeetCode算法题-Detect Capital(Java实现)
  6. 揭秘微信朋友圈这种信息推流背后的系统设计
  7. selenium webdriver中的常用鼠标操作
  8. 漫画:如何实现大整数相乘?
  9. Python 硬核分析我国 14 亿人口,发现三大危机!
  10. 堰流实验报告思考题_创新实验之一:桥墩冲刷实验
  11. 快鲸六大私域运营服务,赋能企业业绩长效增长
  12. 思科Cisco Nexus 9508交换机的QSFP+端口高速线缆DAC布线方案
  13. Shenyu网关本地打docker镜像包
  14. 浅析凸优化理论学习中的“坑”
  15. 设置二级域名解析到同IP不同端口
  16. [人工智能-深度学习-32]:卷积神经网络CNN - 常见分类网络- AlexNet网络结构分析与详解
  17. 2020牛客暑期多校训练营(第九场) Groundhog and 2-Power Representation
  18. MYSQL互为主从部署(Censo:6)
  19. sql语句查询某字段中包含某值(模糊查找)
  20. 怎么把图片拼接成长图,3招教你快速处理

热门文章

  1. RTT_0.96寸OLED_IIC驱动
  2. 潜伏研发群一个月,我发现了程序员不为人知的秘密
  3. 请注意LR78M05和LR78L05管脚定义的区别
  4. 二叉树先、中、后遍历递归+非递归
  5. 谷粒学苑 —— 7、课程管理:课程发布页面2 —— 课程大纲
  6. Maxon发布Cinema 4D S22
  7. C4D模型工具—偏移
  8. 新垣结衣自拍照_如何拍好自画像和自拍照
  9. Linux命令行中使用计算器的5个命令
  10. Django微信小程序后台开发教程