当前位置: 首页 > article >正文

深圳大学-计算机系统(3)-实验四处理器结构实验一

实验目标

  1. 了解MIPS的五级流水线,和在运行过程中的所产生的各种不同的流水线冒险
  2. 通过指令顺序调整,或旁路与预测技术来提高流水线效率
  3. 更加了解流水线细节和其指令的改善方法
  4. 更加熟悉MIPS指令的使用

实验内容

  1. 观察一段代码并运行,观察其中的流水线冒险,并记录统计统计信息。
  2. 对所给的代码进行指令序列的调整,以期避免数据相关,并记录统计信息。
  3. 启动forward功能,以获得性能提升,并且记录统计信息。
    (选做:用perf记录x86中的数据相关于指令序列调整后的时间统计、
    调整指令,以避免连续乘法间的阻塞。)

实验环境

硬件:桌面PC
软件:Windows,WinMIPS64仿真器

实验步骤及说明

首先,我们给出一段C代码,该段代码实现的是两个矩阵相加。
设有4*4矩阵A和4*4矩阵B相加,得到4*4矩阵C:

for(inti = 0; i< 4; i++)
	for(int j = 0; j < 4; j++)
		C[i][j] = A[i][j] + B[i][j];

根据上述的C代码,我们将其转换成MIPS语言,然后运行,并进行分析。
MIPS代码如下:

      .data
a:    .word      1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4
b:    .word      4,4,4,4,3,3,3,3,2,2,2,2,1,1,1,1
c:    .word      0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
len:  .word      4
control: .word32 0x10000
data:    .word32 0x10008

      .text
start:daddi r17,r0,0
	  daddi r21,r0,a
	  daddi r22,r0,b
      daddi r23,r0,c
      ld r16,len(r0)
loop1: slt r8,r17,r16
       beq r8,r0,exit1
       daddi r19,r0,0
loop2: slt r8,r19,r16
       beq r8,r0,exit2

       dsll r8,r17,2
	   dadd r8,r8,r19
	   dsll r8,r8,3

	   dadd r9,r8,r21
	   dadd r10,r8,r22
	   dadd r11,r8,r23

	   ld r9,0(r9)
	   ld r10,0(r10)
	   dadd r12,r9,r10
	   sd r12,0(r11)

	   daddi r19,r19,1
	   j loop2
exit2:daddi r17,r17,1
	  j loop1
exit1: halt

实验前请保证winMIPS64配置中“Enable Forwarding”没有选中。将这段代码加载到WinMIPS64中,运行后观察结果(提供Statistic窗口截图)。从Statistic窗口记录:本程序运行过程中总共产生了多少次RAW的数据相关。接下来,我们对产生数据相关的代码逐个分析,请列出产生数据相关的代码,并在下一步中进行分析和优化。

一、 调整指令序列

在这一部分,我们利用指令调整的方法对数据相关代码进行优化,规避数据相关。
通过调整序列来规避这个数据相关,在statics窗口中记录其效果。将此结果与初始的结果进行对比,报告RAW相关的次数减少的数量。

将上述代码存到code.s中,用asm.exe检查其正确性,如图所示:
在这里插入图片描述
实验前保证winMIPS64配置中“Enable Forwarding”没有选中:
在这里插入图片描述
执行程序,矩阵C的值均为5,结果正确:
在这里插入图片描述
在这里插入图片描述
由统计结果可知有220次RAW(读后写数据冒险)。
在winmips64中,按F7单步执行程序,发现有如下数据相关的指令造成堵塞。
在这里插入图片描述
此处,我们可以通过将“ld r16,len(r0)”这条语句换到上面,即start处,如下:
在这里插入图片描述
修改后运行程序,可以发现RAW次数减少至218次:
在这里插入图片描述
继续单步执行程序,又发现此处相关代码产生了2个RAW,
在这里插入图片描述
beq指令读取r8时发生数据冒险,将其滞后即可:
在这里插入图片描述
再次执行代码,可以发现RAW次数已减少到了205次:
在这里插入图片描述
继续单步执行,发现新的RAW
在这里插入图片描述
这里可以将下面一条无关r8寄存器的计算代码提前,从而解决RAW冒险
在这里插入图片描述
在这里插入图片描述
执行程序,发现RAW次数已降至185次,与优化前相比减少了35次
在这里插入图片描述
整个改完的代码如下:

      .data
