【从零开始学习计算机科学】计算机体系结构(二)指令级并行(ILP)

【从零开始学习计算机科学】【从零开始学习计算机科学】计算机体系结构(二)指令级并行(ILP)

    • ILP
      • 流水线(pipeline)
      • 流水线调度
      • 循环展开和循环流水
        • 循环展开。循环展开的具体步骤可以描述为,
        • 软件流水(循环流水)。我们可以通过流水线的思想处理循环的执行,即不需要这一次的循环体执行完毕,就可以开始下一次的循环体的执行。如果来自循环的迭代是独立的,则可以通过从不同的迭代获取指令,对于不同循环迭代的交联指令可以重新组织循环,以便根据从原始循环的不同迭代选择指令进行执行(类似 Tomasulo算法)
      • 动态调度
        • 记分牌(计分板)算法
      • tomasulo算法
      • 基于硬件的推测
      • 指令多发射
      • 通过存储器体系结构和带宽的优化来开发ILP
      • ILP的局限性
      • ILP总结

ILP

所有指令之间可能实现的通过重叠指令的执行过程成为指令级并行(ILP)。ILP通过重叠多个指令来提高性能利用执行指令所需的操作之间的并行性。即每秒钟执行的指令数增加。而一个指令所需的时间不会更改,但是有可能会增加。ILP对高级(操作系统、程序)不可见。以下为一些常用的ILP技术。

流水线(pipeline)

流水线是实现指令级并行的有效措施之一。本书通过经典的MIPS五周期流水线CPU介绍pipeline技术。当然,流水线并不是只能用于指令级并行,流水线的核心思想可以扩展到许多应用场景,需要我们具体问题具体分析。

我们可以划分指令的执行为以下 5 个经典的阶段:

  • IF:指令提取
    IF阶段根据程序计数器(PC)从内存获取当前指令。
    通过向 PC 添加 4 个指令(因为每个指令是 4 个字节),按顺序将 PC 更新到下一个指令的地址。

  • ID: 指令解码 (带寄存器提取)
    解码指令并读取寄存器;在读取寄存器时,对可能的分支执行相等性测试(提前分支判断)。在需要的情况下,对指令的偏移字段进行符号扩展; 通过将符号扩展偏移量添加到递增的 PC 来计算可能的分支目标地址。在实现了提前分支判断的CPU中,如果条件测试为true,可以通过将目标地址存储到 PC 中完成分支指令。

  • EX:执行
    执行或有效地址计算,在载入-存储体系结构中,无需指令同时计算数据地址并执行数据操作。 ALU 将处理两种可能性之一。

  • MEM:内存访问
    访存阶段,对于load指令,ALU的输出为要读取的数据的地址,对于store指令,将寄存器的数据写回到指定存储器地址,ALU的输出为要存入的数据的地址。

  • WB: (注册) 回写
    写回阶段,将ALU计算的数据或load指令读出的数据存入寄存器中。

流水线对单个任务的延迟没有帮助,它有助于整个工作负载的吞吐量。流水线时钟频率速率受最慢管道阶段限制,流水线的时钟周期时间的最小值等于这五个阶段关键路径的延迟的最大值与寄存器延迟的和。流水线CPU的多个指令在同时运行,并且流水线的最大加速比等于流水线级数。流水线可以缩短每条指令的平均执行时间,这可认为是降低了CPI或时钟周期时间。实际上,流水线并没有缩短每条指令执行的总时间。反而,由于流水线开销,指令的延迟实际上略有增加。

流水线的开销主要表现在,第一,不平衡的管道阶段,最慢的阶段主导着总吞吐量。第二,流水线寄存器和时钟偏斜,第三,寄存器的设置时间存在延迟。

实际中还存在时钟偏斜,我们假设所有寄存器同时在时钟边缘触发。在实际工作中,由于物理设计不完善,一些寄存器比其他人更早的到达时钟边缘。

并且,流水线中存在流水线冒险现象,其会阻止指令流的下一条指令执行。冒险会降低流水化带来的加速比。

冒险通常会带来流水线停顿,对于存在冒险的流水线的加速比,我们可以通过以下方式计算。加速比等于1除以1与每条指令的平均流水线停顿周期的和再乘流水线深度,流水线深度等于非流水化时钟周期除以流水化时钟周期。

冒险通常分为以下三类,1,结构冒险,即指令所需计算资源繁忙(例如,需要多个阶段的指令,在这条指令执行的过程中,不能执行使用这个资源的其他指令)2,数据冒险,即指令之间的数据依赖关系,需要等待以前的指令来完成其数据读/写。3,控制冒险,执行流取决于以前的指令。比如分支跳转指令。

对于不同的冒险,我们采用不同的方法来解决,但是解决这三种不同冒险的思路相似的。

