论文部分内容阅读
SIMD扩展部件以其实现成本低、部件功耗少、计算效率高等特点,逐渐成为高性能计算机的必备计算加速部件,其应用领域也从最初的多媒体处理,扩展到科学计算、信号处理、密码分析等领域。由于向量指令与底层硬件关系密切,编程人员很难写出正确高效的SIMD代码,因此用编译器实现程序的自动向量化成为必然选择。目前 Open64、Gcc、ICC和LLVM等主流编译器都实现了自动向量化功能。SIMD扩展部件具有特殊的硬件结构和并行计算方式,为了适应复杂的应用并获得更好的加速效果,SIMD在指令功能和并行宽度方面一直在不断地发展和改进。然而,面向SIMD的自动向量化方法在识别能力和优化效果方面仍然存在一些不足。为了加强向量并行识别能力,进一步发掘和优化程序中的向量并行性,本文在向量并行发掘方法及其优化技术方面进行了系统深入研究。 本研究主要内容包括:⑴提出了一种基于循环分段的嵌套循环向量化方法 simdcodegen。该方法首先分析了依赖环形成的原因,并讨论了循环分段对于消除依赖环的作用。然后在codegen的基础上,将循环分段逐层地应用于多层循环,实现了嵌套循环的向量化。虽然循环分段总是合法的,但进行分段后会带来执行代价的增加,本文设计了循环分段的有利性测试方法,来避免无效分段的实施。⑵提出了一种分段约束的SLP发掘路径优化算法。循环展开后每次迭代对应的展开单元称为一个段。本文采用分段的冗余删除方法,来保证冗余删除后段的同构性;采用了“相邻-段间”的SLP发掘方法,来约束发掘路径的范围。由于“分段冗余删除”较“全局冗余删除”保留了部分冗余的访存操作,打包后生成的向量代码往往存在访存重叠的情形,存在进一步优化空间。本文针对此情况引入了SIMD访存优化调整方法,以数据重组指令来替代重叠的向量访存指令,有效提高了程序执行效率。⑶提出了一种循环级与基本块级结合的向量化方法。该方法分析了上述两种方法适用范围,同时对程序中可能存在的向量并行特征进行分类,根据不同类别的并行特征确定了向量化任务分配方案,最后设计了混合的向量化框架来实现这种任务分配方案。为了明确目标循环并行性特征,本文给出了循环迭代间和迭代内的向量并行性检测方法。⑷提出了一种非满载使用SIMD指令的方法。研究了向量寄存器的非满载使用方式,设计了对应的非满载向量操作,实现了NEI_LOOP的向量化,然后将非满载的向量化方法用于一般循环的向量化。由于非满载的向量操作需要额外的代价,向量化并不总是有益的,因此文章同时提供了收益分析算法,仅对收益大于零的程序实施向量化。该方法不仅可以实现NEI_LOOP向量化,同时还可以解决向量化过程中的大部分非规则访存问题,如跨幅访存,一般的非连续访存等等,基本思想就是向量寄存器的非规则使用。⑸提出了一种面向部分向量化的循环分布及聚合方法。为了解决循环开销过大的问题,需要在保证循环向量并行性的基础上尽可能进行循环合并,因此提出一种面向最大聚合的拓扑排序方法,使得无环结点尽可能相邻,有环结点也尽可能相邻,最终可聚合得到尽可能少的循环。为了解决数据重用问题,设计了一种基于数据重用的凝聚图节点聚合优化方法,从寄存器重用和cache重用两方面给出了优化方法,有效增加了循环中数据复用频度。