对 CXL.cache 伪数据(Bogus Data)的解读



🔥点击查看精选 CXL 系列文章🔥
🔥点击进入【芯片设计验证】社区,查看更多精彩内容🔥


📢 声明

  • 🥭 作者主页:【MangoPapa的CSDN主页】。
  • ⚠️ 本文首发于CSDN,转载或引用请注明出处【https://mangopapa.blog.csdn.net/article/details/132129740】。
  • ⚠️ 本文目的为 个人学习记录知识分享。因个人能力受限,存在协议解读不正确的可能。若您参考本文进行产品设计或进行其他事项并造成了不良后果,本人不承担相关法律责任。
  • ⚠️ 若本文所采用图片或相关引用侵犯了您的合法权益,请联系我进行删除。
  • 😄 欢迎大家指出文章错误,欢迎同行与我交流 ~
  • 📧 邮箱:mangopapa@yeah.net
  • 💬 直达博主:loveic_lovelife 。(搜索或点击扫码)

文章目录

  • 1. Bogus 是什么?
    • 1.1 Bogus 概念
    • 1.2 Bogus 应用场景
    • 1.3 对 Host 和 Device 的要求
  • 2. 为什么需要 Bogus?
    • 2.1 Snoop & GO_WritePull 只响应其一?
  • 3. Q&A
  • 4. 参考


为便于表述,下述 Cacheline 均指 Device Cache 内归属于 Host Memory 的 Cacheline。



1. Bogus 是什么?

1.1 Bogus 概念

  Bogus 是 CXL.cache D2H Data 中的一个字段,指示当前写的数据为伪数据,常用于 Host Snoop 与 Device Evict 相同 Cacheline 的场景,Host 收到该数据后应予以丢弃。

  具体而言,在 Device 发出 Evict 请求之后、收到 GO_WritePull 响应之前收到了 Host 发来的针对该地址的 Snoop 请求,Device 先行对该 Snoop 进行响应并通过 D2H Data Channel 反馈该 Cacheline 的最新数据。紧接着,Device 收到 Host 发来的针对此前 Evict 请求的 GO_WritePull 响应,再次通过 D2H Data 反馈 Evict Cacheline 的数据,同时将 D2H Data Flit 中 Bogus 字段置一,提示 Host 当前数据此前已经发过一次,当前数据可能已经过期,Host 收到后直接丢弃数据。一次针对相同地址的 Evict+Snoop 的流程示意图如下图所示。

在这里插入图片描述

  CXL 协议 Compliance 章节的算法 1b 中提到了 Bogus Write 的概念,笔者理解其并非 Bogus=1 的 Cache 写请求,而是常规的 Bogus=0 的写请求。

1.2 Bogus 应用场景

  Bogus=1 仅适用于采用 Evict 原语进行写数据的场景。Device 可以采用 DirtyEvict、CleanEvict、CleanEvictNoData 等 D2H Evict 请求来释放 Device Cache 内归属于 Host Memory 的 Cacheline。发起 Evict 请求的前提是该 Cacheline 在 Device Cache 内的状态为 Modified 或 Shared/Exclusive,不能为 Invalid,这也意味着 Evict 请求在到达 Host 之前 Host Snoop Filter 仍然会 Track 该 Cacheline。

  对于 WrInv、WoWrInv*、ItoMWr 及 WrCur 写数据,不存在需要 Bogus=1 的情况。笔者理解,有两大原因:

  • 能够发起非 Evict 的写请求的前提是该 Cacheline 在 Device Cache 内的状态已经变为 Invalid,常规情况下其在 Host Snoop Filter 中的 Tracker 已经被释放了,Host SF 不应对其进行 Snoop 相关 Track,Device 也不应对一条 Invalid 的 Cacheline 进行 Evict 操作。
  • 即便 Host SF 对齐进行 Snoop,Snoop 到的也是早已处于 Invalid 状态的 Cacheline,收到的响应只能是 RspIHitI,不涉及 Snoop 相关的 Data 反馈。再即便采用 Evict 该 Invalid 的 Cacheline,Evict 的数据也是第一次传输,为 Real Data,而非 Bogus Data。

