计算机体系结构基础知识介绍之使用多问题和静态调度来利用 流水线

news2024/11/26 20:25:49

为了提高处理器的性能,我们需要让每个时钟周期内发出多条指令,而不是只发出一条。这种多发射处理器有三种主要类型:
1. 静态调度的超标量处理器
2. VLIW(非常长指令字)处理器
3. 动态调度的超标量处理器。
这三种类型的处理器的区别在于它们每个时钟周期内发出的指令数量是固定的还是可变的,以及它们是按照指令的顺序执行还是乱序执行。VLIW处理器是靠编译器来安排指令并行执行的,而超标量处理器是靠硬件来安排指令并行执行的。静态调度的超标量处理器通常只能发出两条指令,所以当我们需要更多的并行度时,我们会选择VLIW或动态调度的超标量处理器。

基本 VLIW 方法

VLIW处理器有多个独立的功能单元,它们可以同时执行不同的操作。VLIW处理器的指令非常长,可以包含多个操作,或者要求指令包中的指令满足一定的约束。

VLIW处理器的优势在于它可以发出更多的指令,提高并行度。为了让功能单元忙碌起来,我们需要在代码中找到足够的并行性,这可以通过展开循环和调度代码来实现。如果展开循环后产生了没有分支的代码,那么我们可以用局部调度技术来安排指令。如果要跨越分支来调度代码,那么我们就需要用更复杂的全局调度算法来优化代码。全局调度算法不仅结构更复杂,而且还要处理更复杂的权衡问题,因为跨越分支会增加开销。

VLIW方法的优点是减少了硬件复杂性、降低了功耗、简化了解码和指令发射、提高了潜在的时钟频率。VLIW方法的缺点是需要复杂的编译器、增加了程序代码大小、需要更大的内存带宽和寄存器文件带宽、可能因为未预料到的事件(例如缓存未命中)而导致整个处理器停顿、可能因为VLIW中有空闲的操作码而浪费内存空间和指令带宽。

现在,我们先假设用展开循环就可以生成长而没有分支的代码序列,然后用局部调度来构造VLIW指令,并关注这些处理器的运行情况。

例子 假设我们有一个VLIW处理器,它每个时钟周期内可以发出两个内存引用、两个浮点操作和一个整数操作或分支。给出一个展开后的循环 x[i] = x[i] + s的版本,适合这样的处理器。展开多少次才能消除所有停顿。

 

上图显示了代码。循环被展开成了七个副本,这消除了所有停顿(即完全空闲的发射周期),并使得展开和调度后的循环在9个周期内运行完毕。这段代码的运行速率是9个周期内完成七个结果,即每个结果1.29个周期。

最初的VLIW模型有一些技术和物流方面的问题,使得这种方法的效率不高。技术方面的问题是代码大小的增加和锁步操作的限制。代码大小的增加有两个原因:一是为了在没有分支的代码片段中生成足够的操作,需要大胆地展开循环(就像前面的例子那样),从而增加了代码大小;二是当指令不满时,未使用的功能单元会在指令编码中浪费位数。

为了解决这个问题,有时会使用一些巧妙的编码方式。例如,可能只有一个大的立即数字段,供任何功能单元使用。另一种技术是在主存储器中压缩指令,在它们被读入缓存或解码时扩展它们。

早期的VLIW处理器是锁步操作的;它们完全没有危险检测硬件。这种结构要求任何功能单元管道中的停顿都必须导致整个处理器停顿,因为所有的功能单元必须保持同步。虽然编译器可能能够调度确定性的功能单元来避免停顿,但预测哪些数据访问会遇到缓存停顿并调度它们是非常困难的。因此,缓存需要是阻塞的,并导致所有功能单元停顿。随着发射率和内存引用数量的增加,这种同步限制变得难以接受。

在更近期的处理器中,功能单元更加独立地运行,编译器用于在发射时避免危险,而硬件检查允许发射后的指令不同步地执行。二进制代码兼容性也是通用VLIW或运行第三方软件的VLIW面临的一个主要物流问题。

