计算机体系结构补充篇----静态超标量流水线及循环展开(一)

本文仅供学习,不作任何商业用途,严禁转载。部分资料取自----计算机系统结构教程(第二版)张晨曦等。部分资料来自----国科大计算机体系结构课程PPT–张科、刘珂、高婉玲

计算机体系结构----静态超标量流水线及循环展开(一)

  • 摘要
  • 静态编译器流水线调度
  • 循环展开
  • 静态超标量流水线

摘要

本文先简要介绍静态编译器流水线调度(消除数据冒险),再介绍循环展开(Loop Unrolling)技术(消除控制冒险),最后再结合静态超标量流水线技术(增加IPC)和循环展开技术对示例代码进行优化分析

静态编译器流水线调度

假定有如下代码

for(i = 1000; i >0 ; i--)x[i] = x[i] + s;

上述代码转换成MIPS的汇编代码如下
(注意汇编代码段1先忽略各条指令之间的stall,即假定各条指令之间无stall
汇编代码段1

 L.D F0, 0(R1) ; F0 = array elementADD.D F4, F0, F2 ; add scalarS.D F4, 0(R1) ; store resultDADDUI R1, R1,# -8 ; decrement address pointerBNE R1, R2, Loop ; branch if R1 != R2NOP

现在我们做如下规定
LD -> any : 1 stall
FPMUL -> any: 5 stalls
FPMUL>ST : 4 stalls
IntALU ->BR : 1 stall
FPALU -> ST :2stalls
FPALU-> any: 3stalls
BR指的是分支指令。
每个BR指令后续都存在一个Stall。

那么汇编代码段1在上述假定下,实际执行情况如下
汇编代码段2

 L.D F0, 0(R1) ; F0 = array elementstallADD.D F4, F0, F2 ; add scalarstallstallS.D F4, 0(R1) ; store resultDADDUI R1, R1,# -8 ; decrement address pointerstallBNE R1, R2, Loop ; branch if R1 != R2stall

汇编代码段2一共花费10 cycles。

在经过编译器的调度后汇编代码段2变成如下代码段(注意,此时各条指令间不是不存在stall,而是被“合理”消除了))
汇编代码段3

 L.D F0, 0(R1) DADDUI R1, R1,# -8ADD.D F4, F0, F2 stallBNE R1, R2, LoopS.D F4, 8(R1) 

汇编代码段3一共花费6 cycles。

实际上汇编代码段3真正在工作的时间只有ADD.D L.D S.D这三条指令,DADDUI BNE指令都是循环判断指令,知道了这个信息后,那我们还有再优化的空间吗?我们希望把几乎每个循环都控制在三个有效指令在工作,不想在每个循环中都加上循环判断指令。

循环展开

