(2)通过Configuration菜单中的“Floating point stages” 选项,把加法﹑乘法﹑除法部件的个数设置为2个,把延迟都设置为3个时钟周期;
(3)用WinDLX运行程序。记录程序执行过程中各种相关发生的次数、发生相关的指令组合,以及程序执行的总时钟周期数;
? 总时钟周期数:24;
资源相关数目:1; 数据相关数目:6; Trap暂停数目:4
? 资源相关的指令组合:
lf f1,ONE cvti2f f7,f1
? 数据相关的指令组合:
subf f1,f8,f7 subf f2,f1,f7 subf f13,f2,f7
addf f6,f4,f5 ;store a new value in r1
subf f10,f6,f9 ;use r1 & store new r4
(4)采用指令调度技术对程序进行指令调度,消除相关;
.data
.global ONE ONE: .word 1 .text
.global main
main:
lf f1,ONE
cvti2f f7,f1 ;结构相关 nop nop
subf f1,f8,f7 addf f6,f4,f5 ;--1.1 addi r12,r12,#1 ;--2.1 subf f2,f1,f7 subf f13,f2,f7 subf f10,f6,f9 ;--1.2 6
subi r11,r11,#8 ;--2.2 addf f6,f4,f5 ;--1.1
subf f10,f6,f9 ;--1.2 addi r12,r12,#1 ;--2.1 subi r11,r11,#8 ;--2.2 Finish: trap 0
(5)用WinDLX运行调度后的程序,观察程序在流水线中的执行情况,记录程序执行的总时钟周期数;
图2-1 程序在流水线中的执行情况
(6)根据记录结果,比较调度前和调度后的性能。论述指令调度对于提高CPU性能的意义。
如下图所示,经过调度后,由于上一条指令还没有完成计算结果而导致的数据相关有明显改善;性能提升了24/19=1.263倍
7
图2-2 调度前记录结果
图2-3 调度后记录结果
2. 循环展开、寄存器换名以及指令调度提高性能
(1)用DLX汇编语言编写代码文件*.s,程序中包含一个循环次数为4的整数倍的简单循环;
.text
.global main main:
addi r1,r0,#4 addi r2,r0,#0 Loop:
sle r3,r1,r0 bnez r3,Endit1 addi r2,r2,#1
subi r1,r1,#1 j Loop Endit1: trap 0
(2)用WinDLX运行该程序。记录执行过程中各种相关发生的次数以及程序执行的总时钟周期数;
总时钟周期数:38; Jump Stalls数目:5;
8
控制相关:5; Trap暂停:2
(3)将循环展开3次,将4个循环体组成的代码代替原来的循环体,并对程序做相应的修改。然后对新的循环体进行寄存器换名和指令调度;
.text
.global main main:
addi r1,r0,#4 addi r2,r0,#0 Loop:
sle r3,r1,r0 bnez r3,Endit1 addi r2,r2,#1
subi r1,r1,#1 addi r2,r2,#1 subi r1,r1,#1 addi r2,r2,#1 subi r1,r1,#1
addi r2,r2,#1 subi r1,r1,#1 j Loop Endit1: trap 0
(4)用WinDLX运行修改后的程序,记录执行过程中各种相关发生的次数以及程序执行的总时钟周期数;比较循环展开、指令调度前后的性能。
总时钟周期数:15; Trap暂停:3
在采用循环展开、指令调度技术前,总时钟周期数
为38,而今为15,提升了2.53倍; 且经过循环展开,消除了全部的Raw Stalls。
9
四、实验总结
根据实验结果,在采用循环展开、指令调度技术前,总时钟周期数为38,采用循环展开、指令调度技术后,总时钟周期数为15,提升了2.53倍;且经过循环展开,消除了全部的Raw Stalls。
可见循环展开和指令调度技术对于提升CPU性能有重要的作用。
实验三 cache性能分析
一、 实验目的
1. 加深对Cache的基本概念、基本组织结构以及基本工作原理的理解;
2. 了解Cache的容量、相联度、块大小对Cache性能的影响;
3. 掌握降低Cache失效率的各种方法,以及这些方法对Cache性能提高的好处;4. 理解Cache失效的产生原因以及Cache的三种失效;
5. 理解LRU与随机法的基本思想,及它们对Cache性能的影响;
二、实验内容及步骤:
(测试程序:
? Benchmark/ bin.little:anagram ? Benchmark/ bin.little:test_math
? Benchmark/ gcc2000.v3:art00.O2unroll.gcc.100M.ss ? Benchmark/ supplied:mcf00.O2unroll.gcc.100M.ss)
10