OpenCL异构并行计算:原理、机制与优化实践 (刘文志, 陈轶, 吴长江) (z-library.sk, 1lib.sk, z-lib.sk)
c
No Description
1
Views
0
Downloads
0.00
Total Donations
Registered users can read the full content for free
Register as a Gaohf Library member to read the complete e-book online for free and enjoy a better reading experience.
Page
1
(This page has no text content)
Page
2
(This page has no text content)
Page
3
版权信息 书名:OpenCL异构并行计算:原理、机制与优化实践 作者:刘文志,陈轶,吴长江 出版社:机械工业出版社 出版时间:2016-01-01 ISBN:9787111519348 —·版权所有 侵权必究·—
Page
4
序一 随着计算能力的不断提高和可编程性的不断增强,GPU受到越来越 多厂商和开发人员的青睐,应用越来越广泛。无论是在科学计算等传 统领域还是在多媒体计算等新兴互联网领域,在融合CPU和GPU构成的 异构计算系统上使用GPU实现应用程序加速已经成为提高程序性能的主 要模式。同时,主流芯片厂商根据实际计算需求,不断发展自己的GPU 架构。例如:NVIDIA的Fermi、Kepler和Maxwell架构;AMD的 Cypress、Cayman、GCN架构等。这些不同架构的GPU已经深入到从移动 计算领域到超级计算领域的方方面面,异构计算正日益作为新的主流 计算机体系结构。 与CUDA只能运行在NVIDIA GPU上相比,OpenCL由Khronos国际标准 组织发布与维护,是一种针对通用并行计算的开放行业标准和跨厂商 解决方案。到目前为止,OpenCL已有包括Intel、NVIDIA、AMD在内的 众多硬件厂商和软件厂商的支持与维护。随着异构计算的发展, OpenCL的发展方兴未艾,正逐渐成为异构并行计算领域里异军突起的 应用程序编程接口。OpenCL定义了丰富的API,应用程序开发人员可以 通过使用OpenCL,以最高效的方式充分利用计算系统中的各种异构计 算资源,在实现性能目标的同时又可降低功耗。更重要的是,OpenCL 程序可以运行在不同厂商的各种处理器上,实现了高性能并行程序的 可移植。 然而,为了实现上述目标,OpenCL被设计成一个相对复杂的并行 编程标准,其编程充满了各种困难和挑战。本书首先通过简洁、通俗 的语句和丰富的代码示例清晰解释了OpenCL中比较晦涩难懂的各种概 念以及API的使用;然后描述了OpenCL到主流GPU处理器的映射,最后 通过二维卷积、矩阵乘法等实际案例的开发和优化,进一步帮助读者
Page
5
加深对OpenCL的概念和应用的理解。本书写作以最新的OpenCL 2.0为 标准,对SVM机制、管道、原子操作等新概念进行了非常深入的描述, 具有较强的前沿性,这为OpenCL开发人员理解、掌握和使用最先进的 OpenCL技术提供了很大的帮助。 本书的作者是长期战斗在异构编程第一线的架构师和开发者,具 有非常丰富的OpenCL使用和编程经验,本书正是他们多年OpenCL编程 经验的总结。本书不仅详细描述了OpenCL的各种概念和特性;而且通 过由浅入深的一系列实际应用案例,帮助读者掌握这个令人激动的新 编程模型。本书内容充实,不仅适合不同经验水平的学生和开发者, 而且对于致力于异构计算的研究人员,也是一本非常不错的OpenCL教 科书。 张云泉 研究员 中国科学院计算技术研究所计算机体系结构国家重点实验室
Page
6
序二 计算机的基础组成在过去的十几年发生了很多变化,从单核处理 器发展到多核处理器,然后发展到“众核”处理器,高效性的需求一 直促进着处理器的发展,最终走到“异构处理器”,如CPU和GPU的结 合,CPU和FPGA的结合。这一阶段异构处理器的发展和先前的形式产生 了本质的区别,先前的形式主要是将多个异构模块(在物理上)叠加到 一颗处理器内,而各异构单元间的内存、数据处理和通信还是分开 的,如内存控制器、通信机制还是各模块单独设计。现代的异构处理 器着眼于将异构处理模块间的编程模型统一、内存统一、数据统一处 理,甚至将各异构处理单元统一纳入操作系统的管理之下,最大限度 地提升处理器的可编程性和能效比,为此各大芯片厂商也不遗余力地 开发自己的异构片上系统(SoC)。 最近我们看到,由于人工智能和机器学习随着移动互联网的兴 起,特别是对图片、视频、语音等非结构化数据的挖掘、识别,带动 了以智能算法为核心的应用的兴起,“异构平台”成为各大互联网厂 商追逐数据挖掘平台先进性的标志之一。这源于异构计算可使数据处 理的特定性能实现成百上千倍提升的特点。 作为异构编程人员首选的编程语言模型OpenCL(Open Computing Language),其将GPU计算的能力释放出来,带来了异构计算的新时 代,在苹果公司的大力支持下,得到了包括AMD、Intel等主流处理器 厂家的大力支持,也得到了如Altera等主流FPGA芯片公司的支持, OpenCL由Khronos Group精心设计维护,由于其开放、高度通用的跨平 台设计原则,正在成为异构处理器的性能调优利器和开发语言。试 想,以后运行性能优化能够在不同厂家的异构处理器间兼容而无须重 写,实现“一次编写,多环境运行”,则可以大大提高开发效率。
Page
7
在该书出版之际,OpenCL 2.0的规范也已经发布。本书不但介绍 了OpenCL 2.0及硬件厂家(如AMD的HSA架构)对OpenCL 2.0的支持情 况,还介绍了当前热点移动处理器对异构平台和OpenCL的支持情况。 这几方面相信都是读者非常感兴趣的。 现在市面上关于OpenCL编程的书籍无论翻译的还是国内自己编写 的都很多,可见异构计算正在从先前的以科学计算为主导的领域走向 更开放的生态系统和应用,这是非常令人欣喜的事情。本书的编写背 景和风格与其他书籍稍显不同,本书的几位作者均来自社区,也是活 跃在各大GPU厂家的资深技术人员和实际项目的开发工程师。他们从自 己使用经验的角度来阐述如何构建一个合理优化的OpenCL程序。根据 本书一步一步讲解的内容来进行OpenCL编程,无论你是一个CPU编程人 员,还是一个CUDA编程人员,都能很快地学会OpenCL编程。本书中所 涉及的案例讲解,作者都在AMD的APU上逐一编写验证过。本书介绍了 完整的OpenCL编程模型,同时结合相关的知识、体系结构,形成一个 完整的编程知识体系,非常适合工程师阅读和参考,尤其是对正在开 发项目的工程师来说,一边阅读,一边动手实践,结合自己的项目实 施,一定可以很快掌握。该书也推荐给对异构计算有所耳闻,希望了 解它,以借力快速打开异构计算之门和实践的技术爱好者,本书可以 帮助他们在计算编程领域更上一层楼。 最后对几位作者在工作之余付出的极大热情和心血表示感谢!欢 迎体验异构计算之旅。 楚含进 AMD(中国)异构计算技术总监
Page
8
前言 为什么要写这本书 2007年NVIDIA发布CUDA,正式开启了利用GPU作为大规模数据并行 计算的时代。而最近几年GPU计算已经完成了从实验室、研究所的研究 对象到产业界提高生产力的实际工具的转变。但是NVIDIA的CUDA并没 有得到其他厂商支持,CUDA代码并不能在其他硬件厂商的产品上运 行,而在实际中,用户更希望代码能够同时在多个平台上运行,以减 少编码和优化代价。 2008年,在苹果公司将自己撰写的OpenCL草案开放给Khronos Group(开放标准组织)之后,Khronos Group在6个月的时间内发布了 OpenCL 1.0标准。这不仅引起了像Intel、NVIDIA、AMD这类传统CPU和 GPU处理器厂商的关注,而且还吸引了像TI这类做DSP的公司,以及 Altera这类做FPGA的公司。因为OpenCL将基于GPU的高性能计算概念做 了更广范的延展,从NVIDIA扩展到几乎所有的硬件厂商,从GPU扩展到 CPU、DSP和FPGA等,从高性能计算集群扩展到云、桌面和移动,我们 称之为异构并行计算,而GPU计算是异构并行计算的一种。 目前,即便是CPU也能通过OpenCL实现其内部的SIMD操作,从而能 达到更快速的数据处理。程序员通过OpenCL这样的编程工具就能达到 加速原来数据密集型代码的目的,而无须过多关注底层的硬件特性(如 指令集架构等)。OpenCL给程序员带来了标准、统一的接口来实现任务 级并行以及数据级并行的算法处理。 由于目前OpenCL编程环境最为成熟的还是AMD的APP和NVIDIA的 CUDA,因此本书主要基于AMD APP和NVIDIA的CUDA编程环境描述,考虑 到移动端对OpenCL的支持也越来越多,尤其是ARM的Mali GPU已经引入
Page
9
了广泛的OpenCL支持,因此本书会简略介绍OpenCL在Mali GPU上的编 程和优化。 由于OpenCL标准本身阅读起来比较晦涩,很多概念也没有完全解 释清楚,因此我们写这本书的目的是以更简洁、通俗的语句来表达 OpenCL中的各种概念,以及各种API、各种语法的使用,使读者更易理 解。同时加入了很多代码示例以及图表以进一步帮助读者加深对这些 概念的理解。另外,在写这本书的时候OpenCL 2.0标准已经发布将近1 年了,我们这本书也以最新的OpenCL 2.0标准为主,给读者呈现当前 最先进的OpenCL技术。本书对OpenCL 2.0中所新引入的SVM机制、管 道、原子操作等概念有着非常深入的描述,并且结合大量示例进行剖 析。 读者对象 由于移动处理器和GPU已经非常便宜,而异构并行计算是未来的趋 势,所有IT行业的从业者都应当收藏、阅读本书,以增加对OpenCL的 了解。笔者认为下列人员更应当阅读本书: 互联网及传统行业的IT从业者; 希望将应用移植到移动处理器或GPU的开发人员; 对向量化和并行化感兴趣的职业工作者; 大中专院校、研究所的学生及教授。 如何阅读本书 本书大致的目录结构如下: 第1章主要介绍并行计算的发展历程以及OpenCL在其中所扮演的角 色; 第2章和第3章介绍了OpenCL的大体概念以及它在主机端上API的功 能和说明; 第4章和第5章主要描述OpenCL C语言的概念以及相关语法点;
Page
10
第6章对OpenCL整个同步机制做了一个总结性的整体深入介绍,从 主机端的事件同步到内核程序的原子操作,每一种同步方式都做了非 常详细的介绍; 第7章详细描述了OpenCL与OpenGL之间的交互; 第8章介绍了当前OpenCL各大实现厂商对OpenCL的各自硬件实现, 同时也讲解了各种不同硬件平台上如何有针对性地对OpenCL程序做进 一步优化; 第9章和第10章通过几个实际例子为读者展示了OpenCL的优化实践 以及在实际工程项目中的使用技巧。 阅读本书的读者应当对C编程语言有一定程度的理解,最好同时能 熟悉基本的计算机体系结构方面的理论知识。当然,考虑到很多工程 学、经济学等方面的专家对计算机相关的理论知识掌握有限,而且此 类读者往往更偏向于OpenCL工具的运用,因此我们建议这类读者可以 略过整个5.6节以及整个第8章。虽然本书尽可能通俗而又简洁地去介 绍大部分OpenCL 2.0标准中所涉及的概念,但是很多概念没有一定基 础仍然会比较难以理解,因此读者在遇到这样的概念时可以先实践, 然后慢慢消化。 勘误和支持 由于笔者的水平有限、工作繁忙、编写时间仓促,而异构并行计 算领域正在高速发展中,OpenCL的标准内容也越来越多,笔者虽已努 力确认很多细节,但书中难免会出现一些不准确的地方甚至是错误, 恳请读者批评指正。另外,由于我们目前手头上支持OpenCL 2.0标准 的设备有限,本书中难免还会有一些错误、瑕疵。读者若发现一些明 显的错误或者对我们书写的内容有任何疑问、建议,欢迎与我们一同 讨论。我们的联系方式为:ly152832912@163.com。 书中有些完整的工程代码可在以下地址下载:www.hzbook.com。 致谢 本书能够出版不仅仅出自我们自己对OpenCL的热情和执着,在这 里我们还要感谢机械工业出版社华章公司高婧雅对我们的大力支持,
Page
11
没有她,我们也不会想到要编写此书。 感谢赵成龙(网名龙猫)认真帮我们审查草案,以及对草案细节的 校正。在此书成书的过程中,如果没有赵成龙的无私帮助,本书可能 会晚半年出版。 感谢AMD大中华区软件合作及解决方案高级经理时昕对整本书的审 阅,时总不但名字与时俱进,技术能力也与时俱进,有点让我们这些 一线的程序员汗颜了;我们还要感谢AMD(中国)有限公司免费为我们提 供实验设备。 感谢家人对我们写作的支持,感谢他们容忍了我们晚上加班回家 后,还要在电脑前写作! 谨以此书献给我最爱的家人,以及众多热爱异构并行计算的朋友 们!愿你们快乐地阅读本书! 风辰
Page
12
第1章 异构并行计算的过去、现状和未来 在正式进入本章的主题前,先让我们重温一下异构并行计算的概 念。异构并行计算包含两个方面的内容:异构和并行。异构是指:计 算单元由不同的多种处理器组成,如X86 CPU+GPU、ARM CPU+GPU、X86 CPU+FPGA、ARM CPU+DSP等。并行是指:要发挥异构硬件平台的全部性 能必须要使用并行的编程方式。这通常包含两个层次的内容: 1)多个不同架构的处理器同时计算,要发挥异构系统中所有处理 器的性能,可通过并行编程使每个处理器都参与运算,避免处理器闲 置。相比于只让某一种类型的处理器参与工作,这种方式提高了性能 上限,简单举例来说,在X86 CPU+GPU平台上,X86 CPU的计算能力为 1TFLOPS,GPU的计算能力为4TFLOPS,如果只使用GPU,那么最大可发 挥的性能是4TFLOPS,而如果加上X86 CPU,则最大可发挥的性能是 5TFLOPS。 2)每个处理器都是多核向量处理器 ,这要求使用并行编程以 发挥每个处理器的计算能力。通常每个处理器包括多个核心,每个核 心包含一个或多个长向量,如AMD GCN GPU中就包含数量不等的核心, 每个核心包含4个向量,每个向量能够同时处理16个4字节长度的数 据。如果没能很好地并行,则可能不能完美地发挥多核和向量化的性 能。 作为本书的开篇,本章将主要介绍异构并行计算的历史、现状和 未来: 1)异构并行计算的历史。即在异构并行计算出现之前,处理器是 如何提升性能,使用了哪些提升性能的方法,这些方法为什么又遇到 困难了。读史使人明智,通过了解异构并行计算的历史,读者可以了
Page
13
解到为什么异构并行计算会大行其道,也了解了为什么笔者会编写本 书。 2)异构并行计算的现状。今天异构并行计算已经得到充分的发展 并且还在进一步快速发展中,OpenCL和其他的异构并行计算工具已经 应用到许多图像处理、视频处理及科学计算项目上,而这些工具自身 也在快速进化中。近两年,许多科学计算以外的行业和领域(如互联网 行业)正在应用异构并行计算来加快研究和产品化的步伐。 3)异构并行计算的未来。计算的未来是异构并行的,异构并行的 概念、应用在计算机及相关领域会越来越广。任何参与计算机及相关 行业的人员都应当了解并学习异构并行相关的内容。在不久的将来, 不懂异构并行计算就意味着不懂计算机。 在具体介绍异构并行计算的历史、现状和未来之前,笔者想介绍 几个始终贯穿本书的相关概念: 1)向量化。向量化是一种一条指令同时处理多个数据的方法,从 这一点来说,它是一种数据并行技术。主流的向量化技术有两种: SIMD(Single Instruction Multiple Data,单指令多数据)和 SIMT(Single Instruction Multiple Thread,单指令多线程),大多 数CPU(如AMD Zen处理器)都使用SIMD向量化技术,而大多数GPU(如AMD GCN)都使用SIMT向量化技术。关于SIMD的具体描述请参看图1-1。
Page
14
图1-1 向量化示例 SIMD操作可简单描述为一些具有如下特点的操作:对两个长向量 寄存器中的数据按元素进行操作,结果向量寄存器和源向量寄存器长 度相同。例如,对两个长度为512位的向量进行SIMD操作,按照单精度 进行浮点加操作,假设单精度浮点类型占用空间大小为4个字节,那么 512位向量可一次同时处理16(512位/8位每字节/4字节)个单精度浮点 数据得到16个结果,其中第一个向量的第1个元素和第二个向量的第1 个元素相加产生结果向量的第1个元素,第一个向量的第15个元素和第 二个向量的第15个元素相加产生结果向量的第15个元素,其余类推。 2)多核。多核是指:在一块芯片上,集成多个处理器核心,这多 个处理器核心共享或不共享缓存层次结构。图1-2是ARM公司设计的ARM Cortex-A72多核处理器,从中可以看出其最多具有4个核心(为了应对 不同细分市场的需求,ARM处理器核心数量通常可调整),每个核心具 有32KB一级数据缓存(L1 Cache),48KB一级指令缓存,4个核心共享 512KB到2MB二级缓存(L2 Cache)。多核处理器通常会共享主板上的物 理内存。
Page
15
3)多路。硬件生产商会将多个多核处理器互联(如AMD的HT(Hyper Transport)总线)在同一个主板上,各个多核处理器之间通常共享缓存 (如三级缓存或eDRAM)或内存来交换数据。由于主板的设计会导致 NUMA(非一致性内存访问)特性,感兴趣的读者可参考刘文志(花名风 辰)的著作《并行算法设计与性能优化》 中的2.6节。 图1-2 ARM Cortex-A72多核向量处理器架构 多核和向量化是现代处理器提升性能的两种主要途径,今天的绝 大多数处理器都已经是多核向量化处理器。在介绍为什么多核或向量 化处理器如此流行之前,先让我们了解一下之前的单核标量处理器遇 到了什么问题。 1.1 单核标量处理器的困境
Page
16
在2005年之前,大多数处理器都是单核的,一些处理器已经开始 支持向量化(如X86处理器支持的MMX(多媒体扩展)和SSE(流式SIMD扩 展)指令集),但是绝大多数应用程序并没有进行向量化,故绝大多数 代码只能利用到单核处理器的标量性能。对于单核标量处理器(或者运 行在单核向量处理器上的标量代码)来说,处理器生产商只能考虑如何 提升单核标量处理器的性能。处理器生产商通过提升单核标量处理器 的频率和指令级并行处理能力(即提升指令流水线性能)来提升处理器 的计算性能,如图1-3所示。 从图1-3中可以看出,在2005年之前,单核标量处理器的性能基本 上是每18个月近似提升一倍,这称为摩尔定律。关于摩尔定律有许多 不同的表述,也有一些表述上的不同和争议,本节就不追究其原因和 细节,只简单地称“单核标量处理器性能每18个月提升一倍”为摩尔 定律。 在2005年之前,单核标量处理器性能提升能满足摩尔定律的时期 称为提升软件性能的“免费午餐”时期,因为单核标量代码的性能可 以满足摩尔定律描述的速度提升,在这个前提下,应用程序无须修 改,只需要等待下一代处理器的推出,到时现在的代码自然就能够跑 得更快。处理器生产商、研究人员和软件开发人员都非常高兴且享受 摩尔定律带来的成果: 1)对处理器生产商来说,能够稳定地推出性能更好的产品能够帮 助他们顺利推动产品的更新换代,卖出更多新产品,淘汰旧产品,获 得更多利润。处理器生产商获得了更多利润就能够进一步增加研发投 入,以推出性能更好的产品。对处理器生产商来说,这是一个良性循 环。 2)对研究人员来说,他们基于当前处理器的计算能力来设计应 用,获得研究结果,并依据摩尔定律来估计下一代处理器能够提供的 性能,设计在下一代处理器上能够快速运行的应用。在下一代处理器 推出后,就可以获得更好的结果。 3)对软件开发人员来说,无须花费太多精力来优化程序性能,只 需要建议老板购买新硬件即可获得性能提升。 4)在这种处理器生产商和软件开发人员相互促进的良性循环下: 软件开发人员依据当时处理器的性能设计应用,并依据摩尔定律对下
Page
17
一代处理器的性能提出预期(设计在下一代处理器上能够流畅运行的应 用),处理器生产商生产新处理器以满足摩尔定律对性能的要求,并将 新处理器卖给软件开发人员,周而复始,相互促进。 图1-3 处理器频率、性能、功耗和核数变化 Original data collected and plotted by M.Horowitz, F.Labonte,O.Shacham,K.Olukotun,L.Hammond and C.Batten Dotted line extrapolations by C.Morre 在2005年之后,单核标量处理器的性能基本上达到顶峰,很难进 一步大幅度(超过10%)提升性能。在回答为什么单核标量处理器的性能 无法接着以摩尔定律要求的速度提升之前,先让我们看一下,在2005 年之前单核标量处理器如何提升性能,因为只有知道之前如何提升性 能,才能知道为什么不能以同样的方式接着提升性能。 1.1.1 单核标量处理器如何提高性能
Page
18
在2005年之前,单核标量处理器以近似摩尔定律的方式提升性 能,其主要通过以下几种方式提升性能: 1)提升处理器的时钟频率:处理器的时钟频率表示处理器1秒内可 以运行多少个基本操作,这些基本操作需要一个时钟周期运行。在某 个固定的处理器上,一些复杂的操作可能需要多个时钟才能执行完 成,或由多个基本操作组成。一条指令从开始到执行完成所需要的时 钟周期数,称为指令的延迟。一个具体的操作在不同的处理器上,其 所花费的时钟周期数量可以相同,也可以不同。通过提升某个单核标 量处理器的时钟频率,在指令的延迟保持不变的前提下,处理器1秒内 就可以执行更多的基本操作,这提升了处理器上运行的所有指令的执 行速度。 2)提升指令级并行能力:单核标量处理器上具有许多不同的部 件,每个部件执行不同的指令操作,如有的部件负责从内存中加载数 据,有些部件负责计算乘加指令,一些部件负责计算内存地址。如果 能够让多条做不同动作的指令同时操作,那么多个部件就可以同时进 行指令操作,这称为指令级并行。如果在一个处理器上,能够同时操 作3条指令,在提升指令级并行能力后,它可能能够同时处理多达5条 指令。提升指令级并行能力并没有减少某条指令的延迟,但是它提升 了处理器能够同时处理的指令数量。 在“免费午餐”时期,通过提升处理器的时钟频率以大幅度提升 性能,如图1-3中的绿线 所示。而通过将一条指令拆分成多个阶段 以提高指令级并行能力已得到广泛使用,关于为什么将一条指令拆分 成多个阶段能够提高处理器的性能,以经典的5阶段流水线为例,请参 考图1-4。
Page
19
图1-4 流水线示例 五阶段流水线将指令的执行过程划分成:取指令(Instruction Fetch,IF)、指令解码(Instruction Decode,ID)、执行 (Execution,EX)、访存(Memory Access,MEM)和写回(Write Back, WB)。同时假设处理器支持两条流水线同时操作。在开始执行时(t0), 有两条指令(i0,i1)在取指令;在t1时,指令i0、i1在解码,而两条 新指令i2、i3可以进行取指令操作;在t2时,又有两条新指令i4、i5 进行取指令操作,而此时指令i2、i3进行解码操作,而指令i0、i1正 在执行;在t3时,又有两条新指令i6、i7进行取指令操作,而此时指 令i4、i5进行解码操作,而指令i2、i3正在执行,指令i0、i1正在访 存;在t4时,又有两条新指令i8、i9在进行取指令操作,而此时指令 i6、i7进行指令解码操作,指令i5、i4正在执行,指令i2、i3正在访 存,指令i0、i1正在写回,写回结束后,指令i0、i1就完成了,以此 类推,在随后的每个周期内,都会有两条指令执行完成,两条新指令 加入执行。从整体来看,若没有使用流水线执行,则原来需要5个周期 才能完成2个操作,而使用流水线执行后,则每个周期能够完成2个操 作。 要完全利用硬件指令流水线的所有性能,程序代码需要提供足够 多样(不同种类)的指令,编译器需要从源代码中获得足够多的信息以 安排流水线获得最好性能。另外,不是所有的指令都需要执行硬件指 令流水线的所有阶段,现代处理器采用了许多不同的办法来处理这个 问题。这里就不展开讨论这些问题了。
Page
20
在介绍完单核标量处理器如何提升性能之后,我们接着来了解单 核标量处理器无法继续以摩尔定律的速度提升性能,即为什么单核标 量处理器性能到达瓶颈。 1.1.2 为什么单核标量处理器性能到达瓶颈 1.1.1节提到,在2005年之前,提升单核标量处理器性能以满足摩 尔定律描述的速度提升,而在2005年之后,单核标量处理器的性能不 能再以摩尔定律的速度提升,这主要是因为: 1)功耗限制了频率的继续提升:从物理定理来看,随着处理器工 艺制程的推进,处理器的最大功耗(主要是漏电功耗)越来越大,大致 来说处理器的功耗和处理器的频率的三次方近似成正比(硬件设计实践 中有许多方法降低指数,具体细节请读者参考相关著作,笔者就不详 细解释了),这意味着随着处理器频率的增加,处理器功耗会大幅度增 加。处理器功耗增加,则处理器工作时越来越热,对散热系统的要求 会越来越高。而今天散热系统已经从风冷、散热片、水冷到油冷。在 处理器散热要求已经达到现实环境、技术能够满足的界限情况下,如 果再增加频率,那么硬件组件可能不能正常工作,甚至烧掉。 2)提升指令级并行遇到瓶颈:指令级并行能够让处理器的多个不 同的流水线组件同时工作。如图1-4所示,在一条指令取指的阶段,另 外一条指令正在解码,与此同时其他的指令正在计算、写回存储器 等。指令级并行能够增大处理器组件的利用率,极大地提高处理器的 性能。但是要利用好处理器的指令级并行能力需要代码优化人员、编 译器作者和处理器设计师共同努力。处理器设计师在硬件层次提供了 重排缓冲区(Reorder Buffer,ROB)、发射队列(issue queue)和寄存 器重命名单元(register renaming)等来挖掘指令执行时的不相关性。 硬件层面的支持能够挖掘出软件层面不知道的信息,如是否存在存储 器别名。编译器作者要让编译器合理安排生成的指令,尽量让生成的 指令没有依赖性,或者让依赖指令的距离足够远,合理重用寄存器 等。代码优化人员需要以编译器和处理器友好的方式编写代码,以便 编译器生成处理器能够高效执行的代码。为了提高硬件的指令级并行 执行能力,处理器设计通常会增加硬件流水线的级次,而现在这一方 法也达到其局限。
The above is a preview of the first 20 pages. Register to read the complete e-book.
AI Reading Assistant
Whole-book reading guide from stratified index samples; jump to passages in the text
No reading guide yet. Generate it on the full detail page, and it will appear here automatically.
Generate guideRecommended for You
{{#thumbnailUrl}}
{{/thumbnailUrl}}
{{^thumbnailUrl}}
{{/thumbnailUrl}}
Loading recommended books...
Failed to load, please try again later
Tip the Site
Scan the WeChat Pay or Alipay code to tip. No login required.
WeChat Pay
Alipay