在严格的VLIW方法中,代码序列既利用了指令集定义,又利用了详细的管道结构,包括功能单元和它们的延迟。因此,不同数量和延迟的功能单元需要不同版本的代码。这个要求使得在不同实现之间或不同发射宽度之间迁移变得比超标量设计更困难。当然,从一个新的超标量设计获得改进的性能可能需要重新编译。然而,能够运行旧的二进制文件是超标量方法的一个实际优势。

当并行性来自于FP程序中简单循环展开时,原始循环可能可以在向量处理器=上高效地运行。对于这样的应用程序,多发射处理器相比向量处理器是否有优势还不清楚;成本相似,而向量处理器通常速度相同或更快。多发射处理器相对于向量处理器潜在的优势是前者能够从不太结构化的代码中提取一些并行性,并且能够轻松地缓存所有形式的数据。

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

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

相关文章

lua 请求ftp服务器数据,下载文件

1、装入ftp库 2、调用ftp的get()方法 3、get()方法参数格式: 4、将返回到的数据写入文件中 例如,本次获取专利数据系统 http://patdata1.cnipa.gov.cn/ 的ftp站点数据 local ftp require("socket.ftp")--此处我没填端口号 file,err ftp.g…

findfont: Font family ‘Times New Roman‘ not found.

问题 Linux 使用 matplotlib.pyplot 画图时为了使字体和英文论文中的 Times of Roman 一致,通常会用到如下文本格式 font1 {family: Times New Roman, # x and y labelsweight: normal,size: 16}但在实际使用时会出现如下报警信息: findfont: Font …

element ui 导入模块的封装

导入组件的封装 <template><Modal :visible"visible" title"导入" onSave"onSave" onCancal"closeDialog"><template #default><el-upload ref"upload" class"upload-demo"action"ht…

Scala中使用 break 和 continue

Scala中没有 break 和 continue 关键字&#xff0c;但是我们可以用 Breaks 类提供的相应方法来实现对应功能。 在Java中&#xff0c;break continue return的区别 1、break&#xff1a;break不仅可以结束其所在的循环&#xff0c;还可结束其外层循环&#xff0c;但一次只能结束…

Vulnhub: Hackable:II靶机

kali&#xff1a;192.168.111.111 靶机&#xff1a;192.168.111.142 信息收集 端口扫描 nmap -A -sC -v -sV -T5 -p- --scripthttp-enum 192.168.111.142 网站的files目录 ftp存在匿名登录&#xff0c;所在目录为网站的files目录 ftp上传反弹shell 提权 目标根目录下的.ru…

预付费智能水表远程控制系统

预付费智能水表远程控制系统是一种基于物联网技术的智能水表管理系统&#xff0c;它通过远程通信技术和云计算平台&#xff0c;实现了对水表的实时监控、数据采集、费用计算、远程控制等功能。该系统不仅可以提高水务公司的管理效率&#xff0c;还可以为用户提供更加便捷、可靠…

[疑难杂症2023-004]停止服务器自动启动的服务,解决端口占用的问题

本文由Markdown语法编辑器编辑完成。 1. 背景 前段时间&#xff0c;在linux上启动一个目录下的docker-compose.yml中的服务时&#xff0c;遇到了一个3000端口被占用的问题. 凭借经验&#xff0c;一般可能是之前的服务没被正常的停止掉&#xff0c;导致该服务占用的端口未被释…

阿里云——网站建设:动态网站建设(知识点)

作者简介&#xff1a;一名云计算网络运维人员、每天分享网络与运维的技术与干货。 座右铭&#xff1a;低头赶路&#xff0c;敬事如仪 个人主页&#xff1a;网络豆的主页​​​​​ 目录 写在前面 课程目标 一.简单搭建动态网站 1.网站搭建类型 &#xff08;1&#xff0…

eclipse4.2.1 juno install SWT 1.7

SWT-windowbuilder-1.7-eclipse4.2.1-juno windows WB_v1.7.0_UpdateSite_for_Eclipse4.2.zip

【ESP32-CAM】20元就能搭建简易Web摄像头

图文步骤 在首选项中&#xff0c;增加网址https://dl.espressif.com/dl/package_esp32_index.json 安装esp32资源包 选择ESP32-CAM开发板 选一个USB-TTL的串口工具&#xff0c;按照图示&#xff0c;RX接U0TXD&#xff0c;TX接U0RXD&#xff0c;GND和5V供电&#xff0c;其中G…

3 2^k-分位数组

作者: 赵晓鹏时间限制: 1S章节: 递归与分治 #include <iostream> #include <algorithm> #include <queue> #include <tuple> #include <stack> #pragma GCC optimize(1) #pragma GCC optimize(2) #pragma GCC optimize(3,"Ofast",&quo…

【UGUI学习笔记】渲染层级

文章目录 Camera渲染Canvas渲染Sorting LayerOrder in Layer 图层渲染 Camera渲染 摄像机的渲染层级需要修改Clear Flags属性&#xff0c;这个属性下的四种模式比较复杂&#xff0c;此处只是介绍不同渲染方式下进行的选择。 摄像机的默认模式是Skybox&#xff0c;也就是视距内…

Acwing 850. Dijkstra求最短路 II

Acwing 850. Dijkstra求最短路 II 链接:850. Dijkstra求最短路 II - AcWing题库 /* 题解:堆优化版本的dijkstra 就是优化了 每次寻找当前距离源最近的点的时间 有小顶堆来维护当前为确定的点和源的距离 那么每次找最新确定的点的时候就是堆顶 */ #include<iostream> #i…

阐述kubernetes部署:基础设施安装

基础设施部署 持久卷的建立 请参考&#xff1a;《持久卷的建立》 elasticsearch部署 一、设置远程扩展字典 不使用自定义字典请忽略此步骤 首先更改ES中IK插件的配置&#xff1a; vi/opt/kubernetes/es/IKAnalyzer.cfg.xml 按您的实际设置的秘钥配置secret_value&#xff1a; …

使用echarts+echarts-gl绘制3d地图,实现地图轮播效果

记录一下大屏开发中使用到的echarts-gl大屏的页面根据需求前前后后改了几个版本了&#xff0c;地图的样式也改了又改这里记录一下&#xff0c;因为echarts属性用到的比较多也比较杂&#xff0c;防止以后需要用到忘记了 目录 初始效果 效果图&#xff1a; 适应大屏风格的发光…

SpringBoot项目模块间通信的两种方式

说明&#xff1a;在微服务架构开发中&#xff0c;一个请求是通过模块之间的互相通信来完成的&#xff0c;如下面这个场景&#xff1a; 创建两个子模块&#xff1a;订单模块&#xff08;端口8081&#xff09;、用户模块&#xff08;端口8082&#xff09;&#xff0c;两个模块之…

Vue周日历展示大学课程

最近在做日历展示课程&#xff0c;网上也寻找了一些控件 例如&#xff1a;在Vue中引入fullcalendar制作课程表 还有 课程表插件Timetables 感觉效果都不错&#xff0c;而且这个控件还是开源的&#xff0c;大家有需要的都可以去下载试用&#xff0c;我需要的控件可能大致和这个…

Node中http请求body参数解析

1.request 说明&#xff1a;request本质就是一个可读流&#xff0c;因此需要转码。 req.setEncoding("utf-8") 2.声明变量 let isLogin 说明&#xff1a;判断是否登录 3.读取 req.on("data",(data)>{ const loginInfoJSON.parse(data)console.log(JSO…

最细最全,Jmeter获取jdbc数据4种方法-超详细,看这篇足够...

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 jmeter使用jdbc协…

【接口/性能测试】Jmeter引用 jar包的三种方式(详细)

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 实现对登录密码进…