编译器的依赖性分析会将 DO 循环转换成可并行化的任务。编译器可能会重构循环,分离出将要串行运行的不可并行化部分。然后将工作均匀分布在可用的处理器上。每个处理器执行不同的迭代块。
例如,对于四个 CPU 和具有 1000 次迭代的并行化循环,每个线程将执行含有 250 次迭代的程序块。
处理器 1 执行迭代 |
1 |
至 |
250 |
处理器 2 执行迭代 |
251 |
至 |
500 |
处理器 3 执行迭代 |
501 |
至 |
750 |
处理器 4 执行迭代 |
751 |
至 |
1000 |
只有不依赖于计算执行顺序的循环才能成功进行并行化。编译器的依赖性分析拒绝对那些具有内在数据依赖性的循环进行并行化。如果不能完全确定循环中的数据流,编译器会保守行事,不进行并行化。另外,如果能确定性能增益抵不上总开销,编译器也不会对循环进行并行化。
注意:编译器总是选择对使用静态循环调度的循环进行并行化-即将循环中的工作拆分到多个等效的迭代块中。其他调度方案可以用本章后面所述的显式并行化指令来指定。