OpenMP编程学习笔记四

本文探讨了OpenMP中single与master指令的使用方法及其对多线程并行处理的影响。通过具体示例展示了如何利用single确保代码块仅在一个线程中执行,以及master如何指定特定线程执行关键代码。

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到底有何用处,能够解决什么实际问题,我还不能理解。

需要继续深入学习。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值