cachelab这节先让你实现个高速缓存模拟器,再在此基础上对矩阵转置函数进行优化,降低高速缓存不命中次数。我的感受如上一节,实在是不想研究这些犄角旮旯的优化策略了。

前期准备

我实验的时候用到了valgrind和python,都可以用apt-get大法直接安装

Prat A: 高速缓存模拟器

C语言图书管理系统级别的题目,照着课本硬模拟就行。讲义里说可以用malloc动态分配cache大小,但这东西规模很小,我直接预定义成了个大二维数组。唯一能说的新东西就是getopt了,解答了我一直以来对程序参数处理的标准方案的疑惑。

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <unistd.h>
  4. #include <string.h>
  5. #include <getopt.h>
  6. #include "cachelab.h"
  7. #define MAX_CACHE_SET 32
  8. #define MAX_CACHE_LINE 32
  9. #define DEBUG 0
  10. int hit_cnt;
  11. int miss_cnt;
  12. int eviction_cnt;
  13. int cmd_cnt;
  14. int s,E,b;
  15. struct cache_line
  16. {
  17. int valid_bit;
  18. int tag_bit;
  19. int last_time;
  20. }cache[MAX_CACHE_SET][MAX_CACHE_LINE];
  21. void init();
  22. void args_parse(int argc, char *argv[]);
  23. void cmd_parse(char *cmd,long long addr);
  24. void exec_cmd(long long addr);
  25. void addr_parse(long long addr,int *tag_bit,int *set_id);
  26. int main(int argc,char *argv[]);
  27. void init(){
  28. hit_cnt=miss_cnt=eviction_cnt=cmd_cnt=0;
  29. memset(cache,0,sizeof(cache));
  30. return;
  31. }
  32. void args_parse(int argc, char *argv[]){
  33. char ch;
  34. while((ch=getopt(argc, argv,"s:E:b:t:"))!=-1){
  35. switch (ch)
  36. {
  37. case 's':
  38. s=atoi(optarg);
  39. break;
  40. case 'E':
  41. E=atoi(optarg);
  42. break;
  43. case 'b':
  44. b=atoi(optarg);
  45. break;
  46. case 't':
  47. freopen(optarg, "r", stdin);
  48. }
  49. }
  50. return;
  51. }
  52. void cmd_parse(char *cmd,long long addr){
  53. switch (cmd[0])
  54. {
  55. case 'I':
  56. break;
  57. case 'L':
  58. exec_cmd(addr);
  59. break;
  60. case 'S':
  61. exec_cmd(addr);
  62. break;
  63. case 'M':
  64. exec_cmd(addr);
  65. exec_cmd(addr);
  66. break;
  67. }
  68. return;
  69. }
  70. void addr_parse(long long addr,int *tag_bit,int *set_id){
  71. int tmp=0;
  72. for(int i=0;i<s;i++){
  73. tmp=(tmp<<1)+1;
  74. }
  75. *set_id=((int)(addr>>b)&tmp)%(1<<s);
  76. *tag_bit=(int)(addr>>(b+s));
  77. return;
  78. }
  79. void exec_cmd(long long addr){
  80. int tag_bit,set_id;
  81. cmd_cnt++;
  82. addr_parse(addr,&tag_bit,&set_id);
  83. if(DEBUG) printf("%d %d ",set_id,tag_bit);
  84. for(int i=0;i<E;i++){
  85. if((cache[set_id][i].valid_bit)
  86. &&(cache[set_id][i].tag_bit)==tag_bit
  87. ){
  88. cache[set_id][i].last_time=cmd_cnt;
  89. hit_cnt++;
  90. if(DEBUG) printf("hit\n");
  91. return;
  92. }
  93. }
  94. miss_cnt++;
  95. for(int i=0;i<E;i++){
  96. if(!cache[set_id][i].valid_bit){
  97. cache[set_id][i].valid_bit=1;
  98. cache[set_id][i].tag_bit=tag_bit;
  99. cache[set_id][i].last_time=cmd_cnt;
  100. if(DEBUG) printf("miss\n");
  101. return;
  102. }
  103. }
  104. eviction_cnt++;
  105. int victim_id=0;
  106. for(int i=0;i<E;i++){
  107. if(cache[set_id][i].last_time<cache[set_id][victim_id].last_time){
  108. victim_id=i;
  109. }
  110. }
  111. cache[set_id][victim_id].tag_bit=tag_bit;
  112. cache[set_id][victim_id].last_time=cmd_cnt;
  113. if(DEBUG) printf("miss eviction\n");
  114. return;
  115. }
  116. int main(int argc,char *argv[])
  117. {
  118. init();
  119. args_parse(argc,argv);
  120. char cmd[10];
  121. long long addr;
  122. int blocksize;
  123. while(~scanf("%s %llx,%d",cmd,&addr,&blocksize)){
  124. cmd_parse(cmd,addr);
  125. }
  126. printSummary(hit_cnt, miss_cnt, eviction_cnt);
  127. return 0;
  128. }

