内存连续就一定会获得高性能吗?是的!

连续内存访问优于矩阵按列内存访问,矩阵按列访问优于随机访问。

但其背后仅仅是prefetch的功劳吗?不一定!

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>#define MAX 0xfffffunsigned int next_seq(unsigned int seed)
{return seed * 1 + 11;
}unsigned int next_rnd(unsigned int seed)
{return seed * 1664525 + 1013904223;
}int arr[MAX];
int main(int argc, char **argv)
{int i, j, size;int seed = 0;size = atoi(argv[1]);if(atoi(argv[2]) == 0) { // 顺序访问内存for(i = 0; i < size; ++i) {seed = next_seq(seed)%size;j = arr[seed];arr[seed] = 1;}} else { // 随机访问内存int seed = time(NULL);;for(i = 0; i < size; ++i) {seed = next_rnd(seed)%size;j = arr[seed];arr[seed] = 1;}}return 0;
}

孰优孰劣呢?

先看cache miss:

[shabi root@shabi /home/zyte]
# perf stat -e L1-dcache-load-misses  ./a.out 1000000 1Performance counter stats for './a.out 1000000 1':1,094,294      L1-dcache-load-misses0.020677177 seconds time elapsed[shabi root@shabi /home/zyte]
# perf stat -e L1-dcache-load-misses  ./a.out 1000000 0Performance counter stats for './a.out 1000000 0':753,484      L1-dcache-load-misses0.018539000 seconds time elapsed[shabi root@shabi /home/zyte]

非常容易理解,随机访问的cache命中率要低一些,但是prefetch的效果呢?

[shabi root@shabi /home/zyte]
# perf stat -e L1-dcache-prefetch-misses  ./a.out 1000000 0Performance counter stats for './a.out 1000000 0':644,380      L1-dcache-prefetch-misses0.018453423 seconds time elapsed[shabi root@shabi /home/zyte]
# perf stat -e L1-dcache-prefetch-misses  ./a.out 1000000 1Performance counter stats for './a.out 1000000 1':8,214      L1-dcache-prefetch-misses0.020350861 seconds time elapsed[shabi root@shabi /home/zyte]

随机访问的prefetch性能竟然是如此之高!然而肯定有哪里拖了后腿,毕竟总体性能才是结果,至于prefetch,load miss,store load,都只是个别指标。它们取决于:

  • 对象结构体的大小。
  • cacheline的大小。
  • 随机访问跨越的大小。
  • pagefault的处理情况。
  • TLB的命中情况。

所以,不能只看单个指标,要全局观测。

总体上,如果你分别实验顺序访问,矩阵按列访问,随机访问,它们的性能是逐级降低的,最终完全随机的访问将使得CPU的prefetch策略完全失策,它将无法预测步长而失败。

请看下面的代码:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/mman.h>
#include <unistd.h>struct stub {int a;char m[0];
};unsigned int next_seq(unsigned int seed)
{return seed;
}unsigned int next_rnd(unsigned int seed)
{return seed * 1664525 + 1013904223;
}int main(int argc, char **argv)
{int rnd, i, j;struct stub *s, *p;int type = 0, size = 0;size = atoi(argv[1]);;type = atoi(argv[2]);size *= size;// 为了不引入page fault的影响,所以lock内存。p = (struct stub *)mmap(0, sizeof(struct stub)*size, PROT_READ|PROT_WRITE, MAP_ANON|MAP_PRIVATE|MAP_LOCKED, 0, 0);if (p == MAP_FAILED) {perror("mmap");return 1;}if (type == 0) {int seed = 0;for (i = 0; i < size; i++) {seed = i;s = &p[seed];s->a = 123;}} else if (type == 1) {int seed = 10;for (i = 0; i < size; i++) {seed = i/size + i%size;s = &p[seed];s->a = 123;}} else if (type == 2) {int seed = 10;for (i = 0; i < size; i++) {seed = next_seq(seed)%size;s = &p[seed];s->a = 123;}}return 0;
}

给出一次的比较结果:

[shabi root@shabi /home/zyte]
# perf stat -e L1-dcache-prefetch-misses,L1-dcache-load-misses,L1-dcache-store-misses,dTLB-load-misses,dTLB-loads ./a.out 10000 0Performance counter stats for './a.out 10000 0':581,025      L1-dcache-prefetch-misses                                     (79.67%)12,963,828      L1-dcache-load-misses                                         (40.05%)12,505,851      L1-dcache-store-misses                                        (60.04%)8,443      dTLB-load-misses          #    0.00% of all dTLB cache hits   (80.02%)704,426,609      dTLB-loads                                                    (59.82%)0.575746888 seconds time elapsed[shabi root@shabi /home/zyte]
# perf stat -e L1-dcache-prefetch-misses,L1-dcache-load-misses,L1-dcache-store-misses,dTLB-load-misses,dTLB-loads ./a.out 10000 1Performance counter stats for './a.out 10000 1':350,254      L1-dcache-prefetch-misses                                     (79.87%)13,293,181      L1-dcache-load-misses                                         (40.09%)12,716,868      L1-dcache-store-misses                                        (60.06%)12,670      dTLB-load-misses          #    0.00% of all dTLB cache hits   (80.03%)1,007,100,446      dTLB-loads                                                    (59.88%)1.342234496 seconds time elapsed[shabi root@shabi /home/zyte]
# perf stat -e L1-dcache-prefetch-misses,L1-dcache-load-misses,L1-dcache-store-misses,dTLB-load-misses,dTLB-loads ./a.out 10000 2Performance counter stats for './a.out 10000 2':565,455      L1-dcache-prefetch-misses                                     (79.85%)6,797,220      L1-dcache-load-misses                                         (40.07%)6,661,030      L1-dcache-store-misses                                        (60.07%)20,683      dTLB-load-misses          #    0.00% of all dTLB cache hits   (80.04%)1,107,220,421      dTLB-loads                                                    (59.89%)1.603148689 seconds time elapsed

