使用 OpenMP 伪指令
OpenMP 伪指令通过定义各种类型的并行区域来利用共享内存并行性。 并行区域可以包括程序代码的迭代段和非迭代段。
#pragma omp 编译指示的目的属于以下常规类别:
- 定义 由线程以并行方式完成工作的并行区域 (#pragma omp parallel)。 大多数 OpenMP 伪指令要么静态绑定,要么动态绑定到外层并行区域。
- 定义 如何在并行区域 (#pragma omp sections, #pragma omp for, #pragma omp single和 #pragma omp task) 中的线程之间分发或共享工作。
- 控制 线程之间的同步 (#pragma omp atomic, #pragma omp master, #pragma omp barrier, #pragma omp critical, #pragma omp flush, #pragma omp ordered)。
- 定义 同一线程 (#pragma omp threadprivate) 中跨并行区域的数据可视性范围。
- 控制 同步 (#pragma omp taskwait, #pragma omp barrier)。
将某些子句添加到 #pragma omp 编译指示可以对并行区域或工作共享区域的行为进行微调。 例如,可以使用 num_threads 子句来控制并行区域编译指示。
#pragma omp 编译指示通常显示在它们所应用的代码部分之前。 以下示例定义了一个并行区域,在该区域中, for 循环的迭代可以并行运行:
#pragma omp parallel
{
#pragma omp for
for (i=0; i<n; i++)
...
}此示例定义了一个并行区域,在该区域中,程序代码的两个或多个非迭代部分可以并行运行:
#pragma omp parallel
{
#pragma omp sections
{
#pragma omp section
structured_block_1
...
#pragma omp section
structured_block_2
...
....
}
}
有关 OpenMP 伪指令的 pragma-by-pragma 描述,请参阅 XL C/C++ Compiler Reference中的 Pragma 伪指令以进行并行处理 。
