工作共享构造 - For 循环的示例
double res[MAX]; int i;
#pragma omp parallel
{
#pragma omp for
for (i=0;i< MAX; i++) {
res[i] = huge();
}
}
for 循环将并行执行。huge()
是一种可能需要很长时间才能执行的方法。OpenMP 支持将上述代码编写为的快捷方式:
double res[MAX]; int i;
#pragma omp parallel for
for (i=0;i< MAX; i++) {
res[i] = huge();
}
我们还可以有一个 schedule 子句,它影响循环迭代如何映射到线程。例如:
#pragma omp parallel
#pragma omp for schedule(static)
for(i=0;I<N;i++) {
a[i] = a[i] + b[i];
}
不同风格的调度是:
schedule(static [,chunk])
对每个线程执行大小 chunk
的迭代块。
如果未指定:尽可能均匀地分配给可用线程
schedule(dynamic [,chunk])
每个线程从队列中抓取块迭代,直到所有迭代都被处理完毕。
schedule(guided [,chunk])
线程动态地抓取迭代块。随着计算的进行,块的大小开始变大并缩小到块大小。
schedule(运行时)
从 OMP_SCHEDULE 环境变量获取的计划和块大小。