完整讲解视频:野生Gprof会梦见存储器山嘛?_哔哩哔哩_bilibili

别忘了一键三连哦

题 3: 在“存储器层次结构”一章的 6.6 节从存储器山的角度具象化
了存储器性能描述。
( 1 ) 请阅读教材 6.6.1 内容(全组都要课前进行这一内容,组长请
督促);
(2) 根据所提供的代码,课前进行绘制,形成自己(虚拟)机器的
存储器山图( 需 2 名认领人(不同方法或二人明确分工):
(3) 在课上组内讨论时,与(
2 版教材)图 6-43 进行参照比较分析,
形成结论;
(4) 课前进行 5.14 节阅读学习 (认领人: ) ,课上请讲给全组
听;
(5) 下载 GPROF ,并尝试使用 (认领人: ) ,课上请进行组
内分享使用方法;
(6) 下载 OProfile (或者类似的工具,但不能是 GPROF ),并尝
试使用 (认领人: ) ,课上请进行组内分享使用方法;
(7) 课上请使用以上两种工具,对本题所附示例代码进行剖析和结
果讨论。
( Tips :本题需要大家汇聚自己多方面的能力。由于理论课时限制,
这两节内容放在讨论课由选择本题的小组开坛宣讲,并给出相应结
论,综合考查了学习能力、讲解能力、分析与应用能力 . )
对于本次的讨论,我们组按照以下的步骤展开:
阅读书本,了解存储器山的概念
绘制形成自己虚拟机的存储器山图
分析存储器山图 使用GPROF进行性能分析并指导优化
volatile标签的扩展讲解
使用Callgrind进行性能分析并指导优化
浅谈oprofile的使用
下面是PPT部分:

提供的代码:

mm.c

/* matrix multiply permutations */
#include <stdio.h>
#include <stdlib.h>
#include "mm.h"
#include "fcycmm.h"
#include "clock.h"/* whether or not fcyc should clear the cache */
#define CLEARCACHE 1  /* global arrays */
array ga, gb, gc;/* check the result array for correctness */
void checkresult(array c, int n)
{int i, j;for (i = 0; i < n; i++)for (j = 0; j < n; j++)if (c[i][j] != (double)n) {printf("Error: bad number (%f) in result matrix (%d,%d)\n", c[i][j], i, j);fflush(stdout);exit(0);}
}/* Run f and return clocks per inner loop iteration */
double run(test_funct f, int n)
{double cpi;cpi = fcyc(f, n, CLEARCACHE) / (n*n*n);checkresult(gc, n);return(cpi);
}/* reset result array to zero */
void reset(array c, int n)
{int i,j;for (i = 0; i < n; i++) {for (j = 0; j < n; j++) {c[i][j] = 0.0;}}
}/* initialize input arrays to 1 */
void init(array a, array b, int n)
{int i,j;for (i = 0; i < n; i++) {for (j = 0; j < n; j++) {a[i][j] = 1.0;b[i][j] = 1.0;}}
}/* print an array (debug) */
void printarray(array a, int n)
{int i, j;for (i = 0; i < n; i++) {for (j = 0; j < n; j++) {printf("%5.1f ", a[i][j]);}printf("\n");}
}/************************************************ Six different versions of matrix multiply ***********************************************/
void ijk(array A, array B, array C, int n)
{int i, j, k;double sum;/* $begin mm-ijk */
for (i = 0; i < n; i++) for (j = 0; j < n; j++) {sum = 0.0;for (k = 0; k < n; k++)sum += A[i][k]*B[k][j];C[i][j] += sum;}
/* $end mm-ijk */}void jik(array A, array B, array C, int n)
{int i, j, k;double sum;/* $begin mm-jik */
for (j = 0; j < n; j++) for (i = 0; i < n; i++) {sum = 0.0;for (k = 0; k < n; k++)sum += A[i][k]*B[k][j];C[i][j] += sum;}
/* $end mm-jik */
}void ikj(array A, array B, array C, int n)
{int i, j, k;double r;/* $begin mm-ikj */
for (i = 0; i < n; i++)for (k = 0; k < n; k++) {r = A[i][k];for (j = 0; j < n; j++)C[i][j] += r*B[k][j];}
/* $end mm-ikj */
}void kij(array A, array B, array C, int n)
{int i, j, k;double r;/* $begin mm-kij */
for (k = 0; k < n; k++)for (i = 0; i < n; i++) {r = A[i][k];for (j = 0; j < n; j++)C[i][j] += r*B[k][j];}
/* $end mm-kij */
}void kji(array A, array B, array C, int n)
{int i, j, k;double r;/* $begin mm-kji */
for (k = 0; k < n; k++)for (j = 0; j < n; j++) {r = B[k][j];for (i = 0; i < n; i++)C[i][j] += A[i][k]*r;}
/* $end mm-kji */
}void jki(array A, array B, array C, int n)
{int i, j, k;double r;/* $begin mm-jki */
for (j = 0; j < n; j++)for (k = 0; k < n; k++) {r = B[k][j];for (i = 0; i < n; i++)C[i][j] += A[i][k]*r;}
/* $end mm-jki */
}/* * Run the six versions of matrix multiply and display performance* as clock cycles per inner loop iteration.*/ int main()
{int n;init(ga, gb, MAXN);printf("matmult cycles/loop iteration\n");printf("%3s%6s%6s%6s%6s%6s%6s\n", "n", "jki", "kji", "ijk", "jik", "kij", "ikj");fflush(stdout);for (n = MINN; n <= MAXN; n += INCN) {  printf("%3d ", n);printf("%5.2f ", run(jki, n));printf("%5.2f ", run(kji, n));printf("%5.2f ", run(ijk, n));printf("%5.2f ", run(jik, n));printf("%5.2f ", run(kij, n));printf("%5.2f ", run(ikj, n));printf("\n");fflush(stdout);}exit(0);
}

mountain.c

/* mountain.c - Generate the memory mountain. */
/* $begin mountainmain */
#include <stdlib.h>
#include <stdio.h>
#include "fcyc2.h" /* measurement routines */
#include "clock.h" /* routines to access the cycle counter */#define MINBYTES (1 << 14)  /* First working set size */
#define MAXBYTES (1 << 27)  /* Last working set size */
#define MAXSTRIDE 15        /* Stride x8 bytes */
#define MAXELEMS MAXBYTES/sizeof(long) /* $begin mountainfuns */
long data[MAXELEMS];      /* The global array we'll be traversing *//* $end mountainfuns */
/* $end mountainmain */
void init_data(long *data, int n);
int test(int elems, int stride);
double run(int size, int stride, double Mhz);/* $begin mountainmain */
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) {
/* $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++) {printf("%.0f\t", run(size, stride, Mhz));}printf("\n");}exit(0);
}
/* $end mountainmain *//* init_data - initializes the array */
void init_data(long *data, int n)
{int i;for (i = 0; i < n; i++)data[i] = i;
}/* $begin mountainfuns */
/* test - Iterate over first "elems" elements of array "data" with*        stride of "stride", using 4x4 loop unrolling.*/
int test(int elems, int stride)
{long i, sx2 = stride*2, sx3 = stride*3, sx4 = stride*4;long acc0 = 0, acc1 = 0, acc2 = 0, acc3 = 0;long length = elems;long limit = length - sx4;/* Combine 4 elements at a time */for (i = 0; i < limit; i += sx4) {acc0 = acc0 + data[i];     acc1 = acc1 + data[i+stride];acc2 = acc2 + data[i+sx2]; acc3 = acc3 + data[i+sx3];}/* Finish any remaining elements */for (; i < length; i += stride) {acc0 = acc0 + data[i];}return ((acc0 + acc1) + (acc2 + acc3));
}/* run - Run test(elems, stride) and return read throughput (MB/s).*       "size" is in bytes, "stride" is in array elements, and Mhz is*       CPU clock frequency in Mhz.*/
double run(int size, int stride, double Mhz)
{   double cycles;int elems = size / sizeof(double);       test(elems, stride);                     /* Warm up the cache */       //line:mem:warmupcycles = fcyc2(test, elems, stride, 0);  /* Call test(elems,stride) */ //line:mem:fcycreturn (size / stride) / (cycles / Mhz); /* Convert cycles to MB/s */  //line:mem:bwcompute
}
/* $end mountainfuns */

HNU-计算机系统-讨论课6相关推荐

  1. 《生活学习方法讨论课》开课说明和进度

    <生活学习方法讨论课>开课说明 既然我把学习的主体分为三部分:人+方法逻辑+学习对象.而对方法逻辑和学习对象的实践研究,最终都须沉淀.反作用到人本身上:且这三大主体,越是前面越是本体,那在 ...

  2. 计算机网络讨论课感悟,计算机网络课程学习心得体会

    计算机网络课程学习心得体会 当我们积累了新的体会时,可以将其记录在心得体会中,这样能够给人努力向前的动力.那么好的心得体会是什么样的呢?下面是小编为大家收集的计算机网络课程学习心得体会,供大家参考借鉴 ...

  3. 计算机组成原理第二次小组讨论课,巢湖电大开放教育计算机科学与技术(doc 6页).doc...

    文档介绍: 巢湖电大开放教育计算机科学与技术 <计算机网络(本)>课程教学系统设计 巢湖电大黄永生 第一部分教学目标设计 一.课程性质 <计算机网络(本)>是"计算机 ...

  4. 计算机组成原理第二次小组讨论课,计算机组成原理教学实施细则.doc

    计算机组成原理教学实施细则 计算机组成原理 课程教学实施细则 第一部分 教学进度安排 一.课程教学过程进度安排及建议 本课程课内学时为72学时(4学分),其中必须完成的学时包括:电视课4讲,网络课程, ...

  5. HNU计算机系统lab3

    实验内容: 首先,打开压缩包中,我们发现有有三个可执行文件,接下来,我们根据实验指导书知道了这三个函数的具体含义: bufbomb:你要攻击的缓冲炸弹计划.makecookie:根据用户ID生成&qu ...

  6. HNU-计算机系统-讨论课7

    选题三 .我们自己来写,太"库"啦 ~ ( 1 ) 在 Linux 里用 C 语言进行代码设计,能对某一个班级.某一门 课程.某一名学生的分数进行分析,比如分数段.最高分.最低 分 ...

  7. HNU-操作系统-讨论课7

    讨论题目: 死锁问题中的死锁预防,如资源有序分配法等. 我们将围绕这个问题,以哲学家问题为例子,按照以下的方面进行展开: (1)死锁是什么 (2)死锁如何预防

  8. HNU-计算机系统-讨论课5

    WARNING: 本题为开放性题目,所设计的也仅仅是一个可能的模型而已,再考虑到个人水平有限.在呈现效果上难免会有缺漏以及可行性的缺陷.故请批判性地接收! 所以如果知识有错误或者缺漏,请一定要指出,您 ...

  9. 【讨论课2】学校里面针对一些高大树木进行处理,处理措施如下:(1)高度大于50米的树木,采用“巨型升降机”砍伐,将其截成11节;(2)高度在40米到50米之间的树木,采用“巨型升降机”砍伐,每5米将其

    题目 学校里面针对一些高大树木进行处理,处理措施如下: (1)高度大于50米的树木,采用"巨型升降机"砍伐,将其截成11节: (2)高度在40米到50米之间的树木,采用" ...

最新文章

  1. Windows 7官方主题之“海上航行”
  2. linux /etc/fstab 挂载列表 简介
  3. python开发好学吗-Python人工智能开发难学吗
  4. shell 语法格式
  5. Java基础笔记12
  6. build settings参数详解
  7. tf/idf_Neo4j:带密码的TF / IDF(和变体)
  8. 【转】软件工程能力漫谈:比质量更重要的,是项目管理能力
  9. amos看拟合度在哪里看_360度看佛山战“疫”
  10. SpringMVC框架使用注解执行定时任务(转)
  11. paip.网站上传服务里需要做的操作流程
  12. java课程设计学生信息管理系统。
  13. WAMP Apache 配置 Perl
  14. 第五届A/B组 地宫取宝 JAVA
  15. Tax Multiplier and Govenment Spending Multiplier
  16. 天干、地支纪年 月 日
  17. 八佰(800)低代码精耕行业细分领域数字化转型
  18. 沙盘SandBoxie4.14 特别版+无限试用补丁
  19. ERJ | 马来西亚三城室内环境微生物/代谢产物与初中生哮喘的关联
  20. Pupil dynamics for iris liveness detection 瞳孔活体检测论文翻译

热门文章

  1. 个性字体设计遵循原则
  2. imx8mini openCV mipi摄像头报错: VIDIOC_QUERYCTRL: Inappropriate ioctl for device
  3. CASENet中cityscape edge GT是如何产生的
  4. opencv 利用摄像头来判断石头剪刀布的小游戏
  5. 微信小程序豆瓣项目Day1(components组件+index主页)
  6. python Turtle Graphics海龟绘图工具
  7. 【安全知识分享】安全生产标准化、6S和目视化.pptx(附下载)
  8. sudo dpkg --configure -a的作用
  9. 多人配音怎么制作的?给你推荐几个有声小说多人配音软件
  10. java 两个日期的天数_计算Java 8中两个日期之间的天数