Requirements, Bottlenecks, and Good Fortune: Agents for Microprocessor Evolution【阅读笔记】

新学期开始啦!今天要读的是Yale Patt巨神在2001年的一篇文章,主要讲述了体系结构的发展历史,展望了体系结构的未来。

1. 基本知识

作者首先开宗明义,指出体系结构就是一门折衷(tradeoff)的计算机科学。体系结构工程师的任务就是在众多的相关设计因素之中找到一个最合适的解决方案。

1.1 微处理器的作用

计算机想要解决问题要经过以下几个步骤:problem->algorithm->program->ISA->Microarchtecture->circuits->eletrons,那么微处理器主要负责的就是“ISA->microarchtecture->circuits”这一部分。

其中,ISA的作用是:

  1. 指导编译,得到程序的汇编代码;

  2. 指导微处理器完成程序的功能。

ISA、microarchtecture以及circuits之间的关系是:众多的circuits组合起来实现microarchtecture,microarchtecture就是ISA的一种具体实现。所以对于同一个ISA,可能有完全不同的微体系架构。

最后,在这个层次结构的每一层中,都存在着tradeoff,进一步说明高性能和低成本不能兼得。

1.2 设计要点

同样地,设计一个微处理器必须要进行一定程度的tradeoff。其中,性能、成本、散热、能耗以及可靠都是十分重要的设计要点,在设计过程中,工程师们要做的就是要抓住用户的主要需求,在这几个要点之间进行折中,目的是在满足应用环境的前提下,得到一个合理的、尽可能优秀的设计。

作者列举了一些典型的应用场景:

  1. 科学计算应用,例如预测天气等

  2. 基于交互的应用,例如ATM取款和电商应用

  3. 商业数据处理

  4. 网络应用,例如高速路由报文转发等

  5. 高精度、可信度的信息传输

  6. 嵌入式系统

  7. 多媒体应用,例如解码音视频文件

  8. 一些其他的PC应用

根据应用场景的不同,微处理器的主要功能需求也会随之不同,设计出的微处理器也自然会有不同。

1.3 基本处理

一个微处理器处理指令主要分为以下三个步骤:提供指令、提供数据。处理指令。接下来分别介绍这三个阶段可能出现的问题:

1.3.1 提供指令

早期的微处理器在一个时钟周期内仅仅可以提供一条指令,随后由一条增长为4条。在这一阶段有3个问题是微处理器读取指令的瓶颈:

  1. 指令cache未命中,这时处理器不会读取指令,直到当前指令在cache中命中。

  2. 对于branch指令,我们知道只有在decode阶段才知道branch指令是否taken,所以在fetch阶段遇到branch时就会产生一个fetch break,来确定taken的目的地址。

  3. 对于条件分支指令,只有在代码执行的过程中才能知道跳转到哪条指令,所以这里的预读取指令也是无效的。

1.3.2 提供数据

提供数据的三个基本要求是:可靠性,时效性以及功耗合适。但是三者无法兼得,所以采用的办法就是存储分层(storage hierarchy),我们知道在cache内的数据读取时间小于在内存的小于在外存的。当然这种折中所带来的问题就是数据的读写时间不确定,而且差距悬殊。

1.3.3 处理指令

随着时钟周期越来越短,会带来这一问题:就是某个单元输出的结果可能在一个时钟周期内无法传输到需要这一结果的单元。

2. 取得进展

在微处理器领域所取得的进展主要是从这三个方面出发的。它们分别是:新的需求,存在的瓶颈,以及原有设计的革新。

之前提到的fetch多条指令就是新需求的产物;为了满足高性能的需求,会在片上加入更多的功能单元;同时为了满足低功耗的要求,会优化原有的设计;为了满足今后人机交互的需求,也可能会设计出面向人机交互的处理器。

为了解决现有的瓶颈,处理器的设计也取得了很多的进展。为了解决指令读写缓慢的问题,设计出了指令cache;为了解决上文提到的条件分支瓶颈问题,设计出了trace cache,其中存储着指令的执行顺序而不是编译后的静态顺序,也是一种分支预测的形式。

原有设计的革新指的是随着技术的发展,可以对原有设计的某一部分进行改良,然后节省下来的资源可以用来完成其他的设计。

主要的进展有以下几个:

  1. 流水线。

  2. 片上cache,经历了片上cache、片上指令数据cache以及片上多级cache几个阶段。

  3. 分支预测

  4. 片上浮点运算单元,由于transistor的变小,所以有了多余的资源设计这样一个片上的浮点运算单元

  5. 附加的特殊功能运算单元,可以并发的执行更多的操作,加快处理速度。

  6. 乱序执行,出现数据依赖时,乱序执行可以选择没有冲突的其他指令执行,最大程度的利用功能单元。需要注意的是指令可以乱序执行,但是结果必须按照编译得到的顺序输出。支持这一机制的设计是reorder buffer。

  7. 核心聚类。把多个相互之间有数据交互的处理器形成一个聚类,这样使得他们之间的数据交互不必遍历整个芯片,减少处理时间。

  8. 多处理器(CMP)。在一块芯片上放置多个处理器,减少片上片下数据交互的时间。

  9. 同时多线程(SMT)。多线程跟多处理器有些类似,不同的是多线程是用一个处理器,可以在几乎不增加额外成本的情况下减少处理器闲置时间,显著的提升效能。

  10. 快速核心。为了防止数据依赖导致的延迟,可以让某些功能单元的操作频率快于其他的功能单元。

3. 展望未来

对于未来的发展方向,许多学者各执一词:有的认为千万transistors的处理器是最合适的;有的认为要应用SMT,有的认为要应用CMP;有的认为处理器应该尽可能简单,节省下来的资源可以设计多种多样的cache,有的认为要将系统高度封装到一个大芯片上。这些想法都各有利弊,作者也给出了他的一些展望:

  1. 新的微处理器。扩充现在的微处理器定义,可以把某些实现特定功能的子系统放到微处理器中,这里我觉得这些功能也应该类似于原子功能,不然实现成本可能会很大。

  2. 新的数据通路。因为现在时钟频率越来越大,所以我们必须考虑布线带来的信号延迟,所以一种新的、互不干扰的布线方式可能会带来一些good fortunes。

  3. 内部容错机制。内部容错机制可以自动地修正物理材料带来的执行错误。

  4. 同步异步单元共存。clock jitter 和clock skew会严重影响电路的时序,所以如果能让异步单元对时钟频率进行一些修正,再进行同步操作,这样会减少时钟同步时间。

  5. 不同的时钟周期。为每一个功能单元智能分配时钟周期。

  6. 新材料

  7. 微码的扩展应用

  8. reconfigurable logic,可重用的配置逻辑。

posted @ 2020-05-14 17:33  xinze  阅读(609)  评论(2编辑  收藏  举报