对于结构冒险,其本质上是由于资源不足或者某一模块流水化程度低导致的,为了避免结构冒险,最简单方法解决方法便是流水线停顿,即等待上一条指令执行到消除冒险后再执行下一条指令。停顿通常称为流水线气泡,或称为气泡。对于只有一个写端口的寄存器堆,在同一个时钟周期内,若有两条指令同时去写寄存器堆,就会产生结构冒险,但是,一般来说,在同一个时钟周期内,一条指令读一条指令写寄存器堆不会产生结构冒险。对于结构冒险的最有力的解决措施是添加硬件资源,可以(几乎)消除结构危害。完全避免结构性危险是非常昂贵的,对于流水线功能单元成本更高(流水线式 FP ALU 成本高)。如果结构危险是罕见的,就忽略它。例如,如果 FP 操作很少,则只需使用非流水式 FP ALU。

对于数据冒险,数据冒险是由于指令之间的依赖导致的。通常情况下指令之间存在着依赖关系,即数据相关,我们可以把数据相关分为(真)数据相关,名称相关和控制相关,对于存在依赖关系的两条指令,其必须顺序执行,不能进行重排序。对于真数据相关,我们可以通过合适的调度尽可能地在保持依赖关系的同时减少冒险的发生,对于名称相关,我们可以通过寄存器重命名解决。数据冒险一定发生于存在依赖关系的指令之间,但是存在依赖关系的指令执行时不一定发生数据冒险。对于控制相关,其主要表现为控制相关的指令受到其对应的控制指令(一般是分支指令)控制,只有在应当执行时去执行。对于控制相关,我们可以通过推测来实现存在控制相关的指令的调度。

数据冒险按数据依赖关系划分可以分成以下三类。

1,写后读(RAW)。写后读冒险是由于在写指令i执行前读指令j试图读取相应的寄存器。

2,读后写(WAR)。WAR冒险是由于读指令i执行前写指令j试图写入相应的寄存器。

3,写后写(WAW)依赖。WAR冒险是由于写指令i执行前写指令j试图写入相应的寄存器。

对于RAW冒险,其来源于真数据依赖,而对于WAR和WAW冒险,其来源于名称相关,因此,WAR和WAW冒险可以通过寄存器换名解决。

一般来说,对于数据冒险,我们可以通过旁路(数据前推或短路)和流水线暂停实现数据冒险的解决。旁路技术主要是通过将计算结果通过流水线寄存器转发到当前执行的其他指令之中,其他指令可以通过流水线寄存器获取存在数据依赖的指令的执行结果而不必要等其执行完毕后才获取。比如,对于

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

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

相关文章

android edittext 防止输入多个小数点或负号

有些英文系统的输入法,或者定制输入法。使用xml限制不了输入多个小数点和多个负号。所以代码来控制。 一、通过XML设置限制 <EditTextandroid:id="@+id/editTextNumber"android:layout_width="wrap_content"android:layout_height="wrap_conten…

2019年蓝桥杯第十届CC++大学B组真题及代码

目录 1A&#xff1a;组队&#xff08;填空5分_手算&#xff09; 2B&#xff1a;年号字符&#xff08;填空5分_进制&#xff09; 3C&#xff1a;数列求值&#xff08;填空10分_枚举&#xff09; 4D&#xff1a;数的分解&#xff08;填空10分&#xff09; 5E&#xff1a;迷宫…

从C#中的MemberwiseClone()浅拷贝说起

MemberwiseClone() 是 C# 中的一个方法&#xff0c;用于创建当前对象的浅拷贝&#xff08;shallow copy&#xff09;。它属于 System.Object 类&#xff0c;因此所有 C# 对象都可以调用该方法。 1. MemberwiseClone() 的含义 浅拷贝&#xff1a;MemberwiseClone() 会创建一个新…

笔记六:单链表链表介绍与模拟实现

在他一生中&#xff0c;从来没有人能够像你们这样&#xff0c;以他的视角看待这个世界。 ---------《寻找天堂》 目录 文章目录 一、什么是链表&#xff1f; 二、为什么要使用链表&#xff1f; 三、 单链表介绍与使用 3.1 单链表 3.1.1 创建单链表节点 3.1.2 单链表的头插、…

尚硅谷爬虫note15n

1. 多条管道 多条管道开启&#xff08;2步&#xff09;&#xff1a; (1)定义管道类 &#xff08;2&#xff09;在settings中开启管道 在pipelines中&#xff1a; import urllib.request # 多条管道开启 #(1)定义管道类 #&#xff08;2&#xff09;在setti…

oracle检查字段为空

在Oracle数据库中&#xff0c;检查字段是否为空通常涉及到使用IS NULL条件。如果你想查询某个表中的字段是否为空&#xff0c;你可以使用SELECT语句结合WHERE子句来实现。这里有一些基本示例来展示如何进行这样的查询。 示例1: 检查单个字段是否为空 假设你有一个表employees…

虚幻基础:动画层接口

文章目录 动画层&#xff1a;动画图表中的函数接口&#xff1a;名字&#xff0c;没有实现。动画层接口&#xff1a;由动画蓝图实现1.动画层可直接调用实现功能2.动画层接口必须安装3.动画层默认使用本身实现4.动画层也可使用其他动画蓝图实现&#xff0c;但必须在角色蓝图中关联…

HarmonyOS学习第18天:多媒体功能全解析

