跳转到主要内容

G.5 编译器向量化的效果

两个因素决定程序能在多大程度上以向量方式执行。第一个是程序自身的结构:循环是否存在真数据依赖?能否通过重构消除这些依赖?它取决于所选算法,也在一定程度上取决于代码的写法。第二个是编译器的能力。对于迭代之间完全不存在并行性的循环,没有编译器能够将其向量化;但在判断循环究竟能否向量化这方面,不同编译器的能力差异极大。向量化采用的技术,与第 3 章为发掘指令级并行性而讨论的技术相同;这里仅回顾这些技术的实际效果。

不同编译器的程序向量化效果差异很大。图 G.9 可以作为向量化编译器能力的一个概览:它用包含 100 个手写 FORTRAN 内核的测试集,展示不同处理器上的向量化程度。这些内核专门用于测试向量化能力,都能手工向量化;习题中还会出现其中一些循环。

处理器编译器完全向量化部分向量化未向量化
CDC CYBER 205VAST-2 V2.2162533
Convex C-seriesFC5.069526
Cray X-MPCFT77 V3.069328
Cray X-MPCFT V1.1550149
Cray-2CFT2 V3.1a27172
ETA-10FTN 77 V1.062731
Hitachi S810/820FORT77/HAP V20-2B67429
IBM 3090/VFVS FORTRAN V2.452444
NEC SX/2FORTRAN77 / SX V.04066529
图 G.9 向量化编译器处理 100 个 FORTRAN 测试内核的结果。对每种处理器,列出完全向量化、部分向量化和未向量化的循环数。这些循环由 Callahan、Dongarra 和 Levine [1988] 收集。Cray X-MP 的两种编译器显示,结果高度依赖编译器技术。

表格阅读