G.5 编译器向量化的效果
两个因素决定程序能在多大程度上以向量方式执行。第一个是程序自身的结构:循环是否存在真数据依赖?能否通过重构消除这些依赖?它取决于所选算法,也在一定程度上取决于代码的写法。第二个是编译器的能力。对于迭代之间完全不存在并行性的循环,没有编译器能够将其向量化;但在判断循环究竟能否向量化这方面,不同编译器的能力差异极大。向量化采用的技术,与第 3 章为发掘指令级并行性而讨论的技术相同;这里仅回顾这些技术的实际效果。
不同编译器的程序向量化效果差异很大。图 G.9 可以作为向量化编译器能力的一个概览:它用包含 100 个手写 FORTRAN 内核的测试集,展示不同处理器上的向量化程度。这些内核专门用于测试向量化能力,都能手工向量化;习题中还会出现其中一些循环。
| 处理器 | 编译器 | 完全向量化 | 部分向量化 | 未向量化 |
|---|---|---|---|---|
| CDC CYBER 205 | VAST-2 V2.21 | 62 | 5 | 33 |
| Convex C-series | FC5.0 | 69 | 5 | 26 |
| Cray X-MP | CFT77 V3.0 | 69 | 3 | 28 |
| Cray X-MP | CFT V1.15 | 50 | 1 | 49 |
| Cray-2 | CFT2 V3.1a | 27 | 1 | 72 |
| ETA-10 | FTN 77 V1.0 | 62 | 7 | 31 |
| Hitachi S810/820 | FORT77/HAP V20-2B | 67 | 4 | 29 |
| IBM 3090/VF | VS FORTRAN V2.4 | 52 | 4 | 44 |
| NEC SX/2 | FORTRAN77 / SX V.040 | 66 | 5 | 29 |