OpenMP编程学习笔记四

本文详细介绍了OpenMP中的single和master指令的使用方法及其区别。通过具体的示例代码展示了如何利用这两种指令来控制并行区域内的代码执行逻辑,以达到降低功耗或指定特定线程执行任务的目的。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

single的用法。

parallel的目的就是能够让多个CPU协调处理问题,从而提高运行性能。例如,如下的代码,各个CPU都会执行一次。

#pragma omp parallel

{

printf("test OpenMP/n");

}

更多的时候,我们可能希望这种代码只要在一个CPU上执行就行了,以便减少CPU的功耗。这时可以使用single。

测试代码如下:

void testSingle()
{
    omp_set_num_threads( 4 );

#pragma omp parallel
    {
        printf("test OpenMP/n");
#pragma omp single
        {
            printf("test OpenMP single/n");
            printf("execute thread ID is %d/n", omp_get_thread_num());
        }
    }
}

 

一个运行结果如下:

test OpenMP
test OpenMP
test OpenMP
test OpenMP
test OpenMP single
execute thread ID is 0

 

另外一个运行结果:

test OpenMP
test OpenMP single
execute thread ID is 1

test OpenMP
test OpenMP
test OpenMP

 

可以看出,在一个parallel region内,single代码块始终只会被执行一次。

不加single的一个运行结果为:

test OpenMP
test OpenMP single
execute thread ID is 0
test OpenMP
test OpenMP single
execute thread ID is 2
test OpenMP
test OpenMP single
execute thread ID is 1
test OpenMP
test OpenMP single
execute thread ID is 3

 

其实,"test OpenMP"被输出多次,这个是比较难理解的。因为一个CPU已经处理过了,就不应该由别的

CPU再去处理。可能是OpenMP的最初模型就是如此,或者这个本身就是OpenMP的设计缺陷,所以增加

single directive来回避这一点。如果用户只希望一段代码由一个CPU来处理,就使用single ,

毕竟这是一个崇尚低功耗的年代。

 

single代码段可以由任何一个CPU或者thread执行,如果想让固定的CPU或者thread运行一段代码,可以使用

master。master的局限性就在于只能由ID为0的thread执行该代码段。测试代码:

void testMaster()
{
 omp_set_num_threads( 4 );

#pragma omp parallel
 {
  printf("test OpenMP/n");
#pragma omp master
  {
   printf("test OpenMP master/n");
   printf("execute thread ID is %d/n", omp_get_thread_num());
  }
 }
}

运行结果为:

test OpenMP
test OpenMP master
execute thread ID is 0
test OpenMP
test OpenMP
test OpenMP

运行N次,"execute thread ID is 0"总是被输出。master到底有何用处,能够解决什么实际问题,我还不能理解。

需要继续深入学习。

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值