HNU-计算机系统-讨论课6
完整讲解视频:野生Gprof会梦见存储器山嘛?_哔哩哔哩_bilibili
别忘了一键三连哦
提供的代码:
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相关推荐
- 《生活学习方法讨论课》开课说明和进度
<生活学习方法讨论课>开课说明 既然我把学习的主体分为三部分:人+方法逻辑+学习对象.而对方法逻辑和学习对象的实践研究,最终都须沉淀.反作用到人本身上:且这三大主体,越是前面越是本体,那在 ...
- 计算机网络讨论课感悟,计算机网络课程学习心得体会
计算机网络课程学习心得体会 当我们积累了新的体会时,可以将其记录在心得体会中,这样能够给人努力向前的动力.那么好的心得体会是什么样的呢?下面是小编为大家收集的计算机网络课程学习心得体会,供大家参考借鉴 ...
- 计算机组成原理第二次小组讨论课,巢湖电大开放教育计算机科学与技术(doc 6页).doc...
文档介绍: 巢湖电大开放教育计算机科学与技术 <计算机网络(本)>课程教学系统设计 巢湖电大黄永生 第一部分教学目标设计 一.课程性质 <计算机网络(本)>是"计算机 ...
- 计算机组成原理第二次小组讨论课,计算机组成原理教学实施细则.doc
计算机组成原理教学实施细则 计算机组成原理 课程教学实施细则 第一部分 教学进度安排 一.课程教学过程进度安排及建议 本课程课内学时为72学时(4学分),其中必须完成的学时包括:电视课4讲,网络课程, ...
- HNU计算机系统lab3
实验内容: 首先,打开压缩包中,我们发现有有三个可执行文件,接下来,我们根据实验指导书知道了这三个函数的具体含义: bufbomb:你要攻击的缓冲炸弹计划.makecookie:根据用户ID生成&qu ...
- HNU-计算机系统-讨论课7
选题三 .我们自己来写,太"库"啦 ~ ( 1 ) 在 Linux 里用 C 语言进行代码设计,能对某一个班级.某一门 课程.某一名学生的分数进行分析,比如分数段.最高分.最低 分 ...
- HNU-操作系统-讨论课7
讨论题目: 死锁问题中的死锁预防,如资源有序分配法等. 我们将围绕这个问题,以哲学家问题为例子,按照以下的方面进行展开: (1)死锁是什么 (2)死锁如何预防
- HNU-计算机系统-讨论课5
WARNING: 本题为开放性题目,所设计的也仅仅是一个可能的模型而已,再考虑到个人水平有限.在呈现效果上难免会有缺漏以及可行性的缺陷.故请批判性地接收! 所以如果知识有错误或者缺漏,请一定要指出,您 ...
- 【讨论课2】学校里面针对一些高大树木进行处理,处理措施如下:(1)高度大于50米的树木,采用“巨型升降机”砍伐,将其截成11节;(2)高度在40米到50米之间的树木,采用“巨型升降机”砍伐,每5米将其
题目 学校里面针对一些高大树木进行处理,处理措施如下: (1)高度大于50米的树木,采用"巨型升降机"砍伐,将其截成11节: (2)高度在40米到50米之间的树木,采用" ...
最新文章
- Windows 7官方主题之“海上航行”
- linux /etc/fstab 挂载列表 简介
- python开发好学吗-Python人工智能开发难学吗
- shell 语法格式
- Java基础笔记12
- build settings参数详解
- tf/idf_Neo4j:带密码的TF / IDF(和变体)
- 【转】软件工程能力漫谈:比质量更重要的,是项目管理能力
- amos看拟合度在哪里看_360度看佛山战“疫”
- SpringMVC框架使用注解执行定时任务(转)
- paip.网站上传服务里需要做的操作流程
- java课程设计学生信息管理系统。
- WAMP Apache 配置 Perl
- 第五届A/B组 地宫取宝 JAVA
- Tax Multiplier and Govenment Spending Multiplier
- 天干、地支纪年 月 日
- 八佰(800)低代码精耕行业细分领域数字化转型
- 沙盘SandBoxie4.14 特别版+无限试用补丁
- ERJ | 马来西亚三城室内环境微生物/代谢产物与初中生哮喘的关联
- Pupil dynamics for iris liveness detection 瞳孔活体检测论文翻译
热门文章
- 个性字体设计遵循原则
- imx8mini openCV mipi摄像头报错: VIDIOC_QUERYCTRL: Inappropriate ioctl for device
- CASENet中cityscape edge GT是如何产生的
- opencv 利用摄像头来判断石头剪刀布的小游戏
- 微信小程序豆瓣项目Day1(components组件+index主页)
- python Turtle Graphics海龟绘图工具
- 【安全知识分享】安全生产标准化、6S和目视化.pptx(附下载)
- sudo dpkg --configure -a的作用
- 多人配音怎么制作的?给你推荐几个有声小说多人配音软件
- java 两个日期的天数_计算Java 8中两个日期之间的天数