Skip to content

Commit

Permalink
update
Browse files Browse the repository at this point in the history
  • Loading branch information
RockyQLuo committed Oct 26, 2024
1 parent 5e6938d commit c04a035
Showing 1 changed file with 33 additions and 41 deletions.
74 changes: 33 additions & 41 deletions _posts/协议类/2024-10-20-CHI.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,10 @@ tags: []
img_path: /assets/img/chi/
---

<scriptvar password = prompt("请输入密码:"); if (password !== "xiaokai") {document.body.innerHTML = "访问被拒绝。"; } </script>

## overall

Core 未命中读路径最典型的 Flow:

![Core 未命中]({{ page.img_path }}Core 未命中.gif){: width="972" height="589" }
Expand All @@ -15,6 +19,8 @@ Core 未命中读路径最典型的 Flow:

![function]({{ page.img_path }}function.png){: width="972" height="589" }

---

- 新术语 Requester(请求者)在旧文档中与 master(主设备)同义
- 新术语 Subordinate(从属设备)在旧文档中与 slave(从设备)同义
- **Write back**:数据首先写入缓存,而不是直接写入主存。当缓存行被替换时,才将数据写回主存。这种策略减少了主存的写操作次数,提高了性能。
Expand All @@ -23,7 +29,7 @@ Core 未命中读路径最典型的 Flow:

