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。

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

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

(3)嵌套并行的规则:

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

(4)例子分析:

[cpp]  view plain copy
  1. #include <omp.h>  
  2.   
  3. int main(int argc, _TCHAR* argv[])    
  4. {  
  5.     omp_set_nested(10);     // none zero value is OK!  
  6.   
  7. #pragma omp parallel num_threads(2)  
  8.     {  
  9.         printf("ID: %d, Max threads: %d, Num threads: %d \n",omp_get_thread_num(), omp_get_max_threads(), omp_get_num_threads());  
  10. #pragma omp parallel num_threads(5)  
  11.         printf("Nested, ID: %d, Max threads: %d, Num threads: %d \n",omp_get_thread_num(), omp_get_max_threads(), omp_get_num_threads());  
  12.     }  
  13.   
  14.     return 0;    
  15. }  
其可能的结果之一是:

OpenMP中omp_set_nested()和OMP_NESTED环境变量详解_第1张图片

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

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

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

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

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

你可能感兴趣的:(OpenMP中omp_set_nested()和OMP_NESTED环境变量详解)