计算机体系结构实验——Branch-Target Buffers

实验五 Branch-Target Buffers

本次实验的主要目的是加深对Branch-Target Buffers的理解。掌握使用Branch-Target Buffers减少或增加分支带来的延迟的情况。

实验内容: 将以下程序段修改为可利用WinMIPS64模拟器运行的程序。假设R3的初始值为R2+40
在这里插入图片描述

在使用forwarding的情况下,对比采用BTB与不采用BTB技术时流水线的变化。重点分析两种情况下每次循环的stall周期数,都是由什么原因造成的?重点分析与分支指令相关的stall。采用BTB技术时何时能够减少分支指令带来的暂停?何时会增加暂停?为什么?

实验报告:

将程序段3修改为WinMIPS64模拟器可以运行的程序如下:

.text
main:
DADDI R3,R2,40;Loop: LW R1,0(R2)DADDI R1,R1,1SW R1,0(R2)DADDI R2,R2,4DSUB R4,R3,R2BNEZ R4,Loop
end: halt

在使用forwarding,不使用BTB技术的情况下造成的暂停以及原因介绍如下:

数据相关:

1、由于LW指令取数放入R1中在Mem阶段才能到内存中取到数值,而下一条指令需要使用到R1寄存器的数值,存在RAW相关会造成一个周期的暂停

在这里插入图片描述

2、由于DSUB那条指令最后要将结果写到R4中并且在EX阶段结束后才能获得存放到R4中的数值,而跳转指令需要在ID阶段判断是否要跳转,所以会产生RAW相关,暂停一个周期

在这里插入图片描述

控制相关:

3、由下图红框中的指令可以看出,它在处理跳转指令的时候采用的是预测转移失败的行为,但在实际指令运行过程中,指令成功转移,所以会清空流水线,重新取指令,造成一个周期的暂停

在这里插入图片描述

在使用forwarding技术,并且使用BTB技术的情况下造成的暂停以及原因介绍如下:

数据相关:

由于在这种情况下所产生的数据相关与不使用BTB的情况下的数据相关相同,所以不再加以介绍

结构相关:

1、在第一次循环结束时,由于BTB表为空,预测为转移失败,但实际转移成功。所以在ex段执行中会将转移指令地址连同下一条指令的pc值放入BTB中,并且清空流水线,重新取指执行,造成两个周期的暂停。

在这里插入图片描述

2、在第二次循环以及后续的八次循环中,由于该条跳转指令在IF段会查找BTB表,并且会在表中查到对应的指令的地址,所以会预测转移成功,并且将转移地址放入PC中,因此不存在结构相关,不会造成暂停。

在这里插入图片描述

3、在最后一次循环时,由于BTB表中存在对应跳转指令的地址,所以会预测转移成功,但实际上会转移失败,所以会在转移指令的EX阶段中删除BTB表中对应的表项,同时在ex阶段执行结束后会清空流水线重新取指来运行,造成两个周期的暂停。

在这里插入图片描述

由以上可以发现在:

预测正确的时候可以减少暂停:跳转指令在IF阶段会查找BTB表,如果查找到会将下一条指令的地址放入PC寄存器中。如果预测正确则可以在下一个周期就开始下一条指令的取指阶段,而不需要等待跳转指令的ID段执行结束才能执行下一条指令的取指阶段。

预测错误时会增加暂停:由上述程序第一个阶段和最后一个可以看到,如果预测失败,不仅要清空流水线还要修改BTB表中存储的指令地址以及下一条指令的PC值,会造成两个周期的暂停。

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【C++入门到精通】互斥锁 (Mutex) C++11 [ C++入门 ]

