论文部分内容阅读
随着多媒体应用的日趋广泛,几乎所有的通用处理器厂商都为其处理器增加了多媒体扩展。这些多媒体扩展都利用了多媒体程序中广泛存在的SIMD并行性,从而在指令集上表现为SIMD指令集。为了节约成本,处理器厂商一般都重用现有的处理器资源(数据通路、内存接口等等)来实现这些SIMD指令集。 目前使用这些指令集的主要手段是程序员在编译器的有限支持下,费时费力的手工书写SIMD指令。为了能够让这些指令集被充分利用,我们需要编译器自动的根据串行代码生成SIMD指令(称为SIMD编译优化)。 这种优化和传统的针对向量处理器的自动向量化非常类似。但到目前为止,这方面的研究对于实际的多媒体程序能够取得性能加速的并不多。 本文首先从多媒体扩展指令集和多媒体实际程序两个角度去分析SIMD编译优化的机遇和问题所在。我们发现:在现有的处理器架构下,SIMD指令和其对应的标量指令相比,并不一定具有性能优势。多媒体扩展指令集最能产生性能加速的方面是其对小数据类型运算和多媒体程序中常见但比较复杂运算(多媒体典型操作)的SIMD支持上。 而妨碍SIMD编译优化的是以下几个问题: 1.多媒体扩展指令集和传统向量指令集存在一些根本的不同,从而使得要根据指令支持和性能评估来向量化代码块的语句。 2.多媒体源程序中复杂的代码形式,妨碍了可向量化操作的识别。 3.各种多媒体典型操作的变化多样。以前是通过为每种代码形式准备一个专门的识别模块来实现特定操作(idiom)的识别的。但对于多媒体程序来说,这种方法是不可行的。这是因为:一方面识别模块数量大大膨胀,使得编译器的书写和移植都变得很困难;另一方面,我们很难枚举出所有的可能形式来,所以识别的效果也并不一定好。 然后,本文通过扩展传统向量化中基于数据相关性的向量化算法,引入专门的代码规范化和识别模块来解决这些问题。 首先,我们通过代码规范化步骤来最大限度的将多媒体程序的源代码规范化,从而方便识别和向量化。这些规范化包括:循环规范化、循环折叠、指针变数组、变量值域分析、映射数组变换等等。其中一种最重要的规范化方法是