近年来,GPU(Graphics Processing Unit,图形处理单元)已被成功地应用于生物医学、金融分析、物理模拟、数据库处理等高性能计算应用,大大扩展了GPU的应用领域。人们也将这类用于图形渲染以外领域的GPU称为GPGPU(General-purpose computation on GPU)。
GPU结构的复杂性大大超出了现有的多核处理器,这使得人们很难有效利用其众多的计算资源。以NVIDIA公司推出的CUDA(Compute Unified Device Architecture,统一计算设备架构)为代表的面向GPU的编程模型在一定程度了解决了这一问题。与已有的编程模型相比,CUDA做出了两点改进:一是采用了统一处理架构,二是引入了片内共享存储器,使得其更加适合GPGPU体系结构。然而,由于CUDA模型中采用的多级线程结构以及多级存储结构,程序员必须深入理解并掌握CUDA的结构与特点才有可能开发出高度并行的应用,这无疑增加了程序员的负担。
本文提出并实现一种能够减轻程序员负担的源到源编译框架,它不仅能够以较高的自动化程度生成能够在CPU+GPU混合结构上运行的代码,还可以完成一定的优化,提高代码的并行度。
本文的研究工作和成果有:
1.提出并实现了一个面向CUDA模型的编译框架ICuda该框架能够自动地将串行C代码直接转换为CUDA C代码,实现已有C程序向GPU平台的自动迁移。ICuda能够将程序员从GPU和CUDA的结构细节中解放出来,提高编写高性能并行程序的工作效率。与大多现有框架只适用于以行列式或矩阵计算为主的应用程序相比,ICuda架构则能够面向通用应用程序。
2.提出了循环结构并行化代码调度方法将串行代码中的循环结构进行并行化处理,程序的数据结构以及代码结构需要进行一定的变换,以适应面向GPU结构的编程模型,充分发挥GPU结构的性能优势。针对上述问题,本文提出了数据下标变换、共享变量分布式访问两种面向循环结构的并行化代码调度方法。前者用于代码并行化之前,变多重循环结构为单重循环结构,简化循环索引变量;后者用于代码并行化之时,变共享变量的集中式访问为分布式访问,减小线程访存开销。
3.提出了一种面向CUDA存储模型的访存优化方法CUDA编程模型提出以来,针对全局存储器空间的结合式访存优化方法就一直是研究的重点。本文充分利用CUDA存储模型提供的多级存储架构,规避这种复杂的针对全局存储器访问的优化,提出了以纹理存储器为主、共享存储器与寄存器为辅的存储布局优化策略,以简单、高效的方法实现CUDA存储模型的访问优化。
本文基于SUIF2平台实现了ICuda编译框架,并针对Parboil基准程序包进行了详细的性能测试与分析。实验结果验证了本文所提出的优化方法与ICuda框架的有效性。