寄存器山分析——CSAPP discuss
解读所附 mountain 程序,并将该 mountain 程序在本组内不同(品牌/配置)PC 的 linux 系统上运行它。尝试绘制自己的存储器 山三维图(或两张二维图),并解读该存储器山,根据结果分析该系统上的高速缓存的大小。建议可在组内不同配置机器上运行,比较不 同机器上高速缓存的设置。
一. 解读 mountain 程序:
int main()
{int size; /* Working set size (in bytes) 工作集*/int stride; /* Stride (in array elements) 步长*/double Mhz; /* Clock frequency 时钟频率,主频*/init_data(data, MAXELEMS); /* Initialize each element in data 初始化数据中的每个元素*/Mhz = mhz(0); /* Estimate the clock frequency 估计时钟频率*//* $end mountainmain *//* Not shown in the text */printf("Clock frequency is approx. %.1f MHz\n", Mhz);printf("Memory mountain (MB/sec)\n");printf("\t");for (stride = 1; stride <= MAXSTRIDE; stride++)printf("s%d\t", stride);printf("\n");/* $begin mountainmain */for (size = MAXBYTES; size >= MINBYTES; size >>= 1) { //遍历size工作集,cache(1 << 27) 128M--->(1<<14) 16k/* $end mountainmain *//* Not shown in the text */if (size > (1 << 20))printf("%dm\t", size / (1 << 20));elseprintf("%dk\t", size / 1024);/* $begin mountainmain */for (stride = 1; stride <= MAXSTRIDE; stride++) { //遍历步长stride,1--->15printf("%.1f\t", run(size, stride, Mhz));}printf("\n");}exit(0);
}
int test(int elems, int stride) /* The test function 测试程序*/
{int i;long result = 0; volatile long sink; for (i = 0; i < elems; i += stride) {result += data[i]; }sink = result; /* So compiler doesn't optimize away the loop 所以编译器不会优化循环*/return sink;
}
double run(int size, int stride, double Mhz)
{ double cycles;int elems = size / sizeof(double); test(elems, stride); /* warm up the cache */ //line:mem:warmup 预热缓存cycles = fcyc2(test, elems, stride, 0); /* call test(elems,stride) */ //line:mem:fcycreturn (size / stride) / (cycles / Mhz); /* convert cycles to MB/s */ //line:mem:bwcompute number/time
}
① 如果一个程序在 s 秒的时间段内读 n 个字节,那么这段时间内的读吞吐量就 等于n/s,典型地是以兆字节每秒 (MB/s) 为单位的
② run函数内部又一重循环,通过以步长 stride 扫描整数数组的头 elems 个元素来产生读序列,那么测量出的读吞吐量能让我们看到对于这个读序列来说的存储系统的性能。
③ 这个run程序运行的时间通过fcyc2函数来测量,以 CPU 周期为单位。
④ 而读次数n=size/stride,运行时间为s=cycle/Mhz(CPU主频),利用公式n/s即计算出读吞吐量
⑤ 我们已经具备了测量读吞吐量,接下来我们就要产生足够多的序列数据,通过双重循环遍历/遍历步长stride1—>64,workSize (1 << 25) 32M—>(1<<11) 2k从而生成足够多的数据
二. 数据分析
1.编译运行
linux>gcc -c clock.c -o clock.o
linux> gcc -c fcyc2.c -o fcyc2.o
linux> gcc -c mountain.c -o mountain.o
linux> gcc clock.o fcyc2.o mountain.o -o run
linux>./run
- 用 lscpu指令查看cache大小:
- 数据分析:
(1)整体分析:
① size 从 2KB 变到 32MB, stride 从 1 变到 64 个元素,每个元素是一个 8 个字节的 double
整体趋势:我们看到随着workSetSize的增大读吞吐率反而减小;随着随着stride的增大读吞吐率也呈现减小的趋势;因此整个Corei5的都吞吐量的趋势是:size 的值越小,得到的工作集越小,因此时间局部性越好。 stride 的值越小,得到的空间局部性越好。
② 垂直于 size 轴的是四条山脊,分别 对应于工作集完全在 Ll 高速缓存、 L2 高速缓存、 L3 高速缓存和主存内的时间局部性区城。
③ 在 L1,L2、 L3 和主存山脊上随着步长的增加有一个空间局部性的斜坡,空间局部性下降。
(2)取出一个片段,保持步长为常数stride=16
工作集完全能放进统一的 L3 高速缓 存中。更大的工作集大小主要由主存来服务。
① 在吞吐量峰值 4213MB/s 处,读都是由 L1 来服务的,大小最大为 256KB 的工作 集完全能放进统一的 L2 高速缓存中,对于大小最大为 8M, 工作集完全能放进统一的 L3 高速缓 存中。更大的工作集大小主要由主存来服务。
② 由此估计出本机器的数据L1-d-cache大致为32KB,L2-cache=256kb,L3通用cache=8M
③ L3 高速缓存区域最左边的边缘上读吞吐量的下降很有可能是 由其他数据和代码块造成的,这些数据和代码块使得不可能将整个数组都装进相应的高速缓存中。
(3)保持工作集大小不变,size=256kb,空间局部性斜坡如下:
① 在256kb 山脊,L2中的读不命中会导致一个块从 L3 传送到 L2。后面在 L2 中这个块上会有一定数量的 命中,这是取决于步长的。随着步长的增加, L2 不命中与 L2 命中的比值也增加了。所以说吞吐量呈现下降的趋势。
机器2:
① size 从 2KB 变到 32MB, stride 从 1 变到 64 个元素,每个元素是一个 8 个字节的 double
整体趋势:我们看到随着workSetSize的增大读吞吐率反而减小;随着随着stride的增大读吞吐率也呈现减小的趋势;因此整个Corei5的都吞吐量的趋势是:size 的值越小,得到的工作集越小,因此时间局部性越好。 stride 的值越小,得到的空间局部性越好。
② 垂直于 size 轴的是四条山脊,分别 对应于工作集完全在 Ll 高速缓存、 L2 高速缓存、 L3 高速缓存和主存内的时间局部性区城。
④ 在 L1,L2、 L3 和主存山脊上随着步长的增加有一个空间局部性的斜坡,空间局部性下降。
(2)取出一个片段,保持步长为常数stride=16
工作集完全能放进统一的 L3 高速缓 存中。更大的工作集大小主要由主存来服务。
④ 在吞吐量峰值 3158.3MB/s 处,读都是由 L1 来服务的,大小最大为 256KB 的工作 集完全能放进统一的 L2 高速缓存中,对于大小最大为 6M, 工作集完全能放进统一的 L3 高速缓 存中。更大的工作集大小主要由主存来服务。
⑤ 由此估计出本机器的数据L1-d-cache大致为32KB,L2-cache=256kb,L3通用cache=6M左右
⑥ L3 高速缓存区域最左边的边缘上读吞吐量的下降很有可能是 由其他数据和代码块造成的,这些数据和代码块使得不可能将整个数组都装进相应的高速缓存中。
(3)保持工作集大小不变,size=256kb,空间局部性斜坡如下:
① 在256kb 山脊,L2中的读不命中会导致一个块从 L3 传送到 L2。后面在 L2 中这个块上会有一定数量的 命中,这是取决于步长的。随着步长的增加, L2 不命中与 L2 命中的比值也增加了。所以说吞吐量呈现下降的趋势。
三.结论
① 机器1的数据L1-d-cache大致为32KB,L2-cache=256kb,L3通用cache=8M左右,机器2的数据L1-d-cache大致为32KB,L2-cache=256kb,L3通用cache=6M左右。
② 我们看到随着workSetSize的增大读吞吐率反而减小;随着随着stride的增大读吞吐率也呈现减小的趋势;因此整个Corei5的都吞吐量的趋势是:size 的值越小,得到的工作集越小,因此时间局部性越好。 stride 的值越小,得到的空间局部性越好。
③ 存储器系统的性能是一座时间和空间局部性的山,这座山的上升高度差别可以超过一个数量级。在编写我们的程序时,应该尽量使得程序运行在山峰而不是低谷。目标就是利用时间局部性,使得频繁使用的字、字从 Ll 中取出,还要利用空间局部性,使得尽可能多的字从一个 Ll 高速缓存行中访问到。
寄存器山分析——CSAPP discuss相关推荐
- 【Windows 逆向】OD 调试器工具 ( 分析 OD 硬件断点处的关键代码 | 添加硬件断点 | 关键代码 | MOV 指令 | EAX 寄存器值分析 | 使用命令查看 esi+0cc 地址 )
文章目录 一.添加硬件断点 二.关键代码 三.MOV 汇编指令格式 四.EAX 寄存器值分析 五.使用命令查看 esi+0cc 地址 一.添加硬件断点 在上一篇博客中 , 在子弹个数数据内存地址 07 ...
- MDK寄存器地址映射分析
在51单片机中: 首先我们看看 51 中是怎么做的.51 单片机开发中经常会引用一个 reg51.h 的头文件,下面我们看看他是怎么把名字和寄存器联系起来的: sfr P0 =0x80; sfr 也是 ...
- 以太网PHY寄存器分析
以太网PHY寄存器分析 1 1.以太网PHY标准寄存器分析 2 1.1 Control Register 2 1.2 Status register 5 1.3 PHY Ide ...
- 以太网PHY寄存器分析【转】
转自:https://blog.csdn.net/Firefly_cjd/article/details/79825869 以太网PHY寄存器分析 1 1.以太网PHY标准寄存器分析 2 ...
- phy芯片测试寄存器_以太网PHY寄存器分析
以太网PHY寄存器分析 1 1.以太网PHY标准寄存器分析 2 1.1 Control Register 2 1.2 Status register 5 1.3 PHY Ide ...
- CSAPP大作业程序人生
计算机系统 大作业 题 目 程序人生-Hello's P2P 专 业 计算学部 学 号 班 级 学 生 指 导 教 师 吴锐 计算机科学与技术学院 2022年5 ...
- 4412 GPIO读 和 ioremap控制GPIO寄存器
一.配置GPIO读 在视频14的基础上做 1.利用拨码开关来实现GPIO输入 所以AP_SLEEP对应GPC0_3,然后在drivers/gpio/gpio-exynos4.c中对应EXYNOS4_G ...
- Dalvik解释器源码到VMP分析
前言 学习这块的主要目的还是想知道vmp是如何实现的,如何与系统本身的虚拟机配合工作,所以简单的学习了Dalvik的源码并对比分析了数字公司的解释器.笔记结构如下: dalvik解释器分析 dalvi ...
- 贺利坚老师汇编课程54笔记:标志寄存器
指路老师的博客 8086状态标志寄存器含义 FLAG标志寄存器:PSW/FLAGS,别称:程序状态字 8086CPU指令集中,有的指令的执行是影响标志寄存器,比如:add,sub,mul,div,in ...
最新文章
- 点击除元素以外的任意地方隐藏元素js
- 编程语言python入门要电脑什么配置能带动-要学一门编程语言,那我一定选择Python!...
- 鸿蒙系统多会发布,华为官宣鸿蒙系统将发布,还将发布多款新品
- 前端学习(1903)vue之电商管理系统电商系统之调用api添加用户
- Rails用DELETE method提交表单讲解
- python-if判断的本质
- Elasticsearch使用备忘
- PowerShell 操作 Azure Blob Storage
- 心痛!常德网约车司机遇害 滴滴回应:已成立应急处置小组
- tensorflow-gpu:false /cuda程序执行出错: libcudart.so.10.0: cannot open shared object file
- linux 自动挂载usb设备,Raspberry Pi 自动挂载USB存储设备
- windowsXP的所有应用命令
- 4.4系统,拍照-裁剪,resultCode返回0
- Shell nohup 命令详解
- 计算机3d相册代码,3D水晶相册代码【有显示图】
- 有道云笔记分享_有道云笔记
- c++ 隐藏和显示标题栏
- Linux全套完整视频教程
- 【论文笔记】Nonparallel Emotional Speech Conversion Using VAE-GAN 基于VAE-GAN的非平行情感语音生成
- 工作八年的程序员,却拿着毕业三年的工资,再不开窍就真晚了...