1.3 对 Host 和 Device 的要求

  为了实现有效的 Bogus 传输,协议对 Host 和 Device 有如下要求:

  • 对于 Host,其内不能同时存在处于 Active 状态的针对同一 Cacheline 的 WritePull 和 Snoop Entry。也就是说,Host 在发出 Snoop 请求之后、收到 Snoop 对应的 Rsp 和/或 Data 之前,不能反馈相同地址的 WritePull 给 Device;反之亦然,Host 发出 WritePull 之后、收到 WritePull 对应的 Data 之前,不能发送相同地址的 Snoop 请求到 Device。
  • 对于 Device,若其发出 Evict 请求之后收到了相同 Cacheline 的 Snoop 请求、Cacheline 状态变动并反馈了 Data 给 Host,接下来 Device 收到 WritePull 反馈 Data 的时候,必须设置 Bogus=1。


2. 为什么需要 Bogus?

  我们抛开上边提到的约束,来探究下为什么要这么干——

  我们知道,CXL 系统有两个场景会用到 D2H Data Channel:

  • Device 主动发起 CXL.cache 写请求,在收到 Host 发来的 WritePull 响应后,Device 通过 D2H Data 发送写数据。
  • Host 发起 Snoop 请求,Device 通过 D2H Data 来反馈数据。

假设允许在收齐 Rsp/Data 之前针对同一地址的 Cacheline 发送 GO_WritePull 和 Snoop 请求(协议不允许),我们分两种情况来讨论:

  • 先发 GO_WritePull,再发 Snoop。这种情况显然没必要。Evict 请求是 Device 对 Host 的一种保证,保证 Device Cache 内已经没有该 Cacheline 的副本了,且 DirtyEvict/CleanEvict 接下来还会把数据反馈给 Host。要数据有数据,要状态有状态,还没提问,已有答案,Host 有什么想不开的非要再 Snoop 一次?直接执行就好了。
  • 先发 Snoop,再发 GO_WritePull。我们知道,Snoop 走 H2D Req 通道,GO_WritePull 走 H2D Rsp 通道,两通道相互独立;我们还知道,根据排序规则,H2D Rsp 可以超过 H2D Req,即 GO_WritePull 可以超过 Snoop。这也就意味着,CXL 系统并不能保证 Snoop 和 GO_WritePull 哪个先到 Device。

  针对上述第二种情况,不管 Snoop 先到还是 GO_WritePull 先到,接下来针对这两笔请求,D2H 上会先后出现两笔 Data。至于哪个先到 Host,并不确定。更要命的是两笔数据并不一定相同。

  此外,笔者认为,Snoop 和 GO_WritePull 先后脚到达 Device,Device 同时处理起来容易造成混乱。Device 收到 Snoop 后,DCOH 在 Device Cache 之间进行 Cache 一致性相关处理,此间具体耗时并不明确。处理 Snoop 或许会改变 Cacheline 状态,处理 GO_WritePull 后 Invalid 相关 Cacheline,显然一方对 Cacheline 状态的修改均会影响另一方,导致另一方处理出错。

  再考虑一种情况,虽然 Device 不知道其是否能收到 Snoop,但其知道其已经发出了 Evict 且还没收到 GO_WritePull,等待 GO_WritePull 期间,收到的 Snoop 先 Pending 在 Device 不就好了么?——不行。一来,即便先处理 GO_WritePull 再处理 Snoop,也不确保其 Data 就比 Snoop 对应的 Data 先到达。二来,笔者认为 Go_WritePull Pending 比 Snoop Rsp Pending@Device 代价更小一些——从发起请求方的重要性来看,Snoop 由 Host 发起,可能涉及到的组件更多,或许其他组件正在等待 Snoop 的 Rsp 以进行下一步运算处理;Evict 由 Device 发起,Pending 的组件只有 Device 自己,Device 本身不打算用这条 Cacheline 了才 Evict,对 Device 性能影响较小。

  综合下来,为了解决以上各种问题,较好的方案便是协议提到的——Host 等待收齐 Snoop 的 Rsp/Data 之后再反馈相同地址的 GO_WritePull。对 Device 而言,若其发出 Evict 请求后在等待 GO_WritePull 期间收到相同 Cacheline 的 Snoop 请求则进行响应。待收到 GO_WritePull 之后,若 Evict 和 GO_WritePull 期间曾经反馈该地址的 Data,则再次反馈 Data 时标注 Bogus=1。通过这种方式,能够保证 Snoop 的 Data 一定比 GO_WritePull 的 Data 先到。如果此前处理 Snoop 时未反馈 Data,笔者理解接下来处理 GO_WritePull 时 Bogus 不应置一。

  此外,如果从 Snoop 到 GO_WritePull 相关 Cacheline 的数据并未发送变动,似乎 Bogus=0 也讲得过去,但这样 Host 会重复更新该地址,似无必要。