阅读导航 引言一、Mutex的简介二、Mutex的种类1. std::mutex (基本互斥锁)2. std::recursive_mutex (递归互斥锁)3. std::timed_mutex (限时等待互斥锁)4. std::recursive_timed_mutex (限时等待…

rhel7/centos7升级openssh到openssh9.5-p1

openssh9.3-p2以下版本有如下漏洞 在rhel7.4/7.5/7.6均做过测试。 本文需要用到的rpm包如下: https://download.csdn.net/download/kadwf123/88652359 升级步骤 1、升级前启动telnet ##升级前启动telnet服务 yum -y install telnet-server yum -y install xinetd…

Redis(非关系型数据库)

Redis(非关系型数据库) 文章目录 Redis(非关系型数据库)认识Redis(Remote Dictionary Server)1.Redis的基本介绍2.Redis的应用场景2.1 取最新N个数据的操作2.2 排行榜应用,取TOP N操作2.3 需要精准设定过期时间的应用2.4 计数器应用2.5 Uniq 操作,获取某段时间所有数…

MATLAB遗传算法工具箱的三种使用方法

MATLAB中有三种调用遗传算法的方式: 一、遗传算法的开源文件 下载“gatbx”压缩包文件,解压后,里面有多个.m文件,可以看到这些文件的编辑日期都是1998年,很古老了。 这些文件包含了遗传算法的基础操作,包含…

【深度学习实践】换脸应用dofaker本地部署

本文介绍了dofaker换脸应用的本地部署教程,dofaker支持windows、linux、cpu/gpu推理,不依赖于任何深度学习框架,是一个非常好用的换脸工具。 本教程的部署系统为windows 11,使用CPU推理。 注意: 1、请确保您的所有路…

【大模型】快速体验百度智能云千帆AppBuilder搭建知识库与小助手

文章目录 前言千帆AppBuilder什么是千帆AppBuilderAppBuilder能做什么 体验千帆AppBuilderJava知识库高考作文小助手 总结 前言 前天,在【百度智能云智算大会】上,百度智能云千帆AppBuilder正式开放服务。这是一个AI原生应用开发工作台,可以…

线程活跃性问题(死锁、活锁、饥饿)

1.什么是“死锁”? 在多线程并发中,两个及以上线程互相持有对方所需要的资源又不主动释放,导致程序进入无尽的阻塞这就是“死锁”; 2.写一段“死锁”代码 import java.util.concurrent.TimeUnit; /*** 写一段必然发生死锁代码*/ public class MustDead…

01、ThreadPoolExecutor 线程池源码完整剖析 ------ 线程池工作流程、参数解析、简单创建线程池及使用演示

目录 线程池源码剖析什么是线程?什么是多线程?什么是线程池 ?为什么需要用到线程池 ?使用线程池有哪些优势 ?线程的应用场景有哪些 ? 2、线程池工作流程ThreadPoolExecutor参数详解1、核心线程数&#xff0…

【Jmeter】循环执行某个接口,接口引用的参数变量存在规律变化

变量设置成下面的值即可 ${__V(supplierId_${supplierIdNum})}

【即插即用篇】YOLOv8改进实战 | 引入 Involution(内卷),用于视觉识别的新一代神经网络!涨点神器!

YOLOv8专栏导航:点击此处跳转 前言 YOLOv8 是由 YOLOv5 的发布者 Ultralytics 发布的最新版本的 YOLO。它可用于对象检测、分割、分类任务以及大型数据集的学习,并且可以在包括 CPU 和 GPU 在内的各种硬件上执行。 YOLOv8是一种尖端的、最先进的 (SOTA) 模型,它建立在以前成…

STM32 AI 模型测试

PC仿真软件测试 我在STM32单片机上跑神经网络算法—CUBE-AI_stm32cube.ai-CSDN博客 仿真软件测试结果和真实情况差距过大 云平台测试 Home - STM32Cube.AI Developer Cloud 上传模型文件 点击Start 选择优化方式 可以跳过量化步骤,到Benchmark 选择合适的型号&a…

韵达快递查询入口,一键将退回件筛选出来

批量查询韵达快递单号的物流信息,并将退回件一键筛选出来。 所需工具: 一个【快递批量查询高手】软件 韵达快递单号若干 操作步骤: 步骤1:运行【快递批量查询高手】软件,并登录 步骤2:点击主界面左上角的…