工作共享构造 - 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 环境变量获取的计划和块大小。