1 多核cache标志位
多核cache主要有两种一致性协议,一种是基于监听的,另外一种是基于目录,在这里我们主要考察基于监听的MOESI协议。
标志位有:
valid: 是否有效
dirty: 脏位
exclusive: 独占标志
cacheline中的状态即如其名称所说:M、O、E、S和I。
状态 | 状态含义 |
M | 该Cache行数据有效,数据被修改了,和内存中的数据不一致,数据只存在于本Cache中 |
O | 本Cache line被修改,和内存中的数据不一致,不过其它的核可以有这份数据的拷贝 |
E | 这行数据有效,数据和内存中的数据一致,数据只存在于本Cache中 |
S | 这行数据有效,数据和内存中的数据一致,数据存在于很多Cache中 |
I | 这行数据无效 |
使用valid、dirty、exclusive表示这五种状态:
valid | exclusive | dirty | |
M | 1 | 1 | 1 |
O | 1 | 0 | 1 |
E | 1 | 1 | 0 |
S | 1 | 0 | 0 |
I | 0 | 0 | 0 |
合法的状态组合:
M | O | E | S | I | |
---|---|---|---|---|---|
M | |||||
O | |||||
E | |||||
S | |||||
I |
2 多核cache操作
多核Cache操作主要有Local Read、
Local Write、Remote Read 和 Remote Write。
根据所要访问的数据在本地Cache、其他核Cache或者内存中,这些操作会改变本地Cache和其他核中Cache的状态。
AMD中MOESI协议转换图:
在
MOESI
模型中,“
Probe Read
”表示主设备从其他
CPU
中获取数据拷贝的目的是为了读取数据;而“
Probe Write
”表示主设备从其他
CPU
中获取数据拷贝的目的是为了写入数据;“
Read Hit
”和“
Write Hit
”表示主设备在本地
Cache
中获得数据副本;“
Read Miss
”和“
Write Miss
”表示主设备没有在本地
Cache
中获得数据副本;“
Probe Read Hit
”和“
Probe Write Hit
”表示主设备在其他
CPU
的
Cache
中获得数据副本。
1)Load指令
首先检查本地是否存在,如果存在,则状态就是M、O、E、S,状态不变,直接获取数据返回。
如果不存在,就会访问远程核中的Cache,如果核中存在,则状态可能为M、O、E、S,
则M改成O,E改为S,O、S不变,本地状态变成S。
如果远端核也不存在,那么只能去查询内存了,本地cache中的状态变成E。
2)Store指令
同样要先检查本地是否存在,若存在的话,不管什么状态,都变成M,不能像Load指令那样返回了,还得去告诉其他核,其他核的状态都变成I。
具体在做的时候,可以这样:
如果状态是M、E,则将数据直接写入Cache中,并将状态改为M(当然原来就是M,就不用改了);如果是O、S,则将其他核中的Cache行置为I,本地写入,改成M,返回。
如果不存在,那么就要查找其他核,如果其他核中存在,不管什么状态,都置成I,本地得到数据后,本地状态置成M。
具体做的时候,可以这样:
如果状态为M、O,则要将数据写回到内存,改为I,本地Cache数据写入,状态位M;如果是E和S,改为I,本地数据写入,状态改为M。
如果其他核中也不存在,那么就去从内存中获取数据,本地cache中的状态变成M。