从01开始 从01开始
首页
  • 计算机科学导论
  • 数字电路
  • 计算机组成原理

    • 计算机组成原理-北大网课
  • 操作系统
  • Linux
  • Docker
  • 计算机网络
  • 计算机常识
  • Git
  • JavaSE
  • Java高级
  • JavaEE

    • Ant
    • Maven
    • Log4j
    • Junit
    • JDBC
    • XML-JSON
  • JavaWeb

    • 服务器软件
    • Servlet
  • Spring
  • 主流框架

    • Redis
    • Mybatis
    • Lucene
    • Elasticsearch
    • RabbitMQ
    • MyCat
    • Lombok
  • SpringMVC
  • SpringBoot
  • 学习网课的心得
  • 输入法
  • 节假日TodoList
  • 其他
  • 关于本站
  • 网站日记
  • 友人帐
  • 如何搭建一个博客
GitHub (opens new window)

peterjxl

人生如逆旅,我亦是行人
首页
  • 计算机科学导论
  • 数字电路
  • 计算机组成原理

    • 计算机组成原理-北大网课
  • 操作系统
  • Linux
  • Docker
  • 计算机网络
  • 计算机常识
  • Git
  • JavaSE
  • Java高级
  • JavaEE

    • Ant
    • Maven
    • Log4j
    • Junit
    • JDBC
    • XML-JSON
  • JavaWeb

    • 服务器软件
    • Servlet
  • Spring
  • 主流框架

    • Redis
    • Mybatis
    • Lucene
    • Elasticsearch
    • RabbitMQ
    • MyCat
    • Lombok
  • SpringMVC
  • SpringBoot
  • 学习网课的心得
  • 输入法
  • 节假日TodoList
  • 其他
  • 关于本站
  • 网站日记
  • 友人帐
  • 如何搭建一个博客
GitHub (opens new window)
  • 计算机历史

  • 数字电路

  • 计算机组成原理

    • 网课-计算机组成原理(北大-陆俊林)

      • 概述-计算机组成原理(北大-陆俊林)
      • 第1周-计算机组成章节视频简介
      • 101-电子计算机的兴起
      • 102-冯·诺依曼结构的要点
      • 103-冯·诺依曼结构的小故事
      • 104-计算机结构的简化模型
      • 105-计算机执行指令的过程
      • 106-计算机输入和输出
      • 107-冯诺依曼结构和具体实现
      • 201-设计自己的计算机
      • 202-x86体系结构
      • 203-x86指令简介
      • 204-复杂的x86指令举例
      • 205-MIPS体系结构
      • 206-MIPS指令简介
      • 301-算术运算和逻辑运算
      • 302-门电路的基本原理
      • 303-寄存器的基本原理
      • 304-逻辑运算的实现
      • 305-加法和减法的实现
      • 306-加法器的优化
      • 401-乘法的运算过程
      • 402-乘法器的实现
      • 403-乘法器的优化1
      • 404-乘法器的优化2
      • 405-除法的运算过程
      • 406-除法器的实现
      • 407-除法器的优化
      • 501-处理器的设计步骤
      • 502-数据通路的建立
      • 503-运算指令的控制信号
      • 504-访存指令的控制信号
      • 505-分支指令的控制信号
      • 506-控制信号的集成
      • 601-流水线的基本原理
      • 602-流水线的优化
      • 603-超标量流水线
      • 604-流水线的冒险
      • 605-数据冒险的处理
      • 606-控制冒险的处理
      • 701-存储层次结构概况
      • 702-DRAM和SRAM
      • 703-主存的工作原理
      • 704-主存技术的发展
      • 705-高速缓存的工作原理
      • 706-高速缓存的组织结构
      • 707-存储容量的计算
      • 801-中断和异常的来源
      • 802-中断向量表的结构
      • 803-中断向量表的发展
      • 804-中断的处理过程
      • 805-内部中断分类说明
      • 806-基于中断的功能调用
      • 901-输入输出接口的基本功能
      • 902-输入输出接口的编址方式
      • 903-输入输出的控制方式
      • 904-中断控制方式
      • 905-外部中断的处理过程
      • 906-直接存储器访问方式
      • 网课-计算机组成原理(北大-陆俊林)
    • 计算机组成原理
  • 汇编语言

  • C语言

  • 数据结构

  • 操作系统

  • Linux

  • 计算机网络

  • Git

  • 数据库

  • 计算机小知识

  • 编译原理

  • 名人堂

  • 计算机基础
  • 计算机组成原理
  • 网课-计算机组成原理(北大-陆俊林)
2023-06-13

403-乘法器的优化1

# 403-乘法器的优化1

计算机的最大优势在于它的运算速度。 因此,当我们设计计算机当中的一个功能部件时 在保证其功能正确性的前提下,就得考虑,它是否拥有足够好的性能。 那么在这一节,我们就要一起对这个乘法器,进行性能上的分析和优化。   首先,我们来快速回顾一下N位乘法器的工作流程。 当我们做好初始化工作之后,首先检查“乘数寄存器”的最低位 如果最低位为1,那么就将“被乘数寄存器”和“乘积寄存器” 的内容相加,并将结果放入到“乘积寄存器”当中。 那么这一步实际上是控制逻辑给出了若干个控制信号,包括让加法器完成加法运算,并给了“乘积寄存器”写入的控制信号。 因为加法器的输出是连接到“乘积寄存器”的输入端的,所以在下一个时钟上升沿来临的时候,“乘积寄存器”就会对加法器的输出进行采样,并保存起来, 这就完成了这一步所指的工作。

