论文部分内容阅读
随着信息技术的不断发展,计算机需要处理的数据量和任务量日益增多,为了提高计算机程序的运行速度,越来越多的公司、科研机构开始通过结合中央处理器(CPU)和图形处理器(GPU)的技术设计高性能的并行应用程序。近年来,GPU已经广泛部署在数据中心、高性能计算中心等大型计算集群中,许多智能手机、自动驾驶汽车、智能摄像头等嵌入式设备也集成了GPU。NVIDIA、AMD等GPU厂商提供了CUDA、OpenCL等GPU编程平台和语言,让用户能够更加方便地编写GPU并行程序。但由于GPU与CPU的体系结构存在较大差异,编写高性能的GPU程序往往需要一定的经验和优化技巧,这使得普通用户编写的程序往往还有较大的优化空间。为了充分利用深度学习、数据挖掘等场景中常见的数据稀疏性,本文对面向稀疏数据的GPU程序优化技术进行了深入的研究。本文首先提出了一种面向稀疏数据的GPU程序优化思路,主要包含立即数替换和稀疏常量优化两种策略,通过对基于源代码、目标代码进行程序优化的过程进行分析,阐述了基于目标代码的程序优化方法的优势。为了在目标代码层次进行稀疏数据的替换,设计了一种基于模板的立即数替换方法,通过在源代码中设置模板数据的方式实现稀疏目标代码的生成。利用稀疏常量优化的思想,分别设计了基于PTX的稀疏目标代码优化方法和基于cubin的稀疏目标代码优化方法。为了充分发挥两种稀疏目标代码优化方法的优势,本文构建了GPU程序优化的性能模型,对优化方法的开销和收益进行分析,进而指导GPU程序优化的过程。本文提出了一种基于图模型的GPU程序形式化描述方法,将GPU程序用嵌套的有向无环图(DAG)来表示,进而对GPU程序中存在的动态优化机会进行分析,并设计了相应的算法对GPU程序每个部分的可隐藏优化时间进行计算。在以上工作的基础上,本文提出了一套面向稀疏数据的程序优化框架,该框架将GPU程序转化为程序执行图,使用基于PTX目标代码的程序优化方法对程序进行静态优化,使用基于cubin目标代码的程序优化方法对程序进行动态优化,使用性能模型指导框架选择合适的优化策略。在实验部分,本文以经典的Le Net-5网络结构为例,对深度学习场景中存在的稀疏数据优化机会进行了分析,构建了LeNet-5网络训练过程和预测过程对应的程序执行图,并阐述了如何在深度学习场景中应用优化框架对其训练和预测过程进行优化。为了验证程序优化方法的性能,本文从主流的LeNet、Alex CIFAR-10和ResNet等网络结构中选取了典型的卷积操作分别对基于PTX目标代码的程序优化方法和基于cubin目标代码的程序优化方法的优化性能进行了测试。实验结果表明:使用本文设计的GPU程序优化框架进行优化的卷积操作在动态优化场景下的性能最高可达业内公认的高性能库cuDNN中卷积操作的1.6倍,静态优化场景下的性能最高可达cuDNN中的卷积操作的6.9倍,优化的卷积操作与稀疏矩阵高性能计算库cuSparse相比有着10~70倍的性能优势。本文的程序优化框架有着显著的性能优化效果且具有通用性,能够广泛应用在数据稀疏的场景中。