计算机组成课自制模板副本Word文档下载推荐.docx
- 文档编号:21083738
- 上传时间:2023-01-27
- 格式:DOCX
- 页数:17
- 大小:1.92MB
计算机组成课自制模板副本Word文档下载推荐.docx
《计算机组成课自制模板副本Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《计算机组成课自制模板副本Word文档下载推荐.docx(17页珍藏版)》请在冰豆网上搜索。
5.2分析213
5.3分析314
一、实验目标
一.1目标1
学习使用Linux系统命令time查看程序执行时间;
一.2目标2
学习使用Linux系统工具perf查看程序执行中的性能事件;
一.3目标3
学习使用clock()函数和gettimeofday()函数记录程序执行的CPU时间和实际时间。
二、实验条件
二.1条件1
实验机器CPU配置:
Inter(R)Pentium(R)DualCPUT2390@1.86GHz1.87GHz
内存配置:
2.00GB
二.2条件2
操作系统名称和版本号:
Ubuntu14.04
内核版本号:
Linux3.13.0-19-generic
GCC版本号:
GCC4.8
三、实验内容
内容
3.1编写一个矩阵相乘的C程序,矩阵大小n根据实验机器性能自行设置,建议为5000。
相乘部分的参考代码如下所示:
用GCC编译后运行,检查程序运行是否正确;
3.2用Linux系统命令time获取所编写的矩阵相乘程序运行时间(包括用户时间,系统时间,实际时间),建议重复30次并计算平均值作为结果;
3.3用Linux系统工具perf获取所编写的矩阵相乘程序运行中的性能事件(包括CPU时钟周期数,指令数),建议重复30次并计算平均值作为结果;
3.4用clock()和gettimeofday()函数获取矩阵相乘程序运行时间(包括CPU时间和总时间),建议重复30次并计算平均值作为结果。
四、实验记录
4.1.矩阵相乘程序源代码(juzhen.c)
#include<
stdio.h>
stdlib.h>
time.h>
sys/time.h>
#defineN1000
intmain(intargc(),char*argv[])
{
intdiff;
structtimevalkaishi;
structtimevaljieshu;
gettimeofday(&
kaishi,NULL);
clock_tstart,end;
doublealltime;
start=clock();
staticinta[N][N],b[N][N],c[N][N];
intk,i,j,r;
srand((unsigned)time(NULL));
for(j=0;
j<
N;
j++)
for(i=0;
i<
i++)
c[i][j]=0;
}}
printf("
juzhen1:
\n"
);
for(k=0;
k<
k++)
a[k][j]=rand()%10+1;
%d\t"
a[k][j]);
b[i][k]=rand()%10+1;
b[i][k]);
{r=a[i][k];
c[i][j]+=r*b[k][j];
}
juzhenzhiji"
{printf("
c[j][i]);
end=clock();
jieshu,NULL);
alltime=(double)(end-start)/CLOCKS_PER_SEC;
usingclock():
timeis:
%F\n"
alltime);
diff=1000000*(jieshu.tv_sec-kaishi.tv_sec)+jieshu.tv_usec
-kaishi.tv_usec;
usinggettimeofday():
thedifferenceis%ld"
diff);
return0;
4.2.GCC编译命令文本
gcc–Walljuzhen–otest
4.3.time指令:
time./test
部分截图:
矩阵大小:
100*100
(说明:
由于1000*1000的矩阵操作在本机器上操作会引起堆栈溢出,为了实验的正常运行,我把矩阵大小设置为100*100)
time命令重复次数:
20次。
每次测试输出结果如下表:
次数
real(s)
uer(s)
sys(s)
1
0.083
0.010
0.011
11
0.098
0.019
0.029
2
0.092
0.012
0.032
12
0.023
3
0.085
0.013
13
0.095
0.028
4
0.114
0.015
0.016
14
0.101
0.017
5
0.091
0.030
15
0.102
6
0.089
0.034
16
0.014
0.021
7
0.099
0.024
17
0.093
8
0.090
18
0.087
9
19
0.031
10
20
0.108
平均real
(s)
平均user(s)
平均sys
表4.1time命令输出结果
四.1perf指令文本
安装指令:
apt-getinstalllinux-source
对test进行性能分析:
perfstat./test
例如:
在终端输入
root@ubuntu-test:
~#
perfstat
./
结果为:
1.
Performancecounterstats
for
'
./t1'
:
2.
218.584169task-clock#0.997CPUsutilized
3.
18context-switches#0.000M/sec
4.
0CPU-migrations#0.000M/sec
5.
82page-faults#0.000M/sec
6.
771,180,100cycles#3.528GHz
7.
<
not
counted>
stalled-cycles-frontend
8.
stalled-cycles-backend
9.
550,703,114instructions#0.71insnspercycle
10.
110,117,522branches#503.776M/sec
11.
5,009branch-misses#0.00%
of
allbranches
12.
0.219155248secondstimeelapsed
查看当前系统最耗时的内核函数或某个用户进程指令:
perftop
1000*1000
Perf命令重复次数:
30
输出结果截图:
实验结果
指令数
周期数
51936597215
42934597215
52184491716
43364159683
51840163525
433869187789
51254492900
43378437832
51567678224
434532863113
52465822858
42456753420
51343563747
424859384878
52233542910
43214873721
51586958349
425868890402
52309184775
43284583123
51546788544
421898510939
21
52143325425
43246621093
51003445634
423894859431
22
52483909647
42342335422
51455799356
430287810439
23
52483859549
43283985539
51436709945
439023983822
24
52458932854
43348759210
51459884036
424894884584
25
52349328855
43784939217
51348859588
432985485455
26
52438398445
43019842871
51456539842
424838258585
27
52484598545
43187892988
51548954005
434942454434
28
51198498104
43128959714
51467884326
425412453929
29
51021839845
43187580321
51334789328
432845934412
52489485952
43128394725
表4.2指令数(instructions)和周期数(cycles)
四.2clock()和gettimeofday()测量CPU时间和总时间
clock()源代码:
intmain(intargc,char*argv[]);
doublealltime;
Clock_tstart,end;
(程序)
End=clock();
printf(“usingclock():
timeis:
%f\n”,alltime);
gettimeofday()源代码:
#include<
diff=1000000*(jieshu.tv_sec-kaishi.tv_sec)+jieshu.tv_useckaishi.tv_usec;
-
printf(“usinggettimeofday():
thedifferenceis%ld”,diff);
重复次数:
30
次
数
CPU时间(s)
总时间(s)
41.196368
63.361790
41.278289
63.281018
42.167642
63.278378
41.372229
63.957981
42.491841
62.278167
41.277636
64.478321
41.351207
63.619723
41.167356
62.378219
41.278214
63.317684
40.563522
62.962499
42.478923
63.275845
41.993781
63.878947
42.374873
63.287638
42.278147
63.238187
42.475823
63.217848
42.187841
63.237621
42.178429
63.270872
42.728187
63.827816
41.273430
63.847864
41.398173
63.178941
43.278471
62.178981
41.237824
62.782781
42.178745
63.842198
43.217642
63.878915
41.273849
63.178814
42.287381
64.179715
43.264789
62.176548
41.237837
62.167467
42.170972
62.298174
43.183283
62.217845
五、实验分析
五.1分析1
本次实验中,第一件事是写代码。
我设置了三个矩阵(第一、二组数据需要设置,第个矩阵为前两个矩阵之积),为了方便修改数组大小,我采取了宏定义的方式;
为了快速产生前两个数组的数据,我采取了随机数法。
五.2分析2
使用time系统命令时,我没有用静态数组,所以当我将矩阵大小设置成1000时导致了堆栈溢出,于是我用100*100的矩阵完成了实验。
之后,我将矩阵大小设置为1000,完成之后的实验。
每次时间都是63秒钟左右,大约是其他同学的十分之一。
我想有两方面的原因。
1,电脑硬件配置较低。
2.程序时间复杂度大,程序没有优化好。
5.3分析3
1.Linux系统命令time给出的用户时间,系统时间,实际时间分别是什么含义;
用户时间(Usertime) 表示CPU执行用户进程的时间,包括nices时间。
通常期望用户空间CPU越高越好。
系统时间(Systemtime)表示CPU在内核运行时间,包括IRQ和softirq时间。
系统CPU占用率高,表明系统某部分存在瓶颈。
通常值越低越好。
等待时间(Waitingtime) CPI在等待I/O操作完成所花费的时间。
系统部应该花费大量时间来等待I/O操作,否则就说明I/O存在瓶颈。
2.Linux系统工具perf获取的性能事件CPU时钟周期数,指令数是什么含义;
指令数(instructions):
任务执行期间产生的处理器指令数。
CPU时钟周期数(cycles):
任务消耗的处理器周期数
3.clock()和gettimeofday()函数获取的CPU时间和总时间是什么含义;
4.clock()用来返回进程所占用CPU的大约时间,而gettimeofday()会把目前的时间(从为从1970年1月1日至今的秒数)用tv所指的结构返回,当地时区的信息则放到tz所指的结构中.成功则返回0,失败返回-1,错误代码存于errno.为了测出程序运行所用总时间,需要把实验运行开始和结束的差表示出来。
5.实验中各种方法获得的计时相关数值分别是什么精度,相互之间有什么关系?
指令数和CPU周期数都是整数。
CPU时间和总时间都是六位小数。
函数time()计算real,user,以及sys都是三位小数。
但是用gettimeofday()计算出的是1970年开始的时间,显然不够准确。
Clock()为ms级别,对于短时间内的定时或者延时可以达到ms级别,对于时间较长的定时或者延迟精度还是不够。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 计算机组成课自制模板 副本 计算机 组成 自制 模板