Part B:优化矩阵转置函数

这题用到了一种名为分块(blocking)的技术,指将要处理的大块数据分割为可以放入L1高速缓存的小块,把与这一小块的全部相关操作一次性处理完再切换下一小块,以此来提高L1高速缓存的利用率。块的尺寸可以通过枚举测试或者数学方法分析来决定。

除此之外 ,还可以对高速缓存中的冲突现象进行进一步分析,但如在perflab里所说,我实在懒得研究这种细枝末节的优化,所以只得了个一般般的分数就收手了。

  1. void transpose_submit(int M, int N, int A[N][M], int B[M][N])
  2. {
  3. int rr,cc,r,c;
  4. int bsize;
  5. if(M==32) bsize=8;
  6. else if(M==64) bsize=4;
  7. else if(M==61) bsize=16;
  8. for(rr=0;rr<N;rr+=bsize){
  9. for(cc=0;cc<M;cc+=bsize){
  10. for(r=rr;r<N&&r<rr+bsize;r++){
  11. for(c=cc;c<M&&c<cc+bsize;c++){
  12. B[c][r]=A[r][c];
  13. }
  14. }
  15. }
  16. }
  17. return;
  18. }

最终成绩如下:

  1. Part A: Testing cache simulator
  2. Running ./test-csim
  3. Your simulator Reference simulator
  4. Points (s,E,b) Hits Misses Evicts Hits Misses Evicts
  5. 3 (1,1,1) 9 8 6 9 8 6 traces/yi2.trace
  6. 3 (4,2,4) 4 5 2 4 5 2 traces/yi.trace
  7. 3 (2,1,4) 2 3 1 2 3 1 traces/dave.trace
  8. 3 (2,1,3) 167 71 67 167 71 67 traces/trans.trace
  9. 3 (2,2,3) 201 37 29 201 37 29 traces/trans.trace
  10. 3 (2,4,3) 212 26 10 212 26 10 traces/trans.trace
  11. 3 (5,1,5) 231 7 0 231 7 0 traces/trans.trace
  12. 6 (5,1,5) 265189 21775 21743 265189 21775 21743 traces/long.trace
  13. 27
  14. Part B: Testing transpose function
  15. Running ./test-trans -M 32 -N 32
  16. Running ./test-trans -M 64 -N 64
  17. Running ./test-trans -M 61 -N 67
  18. Cache Lab summary:
  19. Points Max pts Misses
  20. Csim correctness 27.0 27
  21. Trans perf 32x32 6.9 8 343
  22. Trans perf 64x64 1.2 8 1891
  23. Trans perf 61x67 10.0 10 1992
  24. Total points 45.1 53

