perf stat中page-faults含义及两种矩阵乘法page-faults相同的疑问
关于矩阵乘法性能测试中Page Faults的疑问解答
嘿,刚好做过类似的缓存与内存性能分析,来帮你拆解这两个问题:
1. Page Faults 能不能等同于TLB Miss或Cache Miss?
绝对不能直接划等号,这三个是完全不同层级的内存访问事件:
- Cache Miss:CPU在L1/L2/L3缓存里找不到需要的数据,得从主内存(DRAM)里读取。这是最快的一类“缺失”,通常只需要几十个时钟周期。
- TLB Miss:TLB(Translation Lookaside Buffer)是用来加速虚拟地址到物理地址翻译的缓存。当TLB里没有对应页表项时,会触发页表遍历——如果需要的页表项在内存里,就是“软TLB Miss”,只需要几百个时钟周期;如果页表项也不在内存,才会触发Page Fault。
- Page Fault:这是最严重的一种——需要访问的虚拟内存页根本不在物理内存里,操作系统得从磁盘(或swap分区)把对应页加载进来,这个过程需要毫秒级的时间,比前两者慢好几个数量级。
简单说:TLB Miss可能引发Page Fault,但大部分TLB Miss不会;Cache Miss和Page Fault更是完全无关的层级事件——Cache Miss是CPU和主存之间的交互,Page Fault是主存和磁盘之间的交互。
2. 为什么两种矩阵乘法算法的Page Faults数量完全一致?
核心原因是:Page Fault的数量只和你需要访问的物理页总数有关,和访问顺序无关。
你用的是2048×2048的矩阵,假设每个元素是4字节的float,单个矩阵就是2048*2048*4=16MiB,三个矩阵总共48MiB。现在主流系统的页大小是4KiB,那总共有48*1024 /4=12288个物理页需要加载。
不管你用普通的矩阵乘法(按行/列顺序访问)还是高效的分块乘法(利用局部性减少Cache Miss),最终所有的物理页都会被访问至少一次——操作系统是按需加载页的,第一次访问某个页时触发Page Fault,之后再访问这个页就不会再触发了。两种算法只是改变了访问页的顺序,但不会减少或增加需要访问的总页数,所以Page Fault的数量自然完全相同。
至于你调整SCHED_FIFO调度减少了上下文切换,这只会减少因进程切换导致的页置换,但你的测试里矩阵的所有页最终都会被加载到物理内存,所以也不会影响总Page Fault数。
内容的提问来源于stack exchange,提问作者tinkerbeast
相关产品推荐
相关产品推荐