a:    .word      1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4
b:    .word      4,4,4,4,3,3,3,3,2,2,2,2,1,1,1,1
c:    .word      0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
len:  .word      4
control: .word32 0x10000
data:    .word32 0x10008

      .text
start: ld r16,len(r0)
	   daddi r17,r0,0
       daddi r21,r0,a
       daddi r22,r0,b
       daddi r23,r0,c

loop1: slt r8,r17,r16
       daddi r19,r0,0
	   beq r8,r0,exit1
loop2: slt r8,r19,r16
       daddi r19,r19,1
       beq r8,r0,exit2
       
       dsll r8,r17,2
       dadd r8,r8,r19
       dsll r8,r8,3
       
       dadd r9,r8,r21
       dadd r10,r8,r22

       ld r9,0(r9)
       ld r10,0(r10)
	   dadd r11,r8,r23
       dadd r12,r9,r10
       sd r12,0(r11)
       j loop2
exit2: daddi r17,r17,1
       j loop1
exit1: halt

二、 Forwarding功能开启

接下来,我们要展示Forwarding功能的优化效果。
首先,我们要知道如何开启Forwarding功能。法如下:点开configure下拉窗口,给Enable Forwarding选项左侧点上勾。
在这里插入图片描述
开启了Forwarding功能之后,我们再运行,查看结果,解释哪些数据相关的问题得到解决,并以截图说明问题解决前后的差异所在。
开启了Forwarding功能:
在这里插入图片描述
运行程序,结果如下:
在这里插入图片描述
发现RAW次数已经减少到16次,但仍存在RAW现象,继续单步执行程序,发现在此处存在RAW现象。
在这里插入图片描述
我们只需在dadd r12,r9,r10指令之前插入一条无关计算的指令,在这里我们选择把上面这一条指令滞后,修改方案如下:
在这里插入图片描述
修改后,再次运行程序,观察到RAW下降至0次,大功告成!
在这里插入图片描述

三、 结构相关优化

流水线中的结构相关,指的是流水线中多条指令在同一时钟周期内争用同一功能部件现象。即因硬件资源满足不了指令重叠执行的要求而发生的冲突。
在WinMIPS64中,我们可以在除法中观察到这种现象。要消除这种结构相关,我们可以采取调整指令位置的方法进行优化。在这个部分,我们首先给出几条C代码,然后将该代码翻译成MIPS代码(为了观察的方便,我们这里MIPS代码并不是逐一翻译,而是调整代码,使得其他部分数据相关已经优化,而两条除法指令连续出现),运行并查看结果。接着,调整代码序列,重新运行。观察优化效果。
下面是给出的C代码:

a = a / b
c = c / d
e = e + 1
f = f + 1
g = g + 1
h = h + 1
i = i + 1
j = j + 1

根据上述的C代码,我们给出数据相关优化的指令如下:

 .data
a:    .word     12
b:    .word     3
c:    .word     15
d:    .word     5
e:    .word     1
f:    .word     2
g:    .word     3
h:    .word     4
i:    .word     5
j:    .word     6
      .text
start:
	ld r16,a(r0)
	ld r17,b(r0)
	ld r18,c(r0)
	ld r19,d(r0)
	ld r20,e(r0)
	ld r21,f(r0)
	ld r22,g(r0)
	ld r23,h(r0)
	ld r24,i(r0)
	ld r25,j(r0)
	ddiv r16,r16,r17
	ddiv r18,r18,r19      
	daddi r20,r20,1
	daddi r21,r21,1
	daddi r22,r22,1
	daddi r23,r23,1
	daddi r24,r24,1
	daddi r25,r25,1
	sd r16,a(r0)
	sd r17,b(r0)
	sd r18,c(r0)
	sd r19,d(r0)
	sd r20,e(r0)
	sd r21,f(r0)
	sd r22,g(r0)
	sd r23,h(r0)
	sd r24,i(r0)
	sd r25,j(r0)
halt