2.1 Snoop & GO_WritePull 只响应其一?

  Host 端发出 Snoop 和 GO_WritePull 后,相关 Entry 已经创建并等待 Rsp/Data,如果不回复,Host 会报错。

  Host 发出 Snoop 后又收到了 Evict,Host 直接忽略该 Evict 不就好了么?显然也不应该,因为 Device 中 Evict 相关 Entry 也已创建,需要回复 GO_WritePull 来清除 Entry。当然,Device 等待 GO_WritePull 期间收到相关 Snoop,用这个 Snoop 替代 GO_WritePull 来消除 Evict 创建的 Entry,理论上似乎也讲得过去,但总感觉是个歪路子,而且会增加 Device 的设计复杂度。



3. Q&A

  1. H2D Data 支持 Bogus 吗?
    对 CXL.cache 协议而言,不需要。CXL.mem 中的 BISnp、Evict 后边再说。
  2. Bogus 的意义是什么?
    伪数据。该数据此前发送过一次,此时可能已过期,Host 不能使用。
  3. 如果 Snoop 没有 Data 返回,WritePull 的 Data 还需要 Bg=1 吗?
    笔者理解不需要。


4. 参考

  1. CXL Base Spec, r3.0

— END —


🔥 精选往期 CXL 协议系列文章,请查看【 CXL 专栏】🔥

⬆️ 返回顶部 ⬆️

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/24312.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Element的el-select下拉框多选添加全选功能

先看效果图 全选: 没有选中时: 选中部分: 作者项目使用的是vue3写法,如果是vue2的自己转换一下 html代码: js代码: 拓展 另一种方法,如果不想使用勾选框,可以试试下面的方…

Spring Boot介绍--快速入门--约定优于配置

文章目录 SpringBoot 基本介绍官方文档Spring Boot 是什么?SpringBoot 快速入门需求/图解说明完成步骤快速入门小结 Spring SpringMVC SpringBoot 的关系总结梳理关系如何理解-约定优于配置 SpringBoot 基本介绍 官方文档 官网: https://spring.io/projects/spring-boot 学习…

Leaflet入门,地图平移跳转到指定位置和飞行到指定位置效果

前言 本章讲解如何Leaflet如何实现操作地图平移到指定位置或者飞行到指定位置效果。 vue如何使用Leaflet vue2如何使用:《Leaflet入门,如何使用vue2-leaflet实现vue2双向绑定式的使用Leaflet地图,以及初始化后拿到leaflet对象,方便调用leaflet的api》 vue3如何使用:《L…

XXL-JOB定时任务框架(Oracle定制版)

特点 xxl-job是一个轻量级、易扩展的分布式任务调度平台,能够快速开发和简单学习。开放源代码并被多家公司线上产品使用,开箱即用。尽管其确实非常好用,但我在工作中使用的是Oracle数据库,因为xxl-job是针对MySQL设计的&#xff…

MySql的Windows安装指南

目录 一、MySQL的4大版本 二、软件的下载 三、MySQL8.0 版本的安装 四、配置MySQL8.0 五、配置MySQL8.0 环境变量 六、登录验证 一、MySQL的4大版本 MySQL Community Server 社区版本,开源免费,自由下载,但不提供官方技术支持&#xff…

一款界面精美的商城微信小程序源码 蔬菜生鲜商城小程序源码

一款界面精美的商城微信小程序源码 蔬菜生鲜商城小程序源码 界面非常漂亮的一款我厨蔬菜生鲜商城小程序源码,tab切换效果,分享给大家参考。

一、7.协同式任务切换与抢占式任务切换

使用TSS来在任务切换时保护现场和恢复现场 内核任务:单纯由内核组成的任务,和其他用户程序组成其他任务 内核任务的创建 ;为内核任务创建任务控制块TCB mov ecx, 0x46 call sys_routine_seg_sel:allocate_memory call append_to_tcb_link ;将此TCB添加…

BClinux8.6 制作openssh9.2p2 rpm升级包和升级实战

