【CSAPP】Cache Lab 实验笔记
cachelab这节先让你实现个高速缓存模拟器,再在此基础上对矩阵转置函数进行优化,降低高速缓存不命中次数。我的感受如上一节,实在是不想研究这些犄角旮旯的优化策略了。
前期准备
我实验的时候用到了valgrind和python,都可以用apt-get大法直接安装
Prat A: 高速缓存模拟器
C语言图书管理系统级别的题目,照着课本硬模拟就行。讲义里说可以用malloc动态分配cache大小,但这东西规模很小,我直接预定义成了个大二维数组。唯一能说的新东西就是getopt了,解答了我一直以来对程序参数处理的标准方案的疑惑。
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <getopt.h>
#include "cachelab.h"
#define MAX_CACHE_SET 32
#define MAX_CACHE_LINE 32
#define DEBUG 0
int hit_cnt;
int miss_cnt;
int eviction_cnt;
int cmd_cnt;
int s,E,b;
struct cache_line
{
int valid_bit;
int tag_bit;
int last_time;
}cache[MAX_CACHE_SET][MAX_CACHE_LINE];
void init();
void args_parse(int argc, char *argv[]);
void cmd_parse(char *cmd,long long addr);
void exec_cmd(long long addr);
void addr_parse(long long addr,int *tag_bit,int *set_id);
int main(int argc,char *argv[]);
void init(){
hit_cnt=miss_cnt=eviction_cnt=cmd_cnt=0;
memset(cache,0,sizeof(cache));
return;
}
void args_parse(int argc, char *argv[]){
char ch;
while((ch=getopt(argc, argv,"s:E:b:t:"))!=-1){
switch (ch)
{
case 's':
s=atoi(optarg);
break;
case 'E':
E=atoi(optarg);
break;
case 'b':
b=atoi(optarg);
break;
case 't':
freopen(optarg, "r", stdin);
}
}
return;
}
void cmd_parse(char *cmd,long long addr){
switch (cmd[0])
{
case 'I':
break;
case 'L':
exec_cmd(addr);
break;
case 'S':
exec_cmd(addr);
break;
case 'M':
exec_cmd(addr);
exec_cmd(addr);
break;
}
return;
}
void addr_parse(long long addr,int *tag_bit,int *set_id){
int tmp=0;
for(int i=0;i<s;i++){
tmp=(tmp<<1)+1;
}
*set_id=((int)(addr>>b)&tmp)%(1<<s);
*tag_bit=(int)(addr>>(b+s));
return;
}
void exec_cmd(long long addr){
int tag_bit,set_id;
cmd_cnt++;
addr_parse(addr,&tag_bit,&set_id);
if(DEBUG) printf("%d %d ",set_id,tag_bit);
for(int i=0;i<E;i++){
if((cache[set_id][i].valid_bit)
&&(cache[set_id][i].tag_bit)==tag_bit
){
cache[set_id][i].last_time=cmd_cnt;
hit_cnt++;
if(DEBUG) printf("hit\n");
return;
}
}
miss_cnt++;
for(int i=0;i<E;i++){
if(!cache[set_id][i].valid_bit){
cache[set_id][i].valid_bit=1;
cache[set_id][i].tag_bit=tag_bit;
cache[set_id][i].last_time=cmd_cnt;
if(DEBUG) printf("miss\n");
return;
}
}
eviction_cnt++;
int victim_id=0;
for(int i=0;i<E;i++){
if(cache[set_id][i].last_time<cache[set_id][victim_id].last_time){
victim_id=i;
}
}
cache[set_id][victim_id].tag_bit=tag_bit;
cache[set_id][victim_id].last_time=cmd_cnt;
if(DEBUG) printf("miss eviction\n");
return;
}
int main(int argc,char *argv[])
{
init();
args_parse(argc,argv);
char cmd[10];
long long addr;
int blocksize;
while(~scanf("%s %llx,%d",cmd,&addr,&blocksize)){
cmd_parse(cmd,addr);
}
printSummary(hit_cnt, miss_cnt, eviction_cnt);
return 0;
}
Part B:优化矩阵转置函数
这题用到了一种名为分块(blocking)的技术,指将要处理的大块数据分割为可以放入L1高速缓存的小块,把与这一小块的全部相关操作一次性处理完再切换下一小块,以此来提高L1高速缓存的利用率。块的尺寸可以通过枚举测试或者数学方法分析来决定。
除此之外 ,还可以对高速缓存中的冲突现象进行进一步分析,但如在perflab里所说,我实在懒得研究这种细枝末节的优化,所以只得了个一般般的分数就收手了。
void transpose_submit(int M, int N, int A[N][M], int B[M][N])
{
int rr,cc,r,c;
int bsize;
if(M==32) bsize=8;
else if(M==64) bsize=4;
else if(M==61) bsize=16;
for(rr=0;rr<N;rr+=bsize){
for(cc=0;cc<M;cc+=bsize){
for(r=rr;r<N&&r<rr+bsize;r++){
for(c=cc;c<M&&c<cc+bsize;c++){
B[c][r]=A[r][c];
}
}
}
}
return;
}
最终成绩如下:
Part A: Testing cache simulator
Running ./test-csim
Your simulator Reference simulator
Points (s,E,b) Hits Misses Evicts Hits Misses Evicts
3 (1,1,1) 9 8 6 9 8 6 traces/yi2.trace
3 (4,2,4) 4 5 2 4 5 2 traces/yi.trace
3 (2,1,4) 2 3 1 2 3 1 traces/dave.trace
3 (2,1,3) 167 71 67 167 71 67 traces/trans.trace
3 (2,2,3) 201 37 29 201 37 29 traces/trans.trace
3 (2,4,3) 212 26 10 212 26 10 traces/trans.trace
3 (5,1,5) 231 7 0 231 7 0 traces/trans.trace
6 (5,1,5) 265189 21775 21743 265189 21775 21743 traces/long.trace
27
Part B: Testing transpose function
Running ./test-trans -M 32 -N 32
Running ./test-trans -M 64 -N 64
Running ./test-trans -M 61 -N 67
Cache Lab summary:
Points Max pts Misses
Csim correctness 27.0 27
Trans perf 32x32 6.9 8 343
Trans perf 64x64 1.2 8 1891
Trans perf 61x67 10.0 10 1992
Total points 45.1 53
【CSAPP】Cache Lab 实验笔记的更多相关文章
- 【CSAPP】Shell Lab 实验笔记
shlab这节是要求写个支持任务(job)功能的简易shell,主要考察了linux信号机制的相关内容.难度上如果熟读了<CSAPP>的"异常控制流"一章,应该是可以不 ...
- 【CSAPP】Attack Lab实验笔记
attacklab这节玩的是利用一个字符串进行缓冲区溢出漏洞攻击,就小时候想象中黑客干的事儿. 做题的时候好几次感叹这些人的脑洞,"这都可以攻击?还能这么注入?这还可能借力打力?" ...
- 【CSAPP】Performance Lab 实验笔记
perflab这节的任务是利用书中知识,来对图像处理中的Rotate和Smooth操作函数进行优化.这次没对上电波,觉得学了一堆屠龙之技.于我个人理解,现在计算机配置比以前高多了,连SWAP分区都几近 ...
- 【CSAPP】Architecture Lab 实验笔记
archlab属于第四章的内容.这章讲了处理器体系结构,就CPU是怎样构成的.看到时候跃跃欲试,以为最后实验是真要去造个CPU,配套资料也是一如既往的豪华,合计四十多页的参考手册,一大包的源码和测试程 ...
- 【CSAPP】Bomb Lab实验笔记
bomblab这节搞的是二进制拆弹,可以通俗理解为利用反汇编知识找出程序的六个解锁密码. 早就听闻BOMBLAB的大名,再加上我一直觉得反汇编是个很艰难的工作,开工前我做好了打BOSS心理准备.实际上 ...
- 【CSAPP】Data Lab实验笔记
前天讲到要刚CSAPP,这一刚就是两天半.CSAPP果然够爽,自带完整的说明文档,评判程序,辅助程序.样例直接百万组走起,管饱! datalab讲的是整数和浮点数怎么用二进制表示的,考验的是用基本只用 ...
- ChCore Lab3 用户进程和异常处理 实验笔记
本文为上海交大 ipads 研究所陈海波老师等人所著的<现代操作系统:原理与实现>的课程实验(LAB)的学习笔记的第三篇:用户进程与异常处理.所有章节的笔记可在此处查看:chcore | ...
- CSAPP buffer lab记录——IA32版本
CSAPP buffer lab为深入理解计算机系统(原书第二版)的配套的缓冲区溢出实验,该实验要求利用缓冲区溢出的原理解决5个难度递增的问题,分别为smoke(level 0).fizz(level ...
- CSAPP Bomb Lab记录
记录关于CSAPP 二进制炸弹实验过程 (CSAPP配套教学网站Bomb Lab自学版本,实验地址:http://csapp.cs.cmu.edu/2e/labs.html) (个人体验:对x86汇编 ...
随机推荐
- Error running 'App': Command line is too long. Shorten command line for App or also for Spring Boot default configuration.
找到标签 <component name="PropertiesComponent">.在标签里加一行 : <property name="dynam ...
- HTML 5中的本地存储概念?
很多时候,我们想在本地计算机存储有关用户的信息.例如,假设用户已经填满了一半的长表单,互联网却突然连接中断.此时,用户希望能在本地存储这些信息,然后当重新连接到互联网的时候,获取这些信息,并将其发送到 ...
- HTML 5中的输出元素是什么?
当你需要计算两个输入的结果并将结果放到一个标签里的时候,就需要输出元素了.比如你有两个文本框(参见下图),你想要让这些文本框数字相加,然后输出给标签. 下面就是如何使用HTML 5代码输出元素. &l ...
- Flask-SQLAlchemy 使用教程
Flask-SQLAlchemy ,是对SQLAlchemy进一步封装 SQLAlchemy使用教程地址: https://www.cnblogs.com/bigox/p/11552542.html ...
- 【leetcode 29】 两数相除(中等)
题目描述 给定两个整数,被除数 dividend 和除数 divisor.将两数相除,要求不使用乘法.除法和 mod 运算符. 返回被除数 dividend 除以除数 divisor 得到的商. 整数 ...
- 翻译:HTML5与HTML4的区别
本文选译自:W3C Working Group Note: HTML5 Differences from HTML4. 解释一下W3C Working Group Note,作为"工作组笔记 ...
- throws子句在继承当中overrride时有什么规则
8.throws子句在继承当中overrride时的规则 马克-to-win:当子类方法override父类方法时,throws子句不能引进新的checked异常.换句话说:子类override方法的 ...
- Android控件设置半透明+EditText设置默认值+ 控件居中
Android控件设置半透明 效果 代码: android:background="#50FFFFFF" 50表示50%透明 Android:EditText设置默认值 andro ...
- 单位ren vw vh 和 vm
px: (像素)就是一张图片最小的一个点 em :参考物是父元素的font-size,具有继承的特点 rem: 参考物是HTML的font-size
- CVE-2022-22947 SpringCloud GateWay SpEL RCE
CVE-2022-22947 SpringCloud GateWay SpEL RCE 目录 CVE-2022-22947 SpringCloud GateWay SpEL RCE 写在前面 环境准备 ...