计算机结构体系:指令调度与循环展开题型 (非凭感觉的方法详解)

news2024/11/17 19:52:12

文章目录

    • 题目初始分析
    • 1.确定所使用的各个寄存器的作用
    • 2.将循环体内容语句和控制语句分开
    • 3.找出每一条循环体内容指令的代价并排序
    • 4.找出每一条循环体控制指令的代价并排序
    • 5.基于贪婪算法的最优循环展开

体系结构这门课程中,指令调度和循环展开可以说是课程最困难的地方,很多初学者(包括我)都只能凭感觉进行指令调度和循环展开。
在复习这门课程的过程中,我找出了一种比较通用的求解循环展开题型的思路。这种思路不仅能获得循环展开完全填充的最优解,同时还可以在使用的过程中自动确定循环展开的次数,因此在此和大家分享一下。直接用例题进行分析:
在这里插入图片描述

题目初始分析

这是一道很典型的循环展开例题。循环展开来减少每个循环平均的时钟周期并不难,但是难就难在确定最优展开方式。

1.确定所使用的各个寄存器的作用

遇到循环展开题型,首先应该分析代码,将循环体的执行内容大致理解一下,并记录各个寄存器的作用,如下所示:

整数寄存器

  • R1:存放X向量当前元素的地址。
  • R2:存放Y向量当前元素的地址。
  • R3:存放R1是否等于R4的比较结果。
  • R4:存放X向量末尾哨兵的地址。

浮点寄存器

  • F0:存放常数a。
  • F2:存放向量X的当前元素。
  • F4:存放向量X当前元素和常数a的乘法结果。
  • F6:存放向量Y的当前元素。

由此可知,每个循环体都要使用到的寄存器包括四个整数寄存器以及一个浮点寄存器F0,另外,每个循环体都需要单独配备三个浮点寄存器(第一个循环体中为F2 F4和F6)。

2.将循环体内容语句和控制语句分开

循环体内容语句是指循环体本身在每个循环中需要进行的操作;循环体控制语句则是控制循环的行进和终止的语句。
本题中,循环体内容语句如下:
在这里插入图片描述

循环体控制语句如下:

在这里插入图片描述
可以得出:内容语句共有五句,控制语句为四句。
通过多次的循环展开,可以使得多个循环体共用这四句控制语句,从而减少多次循环的时钟周期数,这也是循环展开的本质。

3.找出每一条循环体内容指令的代价并排序

本题中,由于数据相关的存在,使得循环体内容语句执行后可能会需要停顿,这样就导致了系统性能的下降,因此应该避免。
不同的语句与其后跟随的语句确定了每一次的停顿周期数。本题中每个循环体重各条指令的停顿周期数如下:

  • 第一条LD指令:指令结果被MULD指令使用,因此由题目条件可知需要停顿两个周期。
  • MULD指令:指令结果被ADDD指令使用,因此由题目条件可知需要停顿六个周期。
  • 第二条LD指令:指令结果被ADDD指令使用,因此由题目条件可知需要停顿两个周期。
  • ADDD指令:指令结果被SD指令使用,因此由题目条件可知需要停顿4个周期。
  • SD指令:最后一条指令,指令结果不被其他指令使用,因此无停顿。

对循环体内容中各条指令的代价从大到小排序:

MULD指令(6个周期)>ADDD指令(4个周期)>两条LD指令(2个周期)。

4.找出每一条循环体控制指令的代价并排序

过程与上面类似,可以得到下面的递减排列顺序:

DADDIU(2个周期)>其他三条指令

5.基于贪婪算法的最优循环展开

接下来到了循环展开的重点部分了!就是如何实施循环展开。本方法的循环展开基本思路是基于贪婪原则的,因此得到的三条展开原则如下:

  • 每一次执行的指令是当前能够执行的指令中代价最大的一条,且当指令的代价相同时,优先执行循环体内容指令,而滞后执行循环体控制指令;
  • 如果当前不存在任何一条指令能够执行,则引入一个新的循环体。
  • 一般只有各个循环的内容都接近结束时,才执行循环体控制指令。

最后的循环展开结果如下所示,下面对结果进行分析:

