1. 并行区域(Parallel Region)概念
- 并行区域是由多个线程执行的代码块,是基本的OpenMP并行结构。
- 当一个线程到达并行指令时,它将创建一组线程并成为主(master)线程,其线程号为0。
- 从这个并行区域开始,代码被复制,所有线程都将执行该代码。
- 在并行区域的结尾有一个隐含的屏障(barrier),超过此点后只有主线程继续执行。
- 如果任何线程在一个并行区域内终止,那么该组的所有线程都将终止。
2. 并行区域语法格式
#pragma omp parallel [clause ...] newline
if (scalar_expression)
private (list)
shared (list)
default (shared | none)
firstprivate (list)
reduction (operator: list)
copyin (list)
structured_block
3. 并行区域的代码示例
int nthreads, tid;
// fork一组线程,并且给每个线程自己独立的变量拷贝
#pragma omp parallel private(tid)
{
// 获取并打印线程id
tid = omp_get_thread_num();
printf("Hello World from thread = %d\n", tid);
// 主要线程的线程id为0,因此只有主线程执行该代码
if (tid == 0)
{
nthreads = omp_get_num_threads();
printf("Number of threads = %d\n", nthreads);
}
} // 所有线程join主线程并结束
运行结果如下。
4. 并行区域的更多设置
4.1 设置并行区域的线程数
决定并行区域线程数的优先级由高到底如下:
- 调用库函数omp_set_num_threads()设置的线程数
- 环境OMP_NUM_THREADS设置的线程数
- 默认情况下,线程数与CPU核的个数相同
线程号从 0 (主