共享任务构造(Work-Sharing Constructs)将并行区域的代码执行分配给不同的线程,该指令不产生新的线程,进入共享工作区域不会有同步屏障(barrier),退出共享任务构造的时候会有隐式的同步屏障。共享任务构造有如下几种类型:
DO / for
Do/for指令将循环迭代步共享给线程组,这种模式代表着“数据并行”
#include <omp.h>
#define CHUNKSIZE 100
#define N 1000
int main()
{
int i, chunk;
float a[N], b[N], c[N];
/* Some initializations */
for (i = 0; i < N; i++)
a[i] = b[i] = i * 1.0;
chunk = CHUNKSIZE;
#pragma omp parallel shared(a,b,c,chunk) private(i)
{
#pragma omp for schedule(dynamic,chunk) nowait
for (i = 0; i < N; i++)
c[i] = a[i] + b[i];
} /* end of parallel section */
return 1;
}
SECTIONS
SECTIONS 将任务分割成单独的,离散的sections,每一个section被一个线程执行,这种模式代表着“函数并行”
#include <omp.h>
#define N 1000
int main()
{
int i;
float a[N], b[N], c[N], d[N];
/* Some initializations */
for (i = 0; i < N; i++) {
a[i] = i * 1.5;
b[i] = i + 22.35;
}
#pragma omp parallel shared(a,b,c,d) private(i)
{
#pragma omp sections nowait
{
#pragma omp section
for (i = 0; i < N; i++)
c[i] = a[i] + b[i];
#pragma omp section
for (i = 0; i < N; i++)
d[i] = a[i] * b[i];
} /* end of sections */
} /* end of parallel section */
return 1;
}
SINGLE
SINGLE指令使得并行域中的代码只被线程组中的一个线程执行,有点类似C++11的call_once