1.LD F2,0(R1)
2.LD F8,8(R1)
3.LD F14,16(R1)
4.MULD F4,F2,F0
5.MULD F10,F8,F0
6.MULD F16,F14,F0
7.LD F6,0(R2)
8.LD F12,8(R2)
9.LD F18,16(R2)
10.DADDIU R1,R1,#24
11.ADDD F6,F4,F6
12.ADDD F12,F10,F12
13.ADDD F18,F16,F18
14.DADDIU R2,R2,#24
15.DSLTU R3,R1,R4
16.SD F6,-24(R2)
17.SD F12,-16(R2)
18.BNEZ R3,foo
19.SD F18,-8(R2)
  1. 第一个周期:必定执行第一个循环体的第一条内容指令LD,不用过多叙述。
  2. 第二个周期:此时,由于第一个循环体第一条LD指令还没有得出结果且当前只有一个循环体,不存在其他可执行的循环体内容语句;而目前执行循环体控制语句的时间又过早。因此,引入第二个循环体执行,执行其第一条LD指令。
  3. 第三个周期:同前两个周期,由于当前前两个循环体都处于执行未产生结果的状态,因此执行第三个循环体。执行第三个循环体的第一条LD指令。
  4. 第四个周期:此时第一个循环体的LD语句已经获得执行结果,而其他两个循环体的LD指令还未获得结果,因此只能继续第一个循环体。第一个循环体此时可以执行MULD指令或第二条LD指令,但是由于MULD指令的代价更大,因此首先执行第一个循环体的MULD指令。
  5. 第五个周期:此时第一个循环体正在执行MULD指令,第三个循环体的LD指令还未出结果,按照最大代价原则,因此第二个循环体也执行MULD指令而不是LD指令。
  6. 第六个周期:类似第五个周期,第三个循环体执行MULD指令。
  7. 第七个周期:由于LD指令和MULD指令不相关,因此让第一个循环体执行LD指令。
  8. 第八个周期:类似第七个周期,让第二个循环体执行LD指令。
  9. 第九个周期:类似第八个周期,让第三个循环体执行LD指令。
  10. 第十个周期:此时三个循环体的MULD指令都未执行完成无法执行后续指令,但是第一个循环体的MULD指令只需要再等待一个周期即可,因此可以考虑执行循环体控制指令。本题中,代价最大的循环体控制指令为第一条DADDIU指令,因此执行DADDIU指令。
  11. 第十一个周期:此时第一个循环体的MULD指令已经执行完成,而其他两个循环体和循环控制语句都未执行完成,因此只能向下继续执行第一个循环体的ADDD指令。
  12. 第十二个周期:第二个循环体的MULD指令执行完成,同时第一条DADDIU指令也已经执行完成,但是考虑到代价最大化,因此执行第二个循环体的ADDD指令。
  13. 第十三个周期:类似于第十二个周期,执行第三个循环体的ADDD指令。
  14. 第十四个周期:三个循环体内容均在执行ADDD指令,因此考虑执行循环体控制语句内容。由于第二条DADDIU和DSLTU指令的代价均为0周期,因此可以任选一条执行,此处先执行第二条DADDIU指令。
  15. 第十五个周期:循环体内容均还在执行ADDD指令,因此继续执行循环体控制内容。执行DSTLU指令。
  16. 第十六个周期:第一个循环体的ADDD执行完成。此时,除了跳转指令BNEZ外不存在其他可执行指令,但是BNEZ使用后会跳转到其他地方且只有一个周期延迟,因此放到程序末尾才能执行。所以此处执行第一个循环体的SD指令。
  17. 第十七个周期:类似第十六个周期,执行第二个循环体的SD指令。
  18. 第十八个周期:由于循环体内容中只剩下一条SD未执行且无周期延迟,因此先执行BNEZ指令。
  19. 第十九个周期:执行第三个循环体的SD指令。所有指令执行完成。

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

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

相关文章

负载均衡反向代理下的webshell

负载均衡(Load Balance) 是一种廉价的扩容的方案,它的概念不是本文的重点,不知道的可以去查资料学习。实现负载均衡的方式有很多种,比如 DNS 方式、HTTP 重定向方式、IP 负载均衡方式、反向代理方式等等。 其中像 HTTP 重定向方式、DNS方式等…

BioPython ② | 面向对象编程Object Oriented Programming

BioPython ② | Python面向对象编程 题目要求 定义分子类(Molecule)作为基类,包含集合elements和weight作为其属性,用初始化函数,将elements初始化为空集,weight初始化为None;定义show_weight…

进阶 - Git的远程仓库

本篇文章,是基于我自用Windows(Win10)系统当做示例演示 Git的远程仓库 之前我们一直在探讨 Git 的一些命令,也提及了仓库的概念。如果只是在一个仓库里管理文件历史,Git 和 SVN 真没啥区别。 Git 是分布式版本控制系…

02 stata入门【计量经济学及stata应用】

安装:建议直接在微信搜索,很多公众号有安装包资源及下载教程 不同版本在基本功能上无较大差异,一般为SE,更为专业MP,只是在处理变量个数或容量等存在不同 界面 历史命令;结果窗口&命令窗口&#xff1b…

字节跳动岗位薪酬体系曝光,看完感叹:不服不行,想高薪还得是学这个。。。。

目录:导读 前言 01岗位职级 02岗位薪酬 03绩效考核与晋升 大厂软件测试岗经验分享 一、软件测试基础篇:2022版 二、MySQL篇:2022版 三、 Linux篇:2022版 四、 Web测试 五、接口测试 六、APP测试 七、性能测试 八、Se…

Nacos一些理解

下载Mysql //下载mysql docker pull mysql:5.7 //运行容器 docker run -p 3306:3306 --name mysql -v /home/mysql/log:/var/log/mysql -v /home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORDxx -d mysql:5.7 将导入数据库 1.新建数据库 nacos /*Navicat Premiu…

