飞腾CPU体系结构(十)
1.高速缓存模型
为了优化整体性能,飞腾CPU芯片内部提供L1高速缓存和L2高速缓存,有些飞腾CPU也提供芯片内部的L3高速缓存,本节不对这个情况进行赘述。
靠近流水线的高速缓存具有低延迟,高代价的特点;离流水线更远的高速缓存,实现代价通常会低一些,容量通常会更大些,但是延迟也更长些。
缓存延迟关系
- L1缓存延迟一般在几拍左右;
- L2缓存延迟一般是L1缓存延迟的2~3倍;
- 内存墙延迟一般是L2缓存的10倍以上。
飞腾CPU的外部内存和L1/L2缓存是以缓存块为单位进行数据传输的,每个缓存块长度为64字节,L1缓存块是L2缓存块副本,L2缓存块是芯片外内存的副本。
2.FT2000+/64服务器
FT2000+/64服务器芯片
每个核具有各自独立的32KB的L1数据缓存和32KB的L1指令缓存。其中四个核为一个核簇,每个核簇共享2MB的L2缓存。全芯片64核一共有32MB的L2缓存。L2缓存是统一缓存,不区分指令和数据。而芯片内的处理核共享芯片内的L2缓存;对每个处理核而言,L2缓存块在硬件设计上保证数据一致性。
虽然是L1的数据和指令是L2的副本,但飞腾CPU的硬件设计上并不保证,缓存块副本和原数据会时刻保持完全一致。
3.常规高速缓存指令
一般来说,对高速缓存的操作有三种:
操作 | 常规说明 | 备注 |
---|---|---|
invalidate | 直接将缓存块失效 | 飞腾将invalidate实现为clean and invalidate |
clean | 将缓存块更新到L2缓存块或着内存 | - |
clean and invalidate | 先做clean,再执行invalidate | - |
飞腾CPU提供的常规高速缓存指令分为:
- 面向指令缓存的IC指令
仅仅提供invalidate操作
- 面向数据缓存的DC指令。
clean操作主要是将L1数据缓存块内容更新到L2缓存块或者芯片外部内存中;
invalidate操作主要是先执行clean操作然后将数据缓存块释放。
指令 | 操作说明 |
---|---|
IC IALLU | 释放全部L1指令缓存 |
IC IVAU,Xn | 释放L1指令缓存块 |
DC CVAU,Xn | 将L1数据缓存块更新到L2缓存块中 |
DC CVAC,Xn | 将L1数据缓存块更新到内存中 |
DC CIVAC,Xn | 将L1数据缓存块更新到内存中,然后将相关缓存块失效 |
4.__inval_dcache_area函数分析
输入参数
- kaddr 内核起始地址
- size 长度
函数描述
将[kaddr, kadr+size)地址范围内的缓冲块失效。要注意,如果地址不对齐的时候,也保证两端不完整的缓冲块数据更新到内存中,然后再失效。
4.1 准备好相关参数
add x1, x1, x0
dcache_line_size x2, x3
sub x3, x2, #1
此时:
x0为起始地址
x1为结束地址
x2为缓冲块掩码,即缓冲块长度-1
x3为缓冲块长度
4.2 处理尾部不对齐情况
tst x1, x3
bic x1, x1, x3
b.eq 1f
dc civac, x1
1:
这一部分需要采用clean and invalidate操作,保证数据被更新到内存。
4.3 处理头部不对齐情况
tst x0, x3
bic x0, x0, x3
b.eq 2f
dc civac, x0
b 3f
2:
这一部分需要采用clean and invalidate操作,保证数据被更新到内存。
4.3 处理中间对齐情况
dc ivac, x0
3: add x0, x0, x2
cmp x0, x1
b.lo 2b
这段并不更新数据到内存,而是直接将缓冲块失效。注意:飞腾CPU依然会将数据更新到内存。
4.4结束退出
dsb sy
ret