[CHI协议的发展](https://mp.weixin.qq.com/s/ZpZNBhW7_VECyr5JwDCSfA)

## chap1
## **chap1**
Coherence overview:如果两个组件对同一存储器位置的写入可被所有组件以相同的顺序观察到,则存储器区域是一致的。

分布式虚拟内存DVM 接口主要用于 Broadcast TLB Invalidate
Expand All @@ -37,7 +43,7 @@ Coherence overview:如果两个组件对同一存储器位置的写入可被



### 1.5.1 缓存一致性模型
### **1.5.1 缓存一致性模型**
下图展示了一个一致性模型,该系统包括三个 Requester 组件,每个组件都具有本地 cache 和一致性协议节点。该协议允许同一存储器位置的 cache 副本驻留在一个或多个请求方组件的 local cache 中。

![coherency_model]({{ page.img_path }}coherency_model.png){: width="972" height="589" }
Expand All @@ -48,10 +54,10 @@ cache line 被定义为大小为 64 字节的以 64 字节对齐的存储器区

只有在内存位置的副本不再保存在任何 cache 中之前,才需要更新主内存(无效之前一刻)。该协议不要求主存储器始终保持最新。当某个cache要写主存的时候,该协议使 Requester 组件能够确定 cache line 是否是特定内存位置的唯一副本,<font color="#d99694">如果是唯一的,可以直接改,不然就要用适当的事务通知其他 cache</font>

### 1.5.2 Cache 状态模型
### **1.5.2 Cache 状态模型**

| 状态特征 | 描述 |
|:---------|--------:|
|:---------:|:--------:|
| Valid | 该 cache line 存在于 cache 中 |
| Invalid | 该 cache line 不存在于 cache line 中 |
| &nbsp; | &nbsp; |
Expand Down Expand Up @@ -84,8 +90,11 @@ cache line 被定义为大小为 64 字节的以 64 字节对齐的存储器区
![DWT]({{ page.img_path }}DWT.png){: width="972" height="589" }


## chap2 Transactions分类
### Read
## **chap2 Transactions分类**
> 个人认为这里用到的时候查阅就可以了
{: .prompt-tip}

### 3.1 **Read**
1.Requester会获得一个数据响应;

2.会导致数据在系统其它agents之间的搬移;
Expand All @@ -98,45 +107,28 @@ read类型的操作分为两类,non-allocating read 和allocating read

![read_class]({{ page.img_path }}read_class.png){: width="972" height="589" }

- ReadNoSnp

RN请求去Non—snoopable address region获取数据,不需要snoop其它RN或者HN访问任意空间。

- ReadNoSnpSep

与ReadNoSnp类似,只是告知Completer只需要返回data response。

- ReadOnce

该命令访问的是snoopable空间,用以获取一份数据,但是该数据不会在当前的RN中缓存;<font color="#d99694">也就是说,只是用一下该地址的数据;无需allocate到本地私有cache.</font>

- ReadOnceCleaninvalid

- 访问的是snoopable的地址空间;获取该地址的数据;
- 建议其他拥有该地址copy的RN,其状态变成invalid,但是不是强制的;
- 如果dirty的cacheline被invalid了,需要将数据写入主存;
- 当application想要该地址的数据仍然是有效的,但是近期又不使用的时候,可以使用该命令,而不是readonce/readoncemakeinvalid;

此命令可以提高cache效率,因为其主动将近期不使用的cache line从cache中invalid掉;

此命令不能代替CMO (Cache Maintenance Operation)操作,因为它不保证所有的cachline都变成了invalid;

由于这个命令会导致cache line的invalid,因此,当系统中有其他人在使用exclusive访问时,需要小心。

- ReadOnceMakelnvalid

- 访问的是snoopable的地址空间;获取该地址的数据;
- 建议其他拥有该地址copy的RN,其状态变成invalid,但是不是强制的;
- 如果dirty的cache line被invalid了,则直接丢弃数据;
- 当application知道后续这个地址的数据不再使用,即不再需要该最新数据之后,可以发送该命令;
#### 3.1.1 **non-allocating read**

此种命令在上述场景下,减少了writeback数据到DDR的带宽和时间;
| read supporting transactions | description |
|---------|------------------------------|
| **ReadNoSnp** | <ul><li>RN请求去Non—snoopable address region获取数据</li><li>不需要snoop其它RN或者HN访问任意空间</li></ul> |
| **ReadNoSnpSep** | <ul><li>与ReadNoSnp类似,只是告知Completer只需要返回data response</li></ul> |
| **ReadOnce** | <ul><li>该命令访问的是snoopable空间,用以获取一份数据,但是该数据不会在当前的RN中缓存</li><li> <font color="#d99694">也就是说,只是用一下该地址的数据;无需allocate到本地私有cache.</font></li></ul> |
| **ReadOnceCleaninvalid** | <ul><li>访问的是snoopable的地址空间;获取该地址的数据</li><li>建议其他拥有该地址copy的RN,其状态变成invalid,但不是强制的</li><li> 如果dirty的cacheline被invalid了,需要将数据写入主存</li><li> 当application想要该地址的数据仍然是有效的,但是近期又不使用的时候,可以使用该命令,而不是readonce/readoncemakeinvalid</li><li> 此命令可以提高cache效率,因为其主动将近期不使用的cache line从cache中invalid掉; </li><li> 此命令不能代替CMO (Cache Maintenance Operation)操作,因为它不保证所有的cachline都变成了invalid; </li><li> 由于这个命令会导致cache line的invalid,因此,当系统中有其他人在使用exclusive访问时,需要小心。 </li></ul> |
|**ReadOnceMakelnvalid**|<ul><li>访问的是 snoopable 的地址空间;获取该地址的数据;</li><li>建议其他拥有该地址副本的 RN,其状态变成 invalid,但是不是强制的;</li><li>如果 dirty 的 cache line 被 invalid 了,则直接丢弃数据;</li><li>当 application 知道后续这个地址的数据不再使用,即不再需要该最新数据之后,可以发送该命令;</li><li>此种命令在上述场景下,减少了 writeback 数据到 DDR 的带宽和时间;</li><li> 此命令不能代替 CMO(Cache Maintenance Operation)操作,因为它不保证所有的 cache line 都变成了 invalid;</li><li>由于这个命令会导致 cache line 的 invalid,因此,当系统中有其他人在使用 exclusive 访问时,需要小心;</li><li>此命令必须保证,在返回响应之前,先将该 cache line invalid 掉,并且在这个时刻点之后的所有写,都不受此次 invalid 的影响。</li></ul>

此命令不能代替CMO(Cache Maintenance Operation)操作,因为它不保证所有的cache line都变成了invalid;
#### 3.1.2 **allocating read**

由于这个命令会导致cache line的invalid,因此,当系统中有其他人在使用exclusive访问时,需要小心;
| read supporting transactions | description |
|---------|------------------------------|
| **ReadClean** | <ul><li>此类命令只能接收 cacheline 状态为 UC/SC 的数据,即不能接收 dirty 的数据;</li><li>一般用于,当某个 RNF 不具备将 dirty 的数据写入内存的能力时,会使用这种命令;</li><li>也就是说,当前这个 RNF 的 cache 的写回策略是 write through,所以只能支持 clean 态;</li><li>ReadClean 触发的 snpclean,会将其他 RNF 中的 dirty 的数据写入主存,然后将 clean 的数据返回给发起 ReadClean 的 RNF;</li><li>允许的初始状态: (根据 tagop 做区分)所有状态都可以发送该命令</li><li>响应返回后的状态:UC/SC;</li><li>被 SNP 的 RNF, SNP 后的状态: I/SC/ SD</li></ul> |
| **ReadNotSharedDirty** | <ul><li>当 RNF 本身只支持 MESI 协议,不支持 MOESI 时,此 RNF 不能存在 O 态,即 shared dirty,该 RNF 不能够接收该状态;</li><li>允许的初始状态: I/UCE;</li><li>响应返回后的状态: UC/UD/SC;</li><li>被 SNP 的 RNF, SNP 后的状态: I/SC / SD</li></ul> |
| **ReadShared** |<ul> <li>此命令和上一命令相对应,支持 MOESI 状态模型;</li> <li>允许的初始状态: I/UCE;</li> <li>响应返回后的状态: UC/UD/SC/SD;</li> <li>被 SNP 的 RNF, SNP 后的状态: I/SC/SD。</li> </ul> |
|**ReadUnique** |<ul> <li>RN 想要写非完成的 cacheline,所以先要获得最新的数据和写(unique)的权限,接着进行 partial 的写并与最新的数据 merge;</li> <li>访问的是 snoopable 的地址空间;</li> <li>初始状态建议最好是 I/SC/SD,但是也允许在 UC/UD/UDP/UCE 时发送;</li> <li>命令完成后状态,只能是 UC/UD。</li> </ul>|
| ReadPreferUnique |<ul> <li>访问的是 snoopable 的空间,想要获得一个 unique 的 cacheline;</li> <li>使用场景上,发送此命令,是希望获得 unique 状态,但是如果不是 unique 的,也允许;</li> <li>发送该命令时,其他 RN 正在对这个地址进行 exclusive 的访问,此时返回的状态是 shared;</li> <li>允许返回的状态一直是 shared;</li> <li>此命令主要是用来提高 exclusive 访问的效率,具体提升点在 exclusive 访问处描述。</li> </ul>|
| MakeReadUnique |<ul> <li>访问 snoopable 的空间,想要获取该 cacheline 的 unique 状态;</li> <li>典型使用场景是当前 RN 有该 cacheline 的 shared copy,想要获得写该 cacheline 的权限;</li> <li>此命令分为 exclusive/非 exclusive 两种。</li> </ul> |

此命令必须保证,在返回响应之前,先将该cache line invalid掉,并且在这个时刻点之后的所有写,都不受此次invalid的影响。
### 3.2 Dataless



Expand Down

0 comments on commit c04a035

Please sign in to comment.