HyperMesh宝典 | 跟着老师学,你也可以做好二次开发

说到二次开发,你的脑海里是不是浮现出了“码农”两个字?有人可能会问,码农又是什么? 你是不是觉得二次开发这种码农干的事情感觉起来也太困难了吧? 其实有时候二次开发真的很简单,懂一点二次开发会让你的工…

机器学习中的数学原理——多项式回归

这个专栏主要是用来分享一下我在机器学习中的学习笔记及一些感悟,也希望对你的学习有帮助哦!感兴趣的小伙伴欢迎私信或者评论区留言!这一篇就更新一下《白话机器学习中的数学——多项式回归》! 目录 一、什么多项式回归 二、算法…

Java#33(IO流)

目录 一.IO流 作用: (对于程序而言)用于读写数据(本地数据, 网络数据) 二.IO流体系 1.字节输出流 2.字节输入流 3.文件拷贝 3.字符集 字符流 字符输入流 字符输出流 缓冲流 转换流 序列化流 ​编辑反序列流 打印流 一.IO流 I: input O: output 流: 想流…

Linux下创建动态链接库与静态链接库

动态链接库 Linux下的动态链接库文件扩展名为so,可以用多个文件生成一个动态链接库。 在头文件中定义三个函数,三个函数分别于三个cpp文件中实现。 将三个cpp文件编译成动态库libdynamic.so -fPIC表示编译为位置独立的代码,如果不选择默…

使用YOLOv5练自己的数据集

说明 上次使用学习了如何运行yolov5检测自己的数据,这次学习yolov5如何训练自己的数据集 本次记录如何使用yolov5训练自己的数据集以及遇到报错解决方案 数据 使用数据:水果数据集 数据包含了png图片和相应的标注文件 切分数据 代码如下&#xff1…

[ vulhub漏洞复现篇 ] solr 远程命令执行(CVE-2019-0193)

🍬 博主介绍 👨‍🎓 博主介绍:大家好,我是 _PowerShell ,很高兴认识大家~ ✨主攻领域:【渗透领域】【数据通信】 【通讯安全】 【web安全】【面试分析】 🎉点赞➕评论➕收藏 养成习…

Kubernetes的基础概念

一、Kubernetes的介绍 用于自动部署、扩展和管理"容器化(containerized)应用程序"的开源系统 可以理解成K8S是负责自动化运维管理多个容器化程序(比如Docker)的集群,是一个生态极其丰富的容器编排框架工具 …

【现场问题】zookeeper的集群,其中两台起来了,但是另外一台就是起不来,或者起来也是standalone

zookeeper问题现象集群的配置zookeeper的启动以及状态查看问题报错点问题现象 1、总共三台机器,node92,node93,node94 其中node92做了拉起,但是node93(leader)和node94(follower)&a…

浅谈MVVM ——Model-View-View-Model

浅谈MVVM ——Model-View-View-Model 前言: 笔者最近接到这样一个机器人项目,接入他们的机器人平台做二次开发,开发自己的opk移植到机器人上做医院展示使用。opk是必须使用机器人厂家提供的经过一定封装过的,该opk的架构是MVVM。…

48W字?GitHub上下载量破百万的阿里:图解Java、网络、算法笔记

Java基础这个东西,无论在哪个公司都被看得尤为重要,而面试中关于基础的问题也是层出不穷。所以基础可以说是重中之重,当你的基础打牢了,其他的也就没有那么重要了。 说到基础,无外乎操作系统,网络&#xf…

pikachu-CSRF-SSRF-RCE速通

pikachu-CSRF-SSRF-RCE速通 目录pikachu-CSRF-SSRF-RCE速通CSRFCSRF(get)CSRF(post)CSRF TokenSSRFSSRF(curl)SSRF(file_get_content)RCEexec "ping"RCE exec "eval"CSRF 跨站请求伪造,说的通俗一点就是攻击者构造出某个网站的数据包请求并部署…

p3.第一章 基础入门 -- Python编程基本概念 (三)

1.2.2 Python语言 1.2.2.1 Python发展 1989年圣诞节期间,为了打发无聊的时间,荷兰人Guido van Rossum(吉多范罗苏姆)(数学、计算机双硕士,2005年加入Google,2013年加入DropBox)&am…

JavaUUID的理解

可笑,你竟然不知道 Java 如何生成 UUID - 沉默王二博客 UUID是通用唯一标识符的意思,就是唯一不重复的一串字符。 UUID的用途: 随机生成的文件名;Java Web 应用程序的 sessionID;数据库表的主键;事务 ID&…

EMQ 助力阿里云洛神云网络构建新一代“亿级并发、百万级吞吐”NLB 网络型负载均衡系统

万物智联的数字化时代,我们正走在从“数据量变”到“连接质变”的道路上。在日益丰富的物联网应用场景中,实现海量设备与云端之间双向通信连接,分析并从中获得实时洞察成了打造成功物联网解决方案的核心推动因素。EMQ 映云科技(以下简称“EMQ”)作为全球领先的开源物联网基础设…