上面的汇编代码段3还可以依靠循环展开来二次优化。优化后的结果如下。
汇编代码段4(注意汇编代码段4先忽略各条指令之间的stall,即假定各条指令之间无stall

 L.D F0, 0(R1) ADD.D F4, F0, F2 S.D F4, 0(R1)L.D F6, -8(R1)ADD.D F8, F6, F2S.D F8, -8(R1)L.D F10,-16(R1)ADD.D F12, F10, F2S.D F12, -16(R1)L.D F14, -24(R1)ADD.D F16, F14, F2S.D F16, -24(R1)DADDUI R1, R1, #-32BNE R1,R2, Loop

如果我们考虑上汇编代码段4的各条指令间的stall,再合理的调度指令把stall给消除,可以得到如下代码段。(注意,此时各条指令间不是不存在stall,而是被“合理”消除了
汇编代码段5

 L.D F0, 0(R1) L.D F6, -8(R1)L.D F10,-16(R1)L.D F14, -24(R1)ADD.D F4, F0, F2 ADD.D F8, F6, F2 ADD.D F12, F10, F2ADD.D F16, F14, F2S.D F4, 0(R1)S.D F8, -8(R1)DADDUI R1, R1, # -32S.D F12, 16(R1)BNE R1,R2, LoopS.D F16, 0(R1)

汇编代码段5一共花费14 cycles,但是却做了汇编代码段2 40个cycles的事!
汇编代码段5每个原循环的cycle数为14/4 = 3.5 (14/4 中的14表示4个循环的总cycle数,4表示4个循环)
我们把这种一个循环展开四次在英文术语上称为Degree4,即循环展开N次,称为DegreeN

当然,这还不是我们的极限,我们还可以使用静态超标量流水线继续加速!

静态超标量流水线

在这里插入图片描述
静态超标量可以简单理解成,处理器一次性发射两条指令,一条是整数指令,一条是浮点指令,以此来实现IPC > 1的效果。
汇编代码段5改写成静态超标量流水线的形式,同时汇编代码段5的四次循环展开Degree4变成Degree5,代码段如下。
汇编代码段6

Integer pipeline    FP pipelineL.D F0,0(R1)        NOPL.D F6,-8(R1)       NOPL.D F10,-16(R1)     ADD.D F4,F0,F2L.D F14,-24(R1)     ADD.D F8,F6,F2L.D F18,-32(R1)     ADD.D F12,F10,F2S.D F4,0(R1)        ADD.D F16,F14,F2S.D F8,-8(R1)       ADD.D F20,F18,F2S.D F12,-16(R1)     NOPDADDUI R1,R1,# -40  NOPS.D F16,16(R1)      NOPBNE R1,R2,Loop      NOPS.D F20,8(R1)       NOP

记住我们做的如下规定,注意汇编代码段6是建立在这个规定下的。
LD -> any : 1 stall
FPMUL -> any: 5 stalls
FPMUL>ST : 4 stalls
IntALU ->BR : 1 stall
FPALU->ST : 2stalls
FPALU-> any: 3stalls
BR指的是分支指令。
每个BR指令后续都存在一个Stall。

NOP = No option 即无操作。

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

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

相关文章

Java加解密算法

Base64 Java 实现 Base64 加密&解密方法_java base64加密-CSDN博客 MD5 蓝易云:java实现md5加解密_java后端md5解密_tiansyun的博客-CSDN博客 HMACShA256 Java HMACShA256_java hmacsha256算法-CSDN博客

FreeRTOS第2天:

1. 二值信号量简介(386.11) 什么是信号量? 信号量(Semaphore),是在多任务环境下使用的一种机制,是可以用来保证两个或多个关键代码段不被并 发调用。信号量这个名字,我们可以把它拆…

【Python-第三方库-pywin32】随笔- Python通过`pywin32`获取窗口的属性

Python通过pywin32获取窗口的属性 基础 获取所有窗口的句柄 【代码】 import win32guidef get_all_windows():hWnd_list []win32gui.EnumWindows(lambda hWnd, param: param.append(hWnd), hWnd_list)print(hWnd_list)return hWnd_list【结果】 获取窗口的子窗口句柄 【代…

【蓝桥杯软件赛 零基础备赛20周】第5周——高精度大数运算与队列

文章目录 1. 数组的应用–高精度大数运算1.1 Java和Python计算大数1.2 C/C高精度计算大数1.2.1 高精度加法1.2.2 高精度减法 2. 队列2.1 手写队列2.1.1 C/C手写队列2.1.2 Java手写队列2.1.3 Python手写队列 2.2 C STL队列queue2.3 Java队列Queue2.4 Python队列Queue和deque2.5 …

边缘数据中心和5G的融合彻底改变数据传输和物联网

伴随着数字化时代的飞速发展,边缘数据中心和5G技术的联袂崛起,正深刻塑造着人们对数据的创造、传输和处理方式。据Gartner公司的预测,到2025年,企业数据的三分之二将在边缘计算设施中涌现,而非传统的集中式数据中心。这…

conan 入门(三十四):conan 2.x实现对只有Makefile的项目(erpcgen)的封装示例

一些已有的较老旧的项目只有Makefile,一般在Linux下编译,windows下编译需要借助cygwin或msys2,对于这样的项目如何实现conanfile.py使用conan进行构建呢?本文以erpc/erpcgen为例,说明实现步骤。 eRPC (Embedded RPC是一个适用于嵌…

134. 加油站(贪心算法)

根据题解 这道题使用贪心算法,找到当前可解决问题的状态即可 「贪心算法」的问题需要满足的条件: 最优子结构:规模较大的问题的解由规模较小的子问题的解组成,规模较大的问题的解只由其中一个规模较小的子问题的解决定&#xff…

分享88个节日PPT,总有一款适合您

分享88个节日PPT,总有一款适合您 88个节日PPT下载链接:https://pan.baidu.com/s/1mfLrdlB9Y1jqz2vkVIwBNA?pwd6666 提取码:6666 Python采集代码下载链接:采集代码.zip - 蓝奏云 学习知识费力气,收集整理更不易…

Markdown学习测试

这里写自定义目录标题 欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants 创建一个自定义列表如何创建一个…

国产Type-C接口逻辑协议芯片:Type-C显示器芯片方案

产品介绍 双Type-C盲插选型: LDR6282 PD3.0认证协议芯片,USB-IF TID号:212 支持iic,USB转UART,CC升级方式,多年市场验证,显示器市场出货量,显示器大厂采用兼容性NO.1。采用QFN32 5…

系列十五、SpringBoot的启动原理分析

一、概述 所谓SpringBoot的启动原理,翻译成大白话就是"当我们在主启动类上运行run方法时,SpringBoot底层到底做了什么事情,能够帮助我们启动一个Spring的web应用",上边用大白话解释了一下什么是SpringBoot的启动原理&am…

vue 解决响应大数据表格渲染崩溃问题

如果可以实现记得点赞分享,谢谢老铁~ 1.场景描述 发起请求获取上万条数据,进行表格渲染,使浏览器卡顿,导致网页崩溃。 2.分析原因 1.大量数据加载,过多操作Dom,消耗性能。 2.表格中包含其他…

160. 相交链表

160. 相交链表 考研那段时间记得太牢了。 当然也是简单题。。 /*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode(int x) {* val x;* next null;* }* }*/ public class Solution {p…

数据库设计实践:粒度的理解与应用示例

粒度是描述数据存储和表示的详细程度。在数据库设计中,理解和正确选择粒度是非常重要的,因为它直接影响到数据的存储效率、查询性能和数据分析的灵活性。 文章目录 粒度的类型:案例粒度选择的考虑因素实际应用 粒度的类型: 细粒度…

24双非硕的秋招总结

24 双非硕的秋招总结 结果: 运气捡漏去了腾讯 想想自己整个研究生学习过程,还是挺坎坷的,记录一下,也给未来的同学提供一些参考。 研一 我是研一上开始学前端的,应该是21年10月份左右,我们实验室是专门…

uniapp前端支付篇(微信、抖音、快手、h5)四个平台支付

前言 微信、快手、h5支付步骤大致相同,只有抖音是有自己的支付组件 项目同时支持多个(微信、快手、h5)平台支付,后端那边代码可以封装的 各平台支付大致流程都是相同的,总结了一下分为五个步骤 点击支付创建订单生成密…

网站更换IP的四大注意事项

1.对网站当中的数据进行备份 网站更换IP时可以将页面的数据库文件和站点文件通过下载工具在本地完成备份。 2.更换解析域名 从站点域名管理后台当中更换域名地址,改为新的IP地址。 3.确保IP安全 在用户更换IP前一定要确定IP是否安全,一旦IP存在不良…

Uniapp Vue3 基础到实战 教学视频

每天都在更新 观看学习地址:视频教学地址(点击跳转) Uniapp的介绍 1 什么是Uniapp?安装及部署 1-1 课程简介: 了解uni-app是什么,它的优势和适用场景,以及它作为一个跨平台框架的基本概念。…

IO流--12--Java lO 设计模式

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 Java lO 设计模式装饰器模式适配器模式工厂模式观察者模式 Java lO 设计模式 装饰器模式 适配器模式 工厂模式 观察者模式