跳过导航链接 | |
退出打印视图 | |
Oracle Solaris Studio 12.3:C 用户指南 Oracle Solaris Studio 12.3 Information Library (简体中文) |
循环调度是将并行循环的迭代分布到多个线程的进程。为获得最大加速,应在线程间均匀地分布工作同时不产生太大开销。编译器针对不同情况提供多种调度类型。
为了得到最佳结果,当循环的不同迭代执行的工作相同时,将工作均匀地分摊在系统上不同的线程之间。此方法称为静态调度。
示例 3-13 静态调度的良好循环
for (i=1; i < 1000; i++) { sum += a[i]*b[i]; /* S1 */ }
在静态调度或块调度中,每个线程将获取相同次数的迭代。使用四个线程时,每个线程将得到 250 个迭代。假设未发生中断,并且每个线程的进度相同,则所有线程将同时完成。
一般说来,当每次迭代执行的工作不同时,静态调度不会达到良好的负载平衡。在静态调度中,每个线程获取同一迭代块。除主线程之外,每个线程在完成自己的块时,将等待参与下一个并行循环的执行。主线程将继续执行程序。在自我调度中,每个线程获取不同的小迭代块,并且在完成为其分配的块之后,尝试从同一循环中获取更多块。
在引导自我调度 (guided self scheduling, GSS) 中,每个线程获取连续变少的块。如果每次迭代的大小不同,GSS 有助于平衡负载。