OpenMP中的常用函数

1、设置线程数目

其定义如下:

void omp_set_num_threads(int num_threads);

通过该函数来指定其后用于并行计算的线程数目,其中参数num_threads就是指定的线程数目。

2、获取线程数目

其定义如下:

int omp_get_num_threads();

通过该函数可以获取当前运行组中的线程数目,如果是在并行结构中使用该函数,其返回的就是现在并行计算中的所有的线程总数,如果是在串行中使用该函数,其返回值就为1。

3、获取最多线程数目

其定义如下:

int omp_get_max_threads();

该函数将返回最多可以用于并行计算的线程数目。

4、返回线程ID

其定义如下:

int omp_get_thread_num();

通过该函数可以返回当前线程的ID,如果使用该函数时处于并行结构中,它返回的就是这个并行线程的ID,如果在串行中,就是返回主线程的ID。

5、获取程序可用的处理器数目

其定义如下:

int omp_get_num_procs();

该函数将返回可用于程序的处理器数目(其实是线程数目)。

6、获取时间

其定义如下:

double omp_get_wtime();

该函数返回为时钟运行的时间,单位为s,如果现在时刻为11:40:30.8,则该值为11*3600+40*60+30.8=42030.8。在程序运行开始和即将结束时使用调用这个函数可以用于计算程序运行的时间。

7、是否处于并行中

其定义如下:

int omp_in_parallel();


 omp_set_dynamic 函数

omp_set_dynamic 功能启用或禁用线程数动态调整可用于并行区域的执行。 格式如下所示:

#include <omp.h>
void omp_set_dynamic(int dynamic_threads);

如果 dynamic_threads 计算为非零值,对于执行后续并行区域使用线程的数目可能由种运行时环境自动调整以最佳利用系统资源。 因此,用户指定的线程的数目最大线程计数。 线程数在执行并行区域的团队保持固定为该并行区域的持续时间以及由 omp_get_num_threads 函数报告。

如果 dynamic_threads 计算结果为 0,动态调整被禁用。

该函数具有中描述的效果顶部,在调用从 omp_in_parallel 函数返回零程序的一部分。 如果从 omp_in_parallel 函数返回非零值程序的一部分调用,此功能的行为未定义。

为 omp_set_dynamic 的调用在 OMP_DYNAMIC 环境变量的优先级。

线程的动态调整的默认实现中定义。 因此,依赖于线程的特定数字正确执行的用户代码应显式禁用动态线程。 不需要实现能够动态地调整线程数,但是,要求他们提供接口以便支持在所有平台上的可移植性。


总体来说,调用omp_set_dynamic会覆盖OMP_DYNAMIC环境变量的设置,其参数是一个int类型,这也是这个函数容易让人误解的地方之一。其实,其参数也是一个"bool"类型,和OMP_DYNAMIC的功能是一样的,上面的MSDN描述可知,如果参数为非零值,线程组线程数量也是根据系统的资源状态动态调整的,当然,在线程组执行一个并行区域的时候,其线程数量是固定的(fixed),这也是对“动态”容易造成的误解,所以,“动态调整“并不是表示并行块执行的过程中会动态变化线程组线程数量,而是在设置了”动态“之后,接下里的并行区域会根据系统的当前状况进行判断来分配合理的线程数量

omp_get_dynamic函数用于获取是否允许动态调整,其返回值为int类型,但是实际只会返回0和1两个值之一。

(PS:不知道为什么openmp不规定omp_set_dynamic的参数类型为bool,可能是C里面没有bool类型的原因?)

(3)例子:

[cpp]  view plain copy
  1. #include <omp.h>  
  2.   
  3. int main(int argc, _TCHAR* argv[])    
  4. {  
  5.     omp_set_dynamic(0); // can be ignored!  
  6.   
  7.     printf("Is Dynamic: %d\n",omp_get_dynamic());  
  8.   
  9.     omp_set_num_threads(10);  
  10. #pragma omp parallel num_threads(5)  
  11.     {  
  12.         printf("ID: %d, Max threads: %d, Num threads: %d \n",omp_get_thread_num(), omp_get_max_threads(), omp_get_num_threads());  
  13.     }  
  14.   
  15.     omp_set_dynamic(1000);  // nonzero is OK!  
  16.   
  17.     printf("Is Dynamic: %d\n",omp_get_dynamic());  
  18.   
  19.     omp_set_num_threads(10);  
  20. #pragma omp parallel num_threads(5)  
  21.     {  
  22.         printf("ID: %d, Max threads: %d, Num threads: %d \n",omp_get_thread_num(), omp_get_max_threads(), omp_get_num_threads());  
  23.     }  
  24.   
  25.     return 0;    
  26. }  
分析上面的程序,来理解设置动态和不设置的差别,在4核CPU上运行的结果如下:


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值