然后控制逻辑会向“被乘数寄存器”发出“左移”的控制信号 ,在下一个时钟上升沿来临的时候,“被乘数寄存器”就会完成左移一位的工作。 当然,如果在第一步中检查的“乘数寄存器”的最低位是0 ,那控制逻辑就不会给出让加法器进行运算,和让“乘积寄存器”进行写入的控制信号 ,而会进入到第二步,完成“被乘数寄存器”左移的工作。

再到下一个时钟上升沿,“乘数寄存器”会发现其右移的控制信号有效,所以它就完成一次右移的工作。 然后判断是否已经到了第N次循环,如果没有,说明运算还没有结束, 再回到第1步继续执行;如果发现已经是第N次循环,说明运算已经完成 运算的结果就在当前的“乘积寄存器”当中。
​


我们分析这个工作流程,我们可以发现第1a步执行这个加法 我们需要一个时钟周期,第2步的左移又需要一个时钟周期 第3步的右移还需要一个时钟周期。 因此这个乘法器工作时,每执行一轮,都需要3个时钟周期 那如果是一个32位的乘法器,那就大约需要100个时钟周期。 我们来想一想有没有优化的办法。

​

‍

‍

首先,我们很容易想到的优化,就是刚才 说的这些加法和移位的操作,是否能够并行起来。 虽然我们在介绍流程时这些步骤是一步一步进行的,这样只是便于我们理解。 在实际的实现上,它们并不需要一定有一个先后的顺序。 因此,问题就在于我们的实现结构能否支持让这些加法和移位并行操作。 我们知道,寄存器的内容只会在时钟上升沿来临的时候发生变化 而在其他时候,无论输入端如何变化,寄存器的内容都不会发生变化。 因此,我们就用这个乘法器的当前状态为例,进行分析。 假设现在时钟上升沿还没有来临,那“被乘数寄存器”的输出就是它当前所保存的内容 00001000,这八位信号会被送到加法器的输入端,而加法器的另一个输入端 连接的是“乘积寄存器”的输出端,因此,现在的信号值是全0。 而当前“乘积寄存器”的最低位为1,控制逻辑会据此 产生相关的控制信号,包括让加法器进行加法运算 ,这样加法器就会产生对应的运算结果。 与此同时,控制逻辑还会给出写输入信号 ,但是现在时钟上升沿还没有来,所以“乘积寄存器”其实什么也不会做。 那我们注意,在这个时候,控制逻辑实际上可以同时给出“被乘数寄存器”的移位信号 ,还可以给出“乘数寄存器”的移位信号。 那现在,控制逻辑就将刚才流程图当中的第1a步 ,第2步和第3步所对应的控制信号都置为有效了。 但是因为时钟上升沿还没有来,所以这些寄存器的内容都不会发生变化。

​

‍

那么当时钟上升沿到来的时候,这些寄存器就会根据输入改变其内容。 “乘积寄存器”会将输入端的数保存起来,“被乘数寄存器” 会向左移动一位,“乘数寄存器“会向右移动一位。 而这些操作都是在同一个时钟上升沿到来的时候完成的。 请注意,我们现在假设这个时钟上升沿来了,注意观察这3个寄存器 它们是同时发生变化的。 而且根据我们对寄存器的了解,我们已经知道,在时钟上升沿之后很短的一个时间,寄存器所改变的内容就会传送到输出端。

因此我们可以注意到,”被乘数寄存器“的内容现在已经改变,因此很快,它的输出也会变成0001 0000,并传递到加法器。 但是我们可以放心的是,即使这个信号经过了加法器,并产生了新的运算结果,这个运算结果也不会改变”乘积寄存器“的内容。 因为等这个信号传递到了”乘积寄存器“的输入端时,已经过去了一段时间,这时候”乘积寄存器“对输入端的采样工作已经完成,其输入端信号的改变不会影响这个寄存器的内容了。 这样我们就在同一个时刻完成了所有的加法和移位的操作。

​

‍

那我们再回到刚才的那个流程图。 在这个流程图当中,这3个顺序执行的操作就可以进行优化 ,而我们这32位的乘法,也就不应该再需要100个时钟周期了。 经过优化以后的工作流程,在最开始的第1步,和最后的第4步,还是跟原来一样的。 而中间的这3步,我们可以把它并排地放在一起。 当第1步检查”乘数寄存器“的最低位,如果最低位是1的时候 第1a步、第2步和第3步将同时进行 。如果最低位为0,则通过控制信号的不同,不执行第1a步,而同时执行第2步和第3步,完成之后,就直接进入第4步。 这样我们每一次循环只需要一个周期 ,我们用这个很简单的优化,就把性能提升为了之前的3倍。 这样我们就有了一个速度更快的乘法器。

​

‍

‍

现在,我们已有了一个经过优化后的乘法器了。当然,这个乘法器其实还有很大的性能提升空间。比如说,对于乘法运算,每一个中间结果实际上不需要依赖其他的中间结果的运算,那我们可不可以把所有的中间结果一次性都算出来? 然后再将这些中间结果进行相加,而不要经过一轮又一轮的迭代,这样是不是可以更好地提升性能呢?至于具体怎么做,就留给你自己分析吧

在GitHub上编辑此页 (opens new window)
上次更新: 2023/6/13 17:13:13
402-乘法器的实现
404-乘法器的优化2

← 402-乘法器的实现 404-乘法器的优化2→

Theme by Vdoing | Copyright © 2022-2023 粤ICP备2022067627号-1 粤公网安备 44011302003646号
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式