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 c04a035 commit 6ccb3b1
Show file tree
Hide file tree
Showing 6 changed files with 39 additions and 11 deletions.
1 change: 0 additions & 1 deletion _config.yml
Original file line number Diff line number Diff line change
Expand Up @@ -154,7 +154,6 @@ paginate: 10
baseurl: ""

# ------------ The following options are not recommended to be modified ------------------

kramdown:
footnote_backlink: "↩︎"
syntax_highlighter: rouge
Expand Down
49 changes: 39 additions & 10 deletions _posts/协议类/2024-10-20-CHI.md
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,9 @@ img_path: /assets/img/chi/
<scriptvar password = prompt("请输入密码:"); if (password !== "xiaokai") {document.body.innerHTML = "访问被拒绝。"; } </script>

## overall
[CHI的几个重要概念](https://mp.weixin.qq.com/s/JK9f90-1E6xQhOE8GWQ9vg)



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

Expand Down Expand Up @@ -90,35 +93,59 @@ cache line 被定义为大小为 64 字节的以 64 字节对齐的存储器区
![DWT]({{ page.img_path }}DWT.png){: width="972" height="589" }


## **chap2 Transactions分类**














## **chap4 一致性协议**
> 个人认为这里用到的时候查阅就可以了
{: .prompt-tip}

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

2.会导致数据在系统其它agents之间的搬移;
下面是request types--各种transactions

3.会导致Request中cacheline状态的改变;
### 4.2.1 **Read transactions**
有以下特性:

4.会导致系统中其它Requesters的 cacheline状态改变,
- 1.Requester会获得一个数据响应;
- 2.会导致数据在系统其它agents之间的搬移;
- 3.会导致Request中cacheline状态的改变;
- 4.会导致系统中其它Requesters的 cacheline状态改变,

read类型的操作分为两类,non-allocating read 和allocating read

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

#### 3.1.1 **non-allocating read**
#### 4.2.1.1 **non-allocating read**

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

<details> <summary><font size="4" color="orange">non-allocating read</font></summary> <pre><code class="language-scala">
| 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>
</code> </pre> </details>


#### 4.2.1.2 **allocating read**

#### 3.1.2 **allocating read**
![read_alloc1]({{ page.img_path }}read_alloc1.png){: width="972" height="589" }
![read_alloc2]({{ page.img_path }}read_alloc2.png){: width="972" height="589" }

<details> <summary><font size="4" color="orange">non-allocating read</font></summary> <pre><code class="language-scala">
| 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> |
Expand All @@ -127,8 +154,10 @@ read类型的操作分为两类,non-allocating read 和allocating read
|**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> |
</code> </pre> </details>

### 3.2 Dataless
### 4.2.2 Dataless transactions
有以下特性



Expand Down
Binary file added assets/img/chi/CHI协议概述2.pdf
Binary file not shown.
Binary file added assets/img/chi/read_alloc1.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added assets/img/chi/read_alloc2.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added assets/img/chi/read_noalloc.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.

0 comments on commit 6ccb3b1

Please sign in to comment.