论文部分内容阅读
SIMD体系结构不断发展,其向量寄存器变得越来越长。如何在使用向量指令时利用更先进的SIMD单元获得更高的性能收益成了应用开发者和编译器实现者研究的重点内容之一。编译器自动向量化是开发SIMD性能的重要途径之一。典型的产品化编译器都实现了自动向量化支持,随着SIMD体系结构的发展和编译优化技术的进步,编译器的自动向量化技术仍是学术研究和工程实现的热点。本文基于架构先进的LLVM编译器,针对更长向量长度的SIMD体系结构,研究循环向量化技术。LLVM循环向量化依赖编译器中许多其他的分析和优化,在向量化之前要分析程序的数据流和控制流信息、循环向量化合法性和向量化收益。此外为了使向量化时循环有统一的结构,还需要简化循环结构。LLVM向量化时为了获得更多ILP优化机会,会结合循环展开优化来实现。在循环体的标量指令中,只有部分指令能够向量化,剩下的指令只能标量执行,称这部分不能向量化指令为尾循环。本文通过对循环向量化时采取的操作进行分类,提出了基于掩码存取和数据填充方法,针对包含不同指令的尾循环进行向量化。在向量长度增长的情况下,尾循环向量化带来了性能收益。LLVM在处理循环向量化时,不能处理循环尾循环向量化,无法发挥硬件性能,也无法完全利用程序并行性。本文提出了尾循环向量化方法,能够很好解决尾循环无法向量化的问题,可以增强LLVM循环向量化能力,产生更高性能的目标代码。实验结果表明,尾循环向量化生成的代码比原来LLVM向量化生成代码具有更高的性能。在TSVC上测试最高加速比可以达到210%,在SPEC2006上测试可以获得最高5%性能收益。