OpenMP中omp_set_nested()和OMP_NESTED环境变量详解

(1)类似于omp_set_dynamic(http://blog.csdn.net/gengshenghong/article/details/7003688),omp_set_nested()的参数实际是一个表示布尔的变量,可以覆盖OMP_NESTED的设置。

(2)OpenMP的嵌套并行和默认设置

omp_set_nested()用于设置是否允许OpenMP进行嵌套并行,默认的设置为false。

什么是嵌套并行?就是在并行区域中嵌套另一个并行区域,如下:

#pragma omp parallel num_threads(5)
	{
#pragma omp parallel num_threads(5) {/*do sth */}
	}
该如何执行?是执行5次?还是5×5次?这就是由是否嵌套并行来决定的,默认设置为不允许(false),所以会执行5次。

(3)嵌套并行的规则:

并行区域嵌套出现在当线程已经运行在并行区域又遇到另一个并行区域的时候,如果嵌套处于允许状态,那么就根据动态线程的规则生成一个新的线程组,相反的,线程组就只有单独的一个线程

(4)例子分析:

#include <omp.h>

int main(int argc, _TCHAR* argv[])  
{
	omp_set_nested(10);		// none zero value is OK!

#pragma omp parallel num_threads(2)
	{
		printf("ID: %d, Max threads: %d, Num threads: %d \n",omp_get_thread_num(), omp_get_max_threads(), omp_get_num_threads());
#pragma omp parallel num_threads(5)
		printf("Nested, ID: %d, Max threads: %d, Num threads: %d \n",omp_get_thread_num(), omp_get_max_threads(), omp_get_num_threads());
	}

	return 0;  
}
其可能的结果之一是:


可以看出,在允许嵌套后,嵌套的printf执行了生成了2×5。从这个例子同时也可以知道:

omp_get_thread_num,获取的ID是在当前嵌套层所在的线程组的ID,所以可以看到,嵌套部分输出的ID都是0到4,且ID重复2次,其实是属于不同的外部线程组的。

omp_get_num_threads,获取的也是当前所在层的线程组的线程数量。

omp_get_max_threads,与线程的数量和执行等都无关,这是一个可以分析出来的值。

如果去掉上面的设置允许嵌套的调用,默认就是不会允许嵌套,那么其结果如下:


  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值