论文部分内容阅读
传统的单核体系结构由于受到其物理结构设计方面的阻碍,已经难以满足人们对性能的需求,而多核及众核体系结构已经逐渐的成为了当今主流的计算机体系架构。因此,OpenCL作为第一个主要面向多平台异构系统结构的并行编程标准受到了人们越来越多的青睐,而且OpenCL还是一种免费、开放的标准,为用户提供了方便易用的编程接口。但是,OpenCL程序通常比较复杂,开发难度也较大,对开发人员的能力要求也较高。因此本文设计并实现了一个OpenMP-to-OpenCL代码自动转换工具来解决该问题。本文的主要贡献可分为如下三点:1、首先研究分析了OpenMP、OpenCL并行编程标准的相关特性,包括模型架构特点、语言标准规范特征及并行代码优化方法等,总结出OpenMP程序和OpenCL程序之间的关联关系及转换过程中需要解决的技术难点问题。2、对Clang编译器的设计框架结构、内部库函数功能及抽象语法树的内部中间表示进行了详细的分析研究,并在Clang编译器的基础之上完成了OpenMP-to-OpenCL代码自动转换工具的框架结构的搭建工作,即增加OpenMP-to-OpenCL代码转换功能的编译选项-omp2gpu,同时不改变编译器原有功能。3、通过使用源源编译技术、程序分析技术等完成OpenMP程序到OpenCL程序的源源转换。源源转换的核心思想主要是将OpenMP程序中for循环映射成为OpenCL Kernel函数的执行代码,将for循环循环变量映射为Kernel函数线程索引变量等。在具体实现过程中,使用程序分析技术对涉及到的变量进行分析,进而完成OpenCL kernel函数参数及OpenCL内存传递函数代码部分等。此外,为了生成高性能的OpenCL程序,本文通过分析相关代码段中变量的左右值属性来确定其所对应的数据在CPU内存与GPU内存直接的数据传递属性,减少不必要的内存传递代码生成,从而生成高性能的OpenCL代码。最后本文在NVIDIA Tesla C2050GPU、NVIDIA GeForce GTX TITAN GPU、AMDPitcairn GPU三个不同的GPU计算平台上对通过该代码自动转换工具转换生成的多个OpenCL代码实例进行了测试。然后分别从该转换工具的功能、生成OpenCL代码执行性能及在多平台可移植性等多个方面对其进行测试。测试结果说明,该工具不仅能够正确的将OpenMP代码转换为OpenCL代码,而且生成的代码可读性较高,而且在多款GPU设备上均可获得较高的并行加速比。因此,本文所设计的OpenMP-to-OpenCL代码自动转换工具不仅能够很好的解决OpenCL代码开发困难等问题,而且生成代码效率高、可读性好,能够大大的降低程序员的工作量,同时能够帮助那些无法靠自身能力完成从OpenMP代码到OpenCL代码的转换的程序员,为解决遗留OpenMP代码转换问题提供了一种切实可行的方案。