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

news2024/11/14 2:20:25

完整讲解视频:野生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));
	else
	    printf("%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:warmup
    cycles = fcyc2(test, elems, stride, 0);  /* Call test(elems,stride) */ //line:mem:fcyc
    return (size / stride) / (cycles / Mhz); /* Convert cycles to MB/s */  //line:mem:bwcompute
}
/* $end mountainfuns */


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/505870.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

从 Elasticsearch 到 Apache Doris,10 倍性价比的新一代日志存储分析平台|新版本揭秘

日志数据的处理与分析是最典型的大数据分析场景之一&#xff0c;过去业内以 Elasticsearch 和 Grafana Loki 为代表的两类架构难以同时兼顾高吞吐实时写入、低成本海量存储、实时文本检索的需求。Apache Doris 借鉴了信息检索的核心技术&#xff0c;在存储引擎上实现了面向 AP …

京东金融Android瘦身探索与实践

作者&#xff1a;京东科技 冯建华 一、背景 随着业务不断迭代更新&#xff0c;App的大小也在快速增加&#xff0c;2019年~2022年期间一度超过了117M&#xff0c;期间我们也做了部分优化如图1红色部分所示&#xff0c;但在做优化的同时面临着新的增量代码&#xff0c;包体积一直…

openEuler 社区 2023 年 4 月运作报告

概述 过去一个月&#xff0c;openEuler社区全员参与openEuler Developer Day 2023&#xff0c;通过SIG组开放工作会议完成了下个版本的规划。openEuler社区也参加了在新加坡举办的FOSSASIA SUMMIT。 在技术层面&#xff0c;社区不断推进创新&#xff0c;发布新项目&#xff0…

动态规划--01背包问题

01背包问题 背包问题题目最优解结构性质状态转移方程方程理解 递归实现核心思想代码实现用例测试 画表非递归实现核心思路代码实现画表展示 计算哪些物品放入算法思想代码实现 背包问题 题目 0-1背包问题:给定n种物品和一背包。物品的重量是w;,其价值为v; ,背包的容量为C。问…

科普文:国内ChatGPT怎么用,ChatGPT国内怎么用,关于ChatGPT你需要了解的内容应该都在这

在国内用了很长一段时间的ChatGPT&#xff0c;每次跟小白&#xff0c;哪怕是用ChatGPT的人交流的时候&#xff0c;都感觉解释不清&#xff0c;正好今天周末&#xff0c;给大家整理一篇关于ChatGPT的科普文&#xff0c;想要了解或使用ChatGPT的人&#xff0c;一定要看~~~&#x…

html实现经典赛车小游戏

文章目录 1.设计来源1.1 主界面 2.效果和源码2.1 动态效果2.2 源代码 源码下载 作者&#xff1a;xcLeigh 文章地址&#xff1a;https://blog.csdn.net/weixin_43151418/article/details/130580123 html实现经典赛车小游戏源码 html实现经典赛车小游戏源码&#xff0c;1.通过键盘…

如何让flex布局中的一个子元素单独右侧对齐

flex布局中的一个子元素单独右侧对齐 在 Flex布局中&#xff0c;我们经常需要对子元素进行对齐操作。使用 justify-content 和 align-items 可以轻松地对所有子元素进行对齐&#xff0c;但是当我们需要对某个子元素进行单独的对齐时&#xff0c;我们应该怎么做呢&#xff1f; …

【涨知识】PCB板为什么多是绿色的?

拿到一块PCB板时&#xff0c;最直观看到板子上油墨的颜色&#xff0c;就是我们一般指的PCB板颜色。PCB板的颜色多种多样&#xff0c;包括绿色、蓝色、红色和黑色等。 其中&#xff0c;绿色是最常用的&#xff0c;更为大家所熟悉。但为什么PCB板多是绿色呢? 当中缘由&#xff…

exe4j打包Jar成exe文件

1. 进入exe4j官网下载exe4j&#xff0c;安装到自己电脑上。 安装完后运行此软件 2. 在自己电脑上新建一个文件夹&#xff08;名字随便起&#xff09;&#xff0c;文件夹内放入要转换的jar文件&#xff0c;ico格式的图片&#xff0c;jar文件夹&#xff08;含jar文件&#xff09…

fbx sdk的使用介绍

