# G.5 编译器向量化的效果
<!-- source: p1107 -->

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

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

<!-- source: p1108 -->

| 处理器 | 编译器 | 完全向量化 | 部分向量化 | 未向量化 |
| --- | --- | ---: | ---: | ---: |
| 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 |
{#fig-G.9 .wide .expand num="G.9" caption="向量化编译器处理 100 个 FORTRAN 测试内核的结果。对每种处理器，列出完全向量化、部分向量化和未向量化的循环数。这些循环由 Callahan、Dongarra 和 Levine [1988] 收集。Cray X-MP 的两种编译器显示，结果高度依赖编译器技术。"}