上面的指令运行,在Cycle窗口结果如下(程序运行前请将configure->architecture->division latency改为10):
在这里插入图片描述
在Statistics窗口的结果如下:
在这里插入图片描述
通过观察,我们可以发现,两个连续的除法产生了明显的结构相关,第二个除法为了等待上一个除法指令在执行阶段所占用的资源,阻塞了9个周期。
显然,这样的连续的除法所导致的结构相关极大的降低了流水线效率,为了消除结构相关,我们需要做的是调整指令序列,将其他无关的指令塞入两条连续的除法指令中。代码调整如下:

     .data
a:    .word     12
b:    .word     3
c:    .word     15
d:    .word     5
e:    .word     1
f:    .word     2
g:    .word     3
h:    .word     4
i:    .word     5
j:    .word     6
      .text
start:
	ld r16,a(r0)
	ld r17,b(r0)
	ld r18,c(r0)
	ddiv r16,r16,r17
	ld r19,d(r0)
	ld r20,e(r0)
	ld r21,f(r0)
	ld r22,g(r0)
	ld r23,h(r0)
	ld r24,i(r0)
	ld r25,j(r0)
	ddiv r18,r18,r19      
	daddi r20,r20,1
	daddi r21,r21,1
	daddi r22,r22,1
	daddi r23,r23,1
	daddi r24,r24,1
	daddi r25,r25,1
	sd r16,a(r0)
	sd r17,b(r0)
	sd r18,c(r0)
	sd r19,d(r0)
	sd r20,e(r0)
	sd r21,f(r0)
	sd r22,g(r0)
	sd r23,h(r0)
	sd r24,i(r0)
	sd r25,j(r0)
halt

运行调整后的代码,在Cycle窗口结果如下:
在这里插入图片描述
在Statistics窗口的结果如下:
在这里插入图片描述
通过对比,我们可以发现,优化后的代码在运行时减少了7个周期,优化效果显著。

实验结果

1. 调整指令序列

在这里插入图片描述

2.Forwarding功能开启

在这里插入图片描述

3. 结构相关优化

在这里插入图片描述

实验总结与体会

  1. 优化数据相关可以减少由于数据依赖导致的停顿,提高指令的执行效率。
  2. 开启Forwarding功能可以减少数据依赖造成的性能损失,加速指令的执行。
  3. 消除结构相关可以避免硬件资源的争用,提高流水线的并发性和性能表现。
  4. 总的来说,本次实验通过对数据相关和结构相关的优化,我掌握了流水线优化的原理,学会了流水线优化的方法,加深了我对计算机体系结构工作原理的理解。

http://www.kler.cn/a/515994.html

相关文章:

  • 【面试总结】FFN(前馈神经网络)在Transformer模型中先升维再降维的原因
  • AI模型提示词(prompt)优化-实战(一)
  • 寒假刷题记录
  • 实施工程师:面试基础宝典
  • [Qt]系统相关-多线程、线程安全问题以及线程的同步机制
  • 如何实现亿级用户在线状态统计?
  • 设计模式的艺术-迭代器模式
  • Unity|小游戏复刻|见缝插针1(C#)
  • mybatis(57/134)
  • Python 轻松扫描,快速检测:高效IP网段扫描工具全解析
  • Web 音视频(二)在浏览器中解析视频
  • Lisp语言的区块链
  • H266/VVC 量化编码中 TCQ(或 DQ)技术
  • oppo25届秋招补录内推来啦
  • 算法中的时间复杂度和空间复杂度
  • Jetson Xavier NX (ARM) 使用 PyTorch 安装 Open3D-ML 指南
  • GESP202309 三级【进制判断】题解(AC)
  • 【易康eCognition实验教程】003:点云数据加载浏览与操作详解
  • 探索WPF中的RelativeSource:灵活的资源绑定利器
  • Linux——文件与内存
  • 【c语言日寄】Vs调试——新手向
  • 大模型 / 智能体在智能运维领域的应用总结与发展趋势概述
  • win32汇编环境,按字节、双字等复制字符的操作
  • uniapp+Vue3(<script setup lang=“ts“>)模拟12306城市左右切换动画效果
  • ssm基于SSM的毕业论文开题评审管理系统
  • 【力扣:新动计划,编程入门 —— 题解 ②】