一、开篇引入 在当今数字化时代&#xff0c;多媒体已经深度融入我们的日常生活。无论是在工作中通过视频会议进行沟通协作&#xff0c;还是在学习时借助在线课程的音频讲解加深理解&#xff0c;亦或是在休闲时光用手机播放音乐放松身心、观看视频打发时间&#xff0c;多媒体功…

绪论数据结构基本概念(刷题笔记)

&#xff08;一&#xff09;单选题 1.与数据元素本身的形式、相对位置和个数无关的是&#xff08;B&#xff09;【广东工业大学2019年829数据结构】 A.数据存储结构 B.数据逻辑结构 C.算法 D.操作 2.在数据结构的讨论中把数据结构从逻辑上分为&#xff08;C&#xff09;【中国…

GPTQ - 生成式预训练 Transformer 的精确训练后压缩

GPTQ - 生成式预训练 Transformer 的精确训练后压缩 flyfish 曾经是 https://github.com/AutoGPTQ/AutoGPTQ 现在是https://github.com/ModelCloud/GPTQModel 对应论文是 《Accurate Post-Training Quantization for Generative Pre-trained Transformers》 生成式预训练Tr…

git的使用方法

文章目录 前言git简介GIT的基本操作克隆仓库 (Clone)获取最新代码 (Pull)提交代码到远程仓库查看当前分支查看提交代码的日志git config 配置用户信息 GIT的实操 前言 git是一种软件版本管理工具&#xff0c;在多人团队软件开发中地方非常重要。 类似与SVN&#xff0c;git工具…

php虚拟站点提示No input file specified时的问题及权限处理方法

访问站点&#xff0c;提示如下 No input file specified. 可能是文件权限有问题&#xff0c;也可能是“.user.ini”文件路径没有配置对&#xff0c;最简单的办法就是直接将它删除掉&#xff0c;还有就是将它设置正确 #配置成自己服务器上正确的路径 open_basedir/mnt/qiy/te…

使用Langflow和AstraDB构建AI助手:从架构设计到与NocoBase的集成

本文由 Leandro Martins 编写&#xff0c;最初发布于 Building an AI Assistant with Langflow and AstraDB: From Architecture to Integration with NocoBase。 引言 本文的目标是演示如何创建一个集成了 NocoBase、LangFlow 和 VectorDB 工具的 AI 助手。作为基础&#xf…

6.聊天室环境安装 - Ubuntu22.04 - elasticsearch(es)的安装和使用

目录 介绍安装安装kibana安装ES客户端使用 介绍 Elasticsearch&#xff0c; 简称 ES&#xff0c;它是个开源分布式搜索引擎&#xff0c;它的特点有&#xff1a;分布式&#xff0c;零配置&#xff0c;自动发现&#xff0c;索引自动分片&#xff0c;索引副本机制&#xff0c;res…

SSL VXN

SSL VPN是采用SSL&#xff08;Security Socket Layer&#xff09;/TLS&#xff08;Transport Layer Security&#xff09;协议来实现远程接入的一种轻量级VPN技术,其基于B/S架构&#xff0c;免于安装客户端&#xff0c;相较与IPSEC有更高的灵活度和管理性&#xff0c;当隧道建立…

【Qt】成员函数指针

一、成员函数指针的本质 与普通函数指针的区别&#xff1a; // 普通函数指针 void (*funcPtr)() &普通函数;// 成员函数指针 void (MyClass::*memberFuncPtr)() &MyClass::成员函数;• 绑定对象&#xff1a;成员函数指针必须与类的实例对象结合使用 • 隐含 this 指…

通义万相2.1开源版本地化部署攻略,生成视频再填利器

2025 年 2 月 25 日晚上 11&#xff1a;00 通义万相 2.1 开源发布&#xff0c;前两周太忙没空搞它&#xff0c;这个周末&#xff0c;也来本地化部署一个&#xff0c;体验生成效果如何&#xff0c;总的来说&#xff0c;它在国内文生视频、图生视频的行列处于领先位置&#xff0c…

Linux——system V共享内存

共享内存区是最快的IPC(进程内通信)形式&#xff0c;不再通过执行进入内核的系统调用来传递彼此的数据 1.共享内存的原理 IPC通信的本质是让不同的进程先看到同一份资源&#xff0c;然后再进行通信&#xff0c;所以想要通过共享内存进行通信&#xff0c;那么第一步一定是让两个…

01 SQl注入基础步骤(数字、字符、布尔盲注、报错)

目录 1、SQL注入漏洞的概要 2、SQL注入的常规思路 3、数字型注入 4、字符型注入 5、布尔盲注 6、报错注入 1、SQL注入漏洞的概要 原理&#xff1a;通过用户输入的数据未严格过滤&#xff0c;将恶意SQL语句拼接到原始查询中&#xff0c;从而操控数据库执行非预期操作。 …

leetcode-sql数据库面试题冲刺(高频SQL五十题)

题目&#xff1a; 620.有趣的电影 表&#xff1a;cinema ------------------------ | Column Name | Type | ------------------------ | id | int | | movie | varchar | | description | varchar | | rating | float | ------------------------ id 是该表的主键(具有唯一值…