一、背景说明 BClinux8.6 安装的openssh 版本为9.3p1,经绿盟扫描,存在高危漏洞,需要升级到最新。 OpenSSH 命令注入漏洞(CVE-2020-15778) OpenSSH 安全漏洞(CVE-2023-38408) 目前官网只提供编译安装包,而BClinux8.6 为rpm方…

回归预测 | MATLAB实现基于SVM-RFE-BP支持向量机递归特征消除特征选择算法结合BP神经网络的多输入单输出回归预测

回归预测 | MATLAB实现基于SVM-RFE-BP支持向量机递归特征消除特征选择算法结合BP神经网络的多输入单输出回归预测 目录 回归预测 | MATLAB实现基于SVM-RFE-BP支持向量机递归特征消除特征选择算法结合BP神经网络的多输入单输出回归预测预测效果基本介绍研究内容程序设计参考资料…

Vue中,$forceUpdate()的使用

在Vue官方文档中指出,$forceUpdate具有强制刷新的作用。 那在vue框架中,如果data中有一个变量:age,修改他,页面会自动更新。 但如果data中的变量为数组或对象,我们直接去给某个对象或数组添加属性,页面是识…

antv/l7地图,鼠标滚动,页面正常滑动-- 我们忽略的deltaY

背景 在官网项目中,需要使用一个地图,展示产品的分布区域及数量。希望的交互是,鼠标放上标点,tooltip展示地点和数量等信息。鼠标滚动,则页面随着滚动。但是鼠标事件是被地图代理了的,鼠标滚动意味着地图的…

性能测试入门知识总结

目录 1.什么是性能测试? 2.为什么要进行性能测试? 3.性能测试的常见术语 4.性能测试的分类 5.性能测试如何展开? 1.什么是性能测试? 性能测试是一种测试类型,旨在确定系统的性能以衡量性能,验证或验证…

8.15锁的优化

1.锁升级(锁膨胀) 无锁 -> 偏向锁 -> 轻量级锁 -> 重量级锁 偏向锁:不是真的加锁,而是做了一个标记,如果有别的线程来竞争才会真的加锁,如果没有别的线程竞争就不会加锁. 轻量级锁:一个线程占领锁资源后,另一个线程通过自旋的方式反复确认锁是否被是否(这个过程比较…

RabbitMQ安装说明文档-v2.0

rabbitmq安装 说明:请使用资料里提供的CentOS-7-x86_64-DVD-1810.iso 安装虚拟机. 1. 安装依赖环境 在线安装依赖环境: yum install build-essential openssl openssl-devel unixODBC unixODBC-devel make gcc gcc-c kernel-devel m4 ncurses-devel …

【并发专题】单例模式的线程安全(进阶理解篇)

目录 背景前置知识类加载运行全过程 单例模式的实现方式一、饿汉式基本介绍源码分析 二、懒汉式基本介绍源码分析改进 三、懒汉式单例终极解决方案(静态内部类)(推荐使用方案)基本介绍源码分析 感谢 背景 最近学习了JVM之后&…

面试题:JS如何最快的执行垃圾回收机制

因为没看见答案,所以也不知道对不对。 JavaScript 的垃圾回收机制是由 JavaScript 引擎自动管理的,通常情况下我们无法控制垃圾回收机制的执行时间和频率。 然而,我们可以采取一些优化策略来减少垃圾回收的性能开销,从而提高代码…

golang函数传参——值传递理解

做了五年的go开发,却并没有什么成长,都停留在了业务层面了。一直以为golang中函数传参,如果传的是引用类型,则是以引用传递,造成这样的误解,实在也不能怪我。我们来看一个例子,众所周知&#xf…

uniapp发布插件显示components/xxx文件没找到,插件格式不正确

uniapp发布插件显示components/xxx文件没找到,插件格式不正确 将插件文件这样一起选中,然后右键压缩成zip文件,而不是外层文件压缩

记一次 .NET某医疗器械清洗系统 卡死分析

一:背景 1. 讲故事 前段时间协助训练营里的一位朋友分析了一个程序卡死的问题,回过头来看这个案例比较经典,这篇稍微整理一下供后来者少踩坑吧。 二:WinDbg 分析 1. 为什么会卡死 因为是窗体程序,理所当然就是看主…

SQL ASNI where from group order 顺序

SQL语句执行顺序: from–>where–>group by -->having — >select --> order 第一步:from语句,选择要操作的表。 第二步:where语句,在from后的表中设置筛选条件,筛选出符合条件的记录。 …