Share E-Book

OpenCL异构并行计算:原理、机制与优化实践 (刘文志, 陈轶, 吴长江) (z-library.sk, 1lib.sk, z-lib.sk)

Author 刘文志, 陈轶, 吴长江

c
Language Chinese

No Description

Format PDF
Size 10.1 MB
1
Views
0
Downloads
0.00
Total Donations
(First 20 pages)

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.

Recommended for You

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
Back to List