论文部分内容阅读
随着超大规模集成电路技术的不断进步,单芯片上集成了越来越多的晶体管,目前已达到10亿的量级。然而,受到CMOS工艺特征尺寸的限制,芯片的主频在达到4GHz之后继续提升的空间有限,多核并行逐渐成为提升处理器计算性能,同时也是充分利用丰富的片上资源的主要技术途径。4-8核的通用CPU目前已成为市场主流,而一些专用的处理器如流处理器则包含数十到数百个处理核心。本文选取目前非常流行也极具发展潜力的一种商用流处理器体系结构——GPU(Graphics Processing Unit)展开相关的研究。GPU最初仅用于加速图形计算,因此其结构较通用CPU相对简单,不包含诸如分支预测、乱序执行等耗费芯片资源的复杂逻辑功能,而将晶体管资源更有效地用于增加并行执行的计算核心,以提升计算性能。GPU的峰值计算性能也因此远高于同时期的通用CPU。随着GPU指令级功能的逐步完善以及其编程界面的不断改进,GPU被越来越多地应用到非图形领域的计算,出现了一个全新的研究领域——GPGPU(General Purpose Computation on GPUs)。利用CPU和GPU构建异构并行系统,以CPU提供通用的基础计算环境,GPU作为加速阵列提供强大的峰值计算能力,已成为高性能计算领域一个非常重要的发展趋势。目前,GPU已在高性能计算、桌面计算甚至嵌入式计算等多个领域得到了非常广泛的应用,因此有关CPU-GPU异构系统以及GPU本身的一系列研究课题也得到广泛关注,诸如编程模型、编译优化、可靠性优化以及低功耗优化等等。本课题从编程和编译的角度展开,首先研究了CPU-GPU异构并行系统的编程模型,然后针对GPU的存储访问展开了深入的分析和优化研究,最后给出了所研究模型的编译实现和优化。编程模型是计算系统与程序员之间的界面,是衡量系统易用性的重要指标,其优劣直接影响了系统被用户接纳的程度。近年来面向GPU的编程模型逐步从底层的图形API发展到了抽象级别较高的Brook+、CUDA和OpenCL,正是编程模型的大幅改进促使了GPU向通用计算方向的快速发展。然而,相对于传统CPU而言,GPU的编程环境仍然比较复杂,大量已有的应用难以被有效继承,因而带来了巨大的软件开发和移植的开销。针对这个问题,本文从传统的、已被广泛接受的OpenMP编程模型入手,从并行原语的角度分析其与GPU普遍采用的流编程模型之间内在的可转化性,论证了使用类OpenMP编程模型为CPU-GPU异构结点开发程序的可行性;基于这种思想,我们设计了一种类OpenMP编程模型,在传统的OpenMP模型中添加了一组带有流处理特征的编译指导命令,形成了OpenStream编程模型。随后,本文从存储访问的角度展开GPU的性能分析和优化方法研究。“存储墙”问题是限制GPU发挥的其计算性能的一个重要瓶颈,而cache是一种对于缓解“存储墙”问题具有重要意义的存储层次。早期的GPU中并不包含传统意义上的数据cache,其片上存储层次仅用于缓存与图形处理相关的数据。在面向通用计算的需求驱动下,近年来GPU中开始出现和传统CPU中类似的通用数据cache,因此研究cache的行为及优化方法对于提升GPU的计算效率具有重要意义。为此,本文首先面向GPU这种众核体系结构建立了存储感知的可扩展加速比模型,分析了其性能的可扩展性与存储层次访问之间的关系,从理论上说明了优化核心私有cache的使用对其性能可扩展性的重要性。然后,本文展开对GPU程序cache分析和优化的研究。GPU特殊的程序执行模型使得传统的cache分析和优化方法不能直接应用到GPU上。因此,本文结合GPU核心的执行模型对GPU程序的重用进行了度量,给出重用向局部性转化的条件并给出相应的局部性优化方法;此外,为更精确地对GPU程序的cache行为进行建模,我们基于栈距离图分析方法建立了GPU程序的cache失效分析模型,为未来评估其他GPU cache优化方法奠定了基础。最后,本文讨论了OpenStream编程模型的编译实现问题,将上述讨论的分析和优化方法纳入一个统一的编译框架中并给出一个基本的编译实现。在这个基本实现中,我们重点讨论了一种CPU-GPU异构系统芯片级数据流调度方法,将数据在GPU存储空间内的生存期尽可能延长,充分开发GPU端数据的局部性,从而减少CPU与GPU芯片间的冗余数据通信,提高程序性能。本文的主要创新点包含以下几个部分:1.为解决CPU-GPU异构并行系统编程复杂的问题,分析总结了面向异构并行计算结点的编程模型所需具备的要素,从并行机制的角度论证了OpenMP编程模型与GPU编程模型的内在可转化性,为基于OpenMP扩展的GPU编程模型研究奠定了理论基础;基于OpenMP模型扩展了一组带有流处理特征的编译指导命令,形成了一种新的基于编译指导的CPU-GPU异构并行系统编程模型OpenStream,简化了面向CPU-GPU异构并行系统的程序开发和程序移植过程;2.为指导GPU程序面向片上存储层次的优化,面向类GPU众核体系结构建立了一种存储感知的可扩展加速比模型,分析了GPU性能的可扩展性与片上存储层次之间的关系,从可扩展的角度指出了未来众核体系结构的设计原则和GPU程序面向片上存储层次优化的重心;3.为提高GPU程序的数据局部性,基于经典的重用分析理论,通过对GPU核心程序迭代序的分析,将经典的串行程序的重用和局部性分析方法扩展到GPU的并行执行模型上去,提出了GPU核心程序的局部性量化分析模型;同时根据局部性求解的过程给出了两种优化GPU核心程序数据局部性的方法:重用的迁移和局部性收益优化,有效地降低了GPU程序的cache失效率,提升了程序性能;4.为精确建模GPU程序的cache失效行为,基于经典的cache失效方程和cache冲突分析方法建立了一种精确的GPU程序cache失效分析方法,将cache失效分析问题分解为线程块的栈距离图求解和线程块间的cache冲突分析两个子问题,为GPU程序cache优化方法的有效评估奠定了基础;5.为验证编程模型和优化方法的有效性,设计了OpenStream编程模型的源到源编译框架并给出了一个基本的编译实现;在编译器中实现了一种启发式的通信调度算法,在保持数据一致性的前提下尽可能延长GPU端数据的生命周期,开发生产者——消费者局部性,减少CPU和GPU之间的冗余数据通信。