我们平时需要围绕fbx写一些小工具&#xff0c;虽说使用ascii格式的fbx可以直接进行字符串解析&#xff0c;并且网上也有一些基于ascii解析的开源库&#xff0c;但在制作一些通用的工具时&#xff0c;使用fbx sdk进行编写肯定是最好的。 1.下载fbx sdk和cmake 要用cmake生成vi…

Revit:测量自适应点之间的距离和轴网距离标注

一、如何测量自适应点之间的距离 今天在体量中发现怎么用对齐标注测量两个自适应点的距离不正确&#xff0c;只用肉眼来看也是错的。 自适应点时空间中的点&#xff0c;直接测量两个点并不能保证测量的时两个点之间的最短距离&#xff0c;有可能时如图所示我们的空间中测量的并…

初始Redis以及Redis的安装

目录 1.初识Redis 1.1.认识NoSQL 1.1.1.结构化与非结构化 1.1.2.关联和非关联 1.1.3.查询方式 1.1.4.事务 1.1.5.总结 1.2.认识Redis 1.3.安装Redis 1.3.1.依赖库 1.3.2.上传安装包并解压 1.3.3.启动 1.3.4.默认启动 1.3.5.指定配置启动 1.3.6.开机自启 1.初识Re…

(八) 探究基于TCP连接的即时通信系统文件功能的实现

文章目录 一、引言二、实现用户文件功能2.1 打开文件并读取相关信息2.2 实现文件的发送和接收2.3 实现文件的展示和管理 三、代码展示3.1 客户端的关键代码 四、效果展示五、个人经验分享六、如何进一步优化文件功能七、总结 一、引言 即时通信系统的用户文件功能是一项非常重…

JVM Shutdown Hook 机制原理以及源码分析

写在前面 最近看众多框架源码的时候都看到使用到了Shutdown Hook机制。比如下图&#xff1a;SkyWalking、Spring、Tomcat等等框架&#xff0c;几乎只要是Java层面的框架都会使用到此机制。所以&#xff0c;借用论坛给读者写一篇关于JVM Shutdown Hook 机制原理分析以及源码分析…

PS如何安装ZXP扩展插件?

Photoshop如何安装ZXP扩展插件&#xff1f;有些小伙伴不会安装&#xff0c;本文介绍两种安装ZXP扩展的方法&#xff0c;希望对您有帮助。 方法一&#xff1a;手动安装方式 1、把下载好的.zxp扩展名改为.zip&#xff0c;然后解压。 Windows系统&#xff1a;C:\Users[ USER ]\A…

CSS--定位

01-定位 作用&#xff1a;灵活的改变盒子在网页中的位置 实现&#xff1a; 1.定位模式&#xff1a;position 2.边偏移&#xff1a;设置盒子的位置 leftrighttopbottom 相对定位 position: relative 特点&#xff1a; 不脱标&#xff0c;占用自己原来位置显示模式特点保…

系统安全分析与设计

目录 第五章、系统安全分析与设计1、信息系统安全属性2、对称加密技术与非对称加密技术3、信息摘要4、数字签名5、数字信封与PGP6、网络安全6.1、各个网络层次的安全保障6.2、网络威胁与攻击6.3、防火墙 第五章、系统安全分析与设计 1、信息系统安全属性 安全属性 保密性&…

最近想学PMP,有什么要注意和推荐的吗?

我觉得参加PMP的学习和考试有两点需要把握住&#xff0c;一是心态&#xff0c;二是学习方法&#xff1b; 谈心态的话虽然比较虚&#xff0c;因为这个还是要看个人在生活中对事物发展的应对能力与应对突发情况的处理能力&#xff0c;但是简单的谈谈在备考过程中心态的处理还是很…

Docker私有仓库

Docker私有仓库 私有仓库搭建 首先启动docker 拉取私有仓库镜像 [rootserver-a ~]# docker pull registry Using default tag: latest latest: Pulling from library/registry 79e9f2f55bf5: Pull complete 0d96da54f60b: Pull complete 5b27040df4a2: Pull complete e2ead82…

「PDF转长图」无压力:两种简单易学的转换方法!

在加班赶DDL的晚上&#xff0c;你突然接到老板的信息&#xff1a;立刻将这份PDF文件转换成长图并发给我&#xff01;于是你开始了疯狂截图的模式。你是否曾经遇到过这个问题&#xff0c;不知道是否有方便快捷的PDF转长图的解决方法呢&#xff1f; 作为一名资深的PDF专家&#x…