学习openmp-master

语法

master构造的语法如下面所示

1
2
#pragma omp master new-line 
   structured-block

用法一般为

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
#pragma omp parallel
{
    /*
     ... 所有线程都执行的程序段
    */
    #pragma omp master
    {
        /*
        ... 仅主线程执行的程序段
        */
    }
}

例子

这里的主线程指的是在openmp并行优化开启之前的线程,举个例子

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
  
  //在openmp多线程优化之前定义master_v变量,这是属于主线程的
  int master_v = 100;

#pragma omp parallel
    {
        int v = 0;
#pragma omp master
	{
	    v = master_v;
        //为避免线程干扰,使用critical保证单线程完整输出一行
		#pragma omp critical 
	    std::cout << "master thread, v = "<< v << std::endl;
	}
//为避免线程干扰,使用critical保证单线程完整输出一行
#pragma omp critical
	std::cout << "v = "<< v  << std::endl;
    } 

执行结果

1
2
3
4
5
v = 0
master thread, v = 100
v = 100
v = 0
v = 0

可以看到的是只有一个线程的v值被赋予了100的数值,与预期的结果相符合。需要注意的是在parallel for循环中master是不适用的,编译会报错。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
    int master_v = 100;
/**
 * master不可用在parallel for中,编译报错
#pragma omp parallel for 
    for(int i = 0; i < 10; ++i)
    {
        int thread_id  = omp_get_thread_num();
	int v = 0;
#pragma omp master
	{
	    std::cout << "thread id = " << thread_id << std::endl;
	    v = master_v;
	}
	std::cout << "v = " << v << std::endl;
    }
 */

本文练习代码已上传至github:https://github.com/mangosroom/learn-openmp/tree/main/master


本文由芒果浩明发布,转载请注明出处。 本文链接:https://mangoroom.cn/parallel-programming/learn-openmp-master.html


微信公众号