论文部分内容阅读
由于具有不同的结构特点,使得CPU和GPU组成的异构系统能够更有效地处理通用计算任务。与CPU相比,GPU专注于提高需要更多的计算资源和存储带宽的数据并行任务的执行效率,具有更复杂的存储层次,且地址空间与CPU分离,使得为CPU-GPU异构系统设计的编程模型仍然具有一些不尽如人意的地方,比如编程方式较为复杂;需要对底层硬件架构有深刻的理解才能写出优化的程序;程序的可移植性较差等。本文围绕CPU-GPU异构系统编程模型的这几个问题,研究了异构系统上的编程模型和优化实现技术,分别从异构系统上编程模型的易编程性和可移植性以及最终程序在异构系统上的性能优化技术和运行时技术等方面展开研究。本文的研究内容和成果如下:(1)研究了程序对制导语言表达能力的需求,提出了制导语言所必须具备的最小功能集合,并以OpenHMPP制导语言为例进行了合理地扩展设计。由于已经有多种解决异构系统上易编程性和可移植性方案被提出,所以我们首先研究了不同类型的解决方案的优缺点,论证了基于制导语言的编程模型的优势,并提出了为异构系统设计的制导语言所应该具备的最小功能集合。然后我们以OpenHMPP作为基础,研究其表达能力,并进行最小化地扩展设计,形成了新的制导语言OpenHMPP+,以其作为我们的源语言,为CPU-GPU异构系统上的编程提供易编程性和可移植性。(2)提出了一个优化的源到源编译框架,将OpenHMPP+制导语言编译成优化的CUDA语言。通过高层制导语言提供易编程性和可移植性,以及在编译器中实现多种优化技术来提供理想的性能,实现一个同时具备易编程性、可移植性和性能的编程模型。由于在实现的过程中需要用到多种优化技术以及各种辅助技术,所以如何合理地安排这些技术,使得他们能够完美的协作也对最终代码的性能有着较大的影响。(3)研究了编译器实现中的一些相关技术,并提出了相应的实现算法。提出了伪依赖消除算法,用于增加Cetus的循环并行性检测算法的适用性;提出了从多级并行循环到CUDA线程模型的映射算法,以最大化地利用检测出的循环并行性;提出了减少数组访问的重用距离的算法,以减少计算核心中总的重用距离并为将数据加载到片上高速存储器中提供条件;提出了计算核心启动配置选择算法,使得在并行性较小的情况下多个SM可以获得尽可能相等的计算量,以达到负载平衡;提出了运行时CPU-GPU计算管理技术,同时为多核CPU和GPU生成计算核心,使得程序可以在没有配备支持CUDA的GPU的系统上或者在显存容量不足的情况下自动地切换到多核CPU上并行的执行,合理地利用了制导中的并行性信息。(4)设计了实验对提出的源到源翻译框架进行评测。从不同的领域选取了15个程序在两个不同的平台上进行了评测。结果显示,编译器自动生成的代码在不同的平台上都能取得较好的性能,在不同的程序和输入集合大小下,平均性能可以达到手写CUDA版本的70%以上。在研究CPU-GPU异构系统上的编程模型以及给出优化实现的过程中,我们得到了一些重要的结论。首先,在算法具备并行性的前提下,当今的编译器只需要少量的信息,如并行区域的位置、并行区域中循环的并行性信息,就可以生成一个可以在异构系统上正常执行的程序。其次,将程序对显存的访问转换成符合合并访问规则的形式和利用程序中的数据重用性是两个应用广泛并有效的优化。对程序的最终性能起着至关重要的作用。最后,L2Cache的加入能够加速部分程序的执行,但是需要一个能够更有效地应对流应用的替换算法。大部分流应用中线程对寄存器的需求较小,但是仍然有部分应用需要较多的寄存器数目,更大的寄存器编址空间将会使这部分程序受益。