【CSAPP】Cache Lab 实验笔记的更多相关文章

  1. 【CSAPP】Shell Lab 实验笔记

    shlab这节是要求写个支持任务(job)功能的简易shell,主要考察了linux信号机制的相关内容.难度上如果熟读了<CSAPP>的"异常控制流"一章,应该是可以不 ...

  2. 【CSAPP】Attack Lab实验笔记

    attacklab这节玩的是利用一个字符串进行缓冲区溢出漏洞攻击,就小时候想象中黑客干的事儿. 做题的时候好几次感叹这些人的脑洞,"这都可以攻击?还能这么注入?这还可能借力打力?" ...

  3. 【CSAPP】Performance Lab 实验笔记

    perflab这节的任务是利用书中知识,来对图像处理中的Rotate和Smooth操作函数进行优化.这次没对上电波,觉得学了一堆屠龙之技.于我个人理解,现在计算机配置比以前高多了,连SWAP分区都几近 ...

  4. 【CSAPP】Architecture Lab 实验笔记

    archlab属于第四章的内容.这章讲了处理器体系结构,就CPU是怎样构成的.看到时候跃跃欲试,以为最后实验是真要去造个CPU,配套资料也是一如既往的豪华,合计四十多页的参考手册,一大包的源码和测试程 ...

  5. 【CSAPP】Bomb Lab实验笔记

    bomblab这节搞的是二进制拆弹,可以通俗理解为利用反汇编知识找出程序的六个解锁密码. 早就听闻BOMBLAB的大名,再加上我一直觉得反汇编是个很艰难的工作,开工前我做好了打BOSS心理准备.实际上 ...

  6. 【CSAPP】Data Lab实验笔记

    前天讲到要刚CSAPP,这一刚就是两天半.CSAPP果然够爽,自带完整的说明文档,评判程序,辅助程序.样例直接百万组走起,管饱! datalab讲的是整数和浮点数怎么用二进制表示的,考验的是用基本只用 ...

  7. ChCore Lab3 用户进程和异常处理 实验笔记

    本文为上海交大 ipads 研究所陈海波老师等人所著的<现代操作系统:原理与实现>的课程实验(LAB)的学习笔记的第三篇:用户进程与异常处理.所有章节的笔记可在此处查看:chcore | ...

  8. CSAPP buffer lab记录——IA32版本

    CSAPP buffer lab为深入理解计算机系统(原书第二版)的配套的缓冲区溢出实验,该实验要求利用缓冲区溢出的原理解决5个难度递增的问题,分别为smoke(level 0).fizz(level ...

  9. CSAPP Bomb Lab记录

    记录关于CSAPP 二进制炸弹实验过程 (CSAPP配套教学网站Bomb Lab自学版本,实验地址:http://csapp.cs.cmu.edu/2e/labs.html) (个人体验:对x86汇编 ...

随机推荐

  1. TreeMap与TreeSet的源码分析

    1.TreeMap源码 1.属性部分: private final Comparator<? super K> comparator;//比较器 private transient Ent ...

  2. sp-MVC-ideabaok

    直接通过初始化器创建 或者通过创建maven工程在自己添加需要的东西 配置 dispatcher-servlet.xml 包括扫描加载包: <context:component-scan bas ...

  3. Maven的Scored介绍

    Maven的Scored值的介绍:http://maven.apache.org/guides/introduction/introduction-to-dependency-mechanism.ht ...

  4. Linux 环境下如何查找哪个线程使用 CPU 最长?

    1.获取项目的 pid,jps 或者 ps -ef | grep java,这个前面有讲过 2.top -H -p pid,顺序不能改变

  5. apollo规划控制视频-13 motion planning with autonomous driving

  6. display:inline-block两端对齐 实现列表

    做一个ul li 列表类似这样的平时经常会用到 要是用浮动做还是比较简单的直接左右浮动,清除浮动就可以搞定了,因为最近用display:inline-block用的比较顺手,所以就尝试一下.通过tex ...

  7. Vue2.0一个login跳转实例

    需要解决的问题:store存储登录状态Vue-Router导航钩子拦截路由Vue-Resource获取后台的数据需要判断登录返回的user源码参考原文地址 主要技术栈:Vuex + Vue-Resou ...

  8. Web缓存总结

    web缓存作用 减少网络带宽消耗降低服务器压力减少网络延迟,加快页面打开速度 Web缓存的类型 数据库数据缓存:为了提供查询的性能,会将查询后的数据放到内存中进行缓存,下次查询时,直接从内存缓存直接返 ...

  9. 使用 Blueprint 要注意 render_template 函数

    此文章主要是为了记录在使用 Flask 的过程中遇到的问题.本章主要讨论 render_template 函数的问题. 使用 Flask 的同学都应该知道,项目中的 url 和视图函数是在字典里一一对 ...

  10. pydev+eclipse写python代码

    首先,下载pydev:PyDev for Eclipse - Browse /pydev at SourceForge.net (建议下载到本地,之前看其他文章时,进行了如下安装: 启动 Eclips ...