我还缺的是一个大页实验。


浙江温州皮鞋湿,下雨进水不会胖。

关于cache miss和prefetch miss的实验相关推荐

  1. ARP Cache Poisoning Attack Lab(SEED实验)

    ARP Cache Poisoning Attack Lab(SEED实验) ARP缓存中毒攻击可以诱使受害者主机将报文发向攻击者指定的路由方向,并由此完成诸如中间人攻击等攻击手段.本实验使用scap ...

  2. Windows 远程桌面连接使用教程

    做为一个对 vps 不太了解的新手站长,首先要学会的就是怎么用远程桌面软件登陆 vps,我们一般都使用 Windows7 系统自带的"远程桌面连接".位置在桌面的开始-程序-附件- ...

  3. 【计算机体系结构实验】Cache 性能分析

    文章目录 实验四 Cache 性能分析 一.实验目的: 二.实验平台: 三.实验内容和步骤: 1. MyCache 模拟器的使用方法: 2.Cache容量对不命中率的影响. 3.相联度对不命中率的影响 ...

  4. 【cache prefetch】

    https://en.wikipedia.org/wiki/Cache_prefetching 文章目录 1. Data vs. instruction cache prefetching 2. Ha ...

  5. 利用cache特性检测Android模拟器

    Author:leonnewton 0x00 序 目前对Android模拟器的检测,主要是从特定的系统值来进行区分的.例如,getDeviceId().getLine1Number()这类函数,还有a ...

  6. (SEED-Lab) ARP Cache Poisoning Attack Lab

    (SEED-Lab) ARP Cache Poisoning Attack Lab 欢迎大家访问我的GitHub博客 https://lunan0320.cn 文章目录 (SEED-Lab) ARP ...

  7. 【SEED Lab】ARP Cache Poisoning Attack Lab

    ARP Cache Poisoning Attack Lab 一.实验的基本环境 一共有三台机器,我们使用Host M进行攻击,因为ARP协议只在局域网上运行,所以三台机器在同一个局域网上面. 二.实 ...

  8. 【计算机网络】实验报告一:验证性实验

    验证性实验 1.ipconfig 2.ping 3.tracert 4.ARP 5.DHCP 6.netstat 7.DNS 8.cache 本部分共有 8 个实验,实验 1-7 使用 Cmder 在 ...

  9. 计算机网络实验报告-632007060215

    计算机网络实验报告 验证性实验--验证性实验 ipconfig 实作一 实作二 ping 实作一 实作二 tracert 实作一 实作二 ARP 实作一 实作二 实作三 DHCP 实作一 实作总结(失 ...

最新文章

  1. Python入门(一)数据类型、循环语句
  2. CVPR 2021 Oral | Transformer再发力!华南理工和微信提出UP-DETR
  3. 【51CTO学院三周年】写给自己的51cto
  4. 好用的netcat工具
  5. DB级buffer与IO 查看
  6. 理解Flexbox弹性盒子
  7. python-windows安装相关问题
  8. 常识知识在AI不同领域应用的最新研究进展
  9. bytevalue_Java Short类byteValue()方法及示例
  10. vsftpd的简单安装和配置(只有三步)
  11. arm hisiv100 linux,hisiv100交叉编译工具链安装
  12. LeetCode 242. 有效的字母异位词 (计数排序思想字符处理)
  13. Jsoncpp 使用方法大全
  14. ubuntu 卸载NetworkManager
  15. 如果一非零的整系数多项式能够分解成两个次数较低的有理系数多项式的乘积,那么它一定能分解成两个次数较低的整系数多项式的乘积
  16. Android 线程4件套 MessageQueue Message Looper Handler之Looper
  17. 深入机器学习系列之:隐式狄利克雷分布(1)
  18. 如何保持长时间高效学习
  19. java34-计算机的发展-计算机硬件-计算机软件-计算机存储规则-计算机的基本操作-CMD-环境变量
  20. 什么是128陷阱?什么是装箱?什么是拆箱?为什么要有包装类?

热门文章

  1. oracle中年差、月差、日差的计算
  2. 第六届全国嵌入式系统学术交流会
  3. 期刊分类常识 核心期刊?普刊?
  4. 2017CSDN博客排名第一名,今何处?
  5. 日常好用免费视频剪辑软件
  6. 设计模式之java-学习笔记
  7. 通用一键打包软件,数据包制作工具
  8. 类似百度输入框自动联想功能遇到的问题:Opera浏览器不支持拼音输入法时的keyup事件
  9. 架构活动中风险敞口的预估
  10. 有10个学生,每个学生的数据包括学号、姓名、3门课程的成绩,从键盘输入10个学生数据 要求输出3门课程总平均成绩,以及最高分的学生的数据(包括学号、姓名、3门课程成绩)