在OpenMP的Runtime Library中有一些常用的函数,有些函数已经在前面的例子中使用过,现在集中说明这些常用的函数以及用法。
1、设置线程数目
voidomp_set_num_threads(int num_threads);
通过该函数来指定其后用于并行计算的线程数目,其中参数num_threads就是指定的线程数目。
2、获取线程数目
其定义如下:
intomp_get_num_threads();
通过该函数可以获取当前运行组中的线程数目,如果是在并行结构中使用该函数,其返回的就是现在并行计算中的所有的线程总数,如果是在串行中使用该函数,其返回值就为1。
3、获取最多线程数目
其定义如下:
intomp_get_max_threads();
该函数将返回最多可以用于并行计算的线程数目。
4、返回线程ID
其定义如下:
int omp_get_thread_num();
通过该函数可以返回当前线程的ID,如果使用该函数时处于并行结构中,它返回的就是这个并行线程的ID,如果在串行中,就是返回主线程的ID。
5、获取程序可用的处理器数目
其定义如下:
int omp_get_num_procs();
该函数将返回可用于程序的处理器数目(其实是线程数目)。
6、获取时间
其定义如下:
doubleomp_get_wtime();
该函数返回为时钟运行的时间,单位为s,如果现在时刻为11:40:30.8,则该值为11*3600+40*60+30.8=42030.8。在程序运行开始和即将结束时使用调用这个函数可以用于计算程序运行的时间。
7、是否处于并行中
其定义如下:
intomp_in_parallel();
该函数返回值为0表示现在处于串行程序中,值为1表示现在处于并行程序中。
关于这些常用函数的具体用法及含义如下例所示:
//File :CommonTest.cpp #include"stdafx.h" #include<omp.h> #include<iostream> using namespace std; void CommonTest() { int i,k; double starttime,endtime; cout<<"主线程中:"<<"\n"; i=omp_get_num_threads();//获取线程数目 cout<<"线程数目:"<<i<<"\n"; i=omp_get_max_threads();//获取最多线程数目 cout<<"最多线程数目:"<<i<<"\n"; i=omp_get_thread_num();//当前线程ID cout<<"当前线程ID:"<<i<<"\n"; i=omp_get_num_procs();//获取程序可用的处理器数目 cout<<"程序可用的处理器数目:"<<i<<"\n"; starttime=omp_get_wtime();//获取当前时间 cout<<"程序开始运行时间:"<<starttime<<"s\n"; i=omp_in_parallel();//程序是否处于并行 cout<<"程序是否处于并行:"<<i<<"\n"; i=omp_get_nested();//是否允许并行嵌套 cout<<"是否允许并行嵌套:"<<i<<"\n"; cout<<"\n程序开始并行:\n"; #pragma omp parallel for for(i=0;i<2;i++) { k=omp_in_parallel();//程序是否处于并行 cout<<"程序是否处于并行:"<<k<<"\n"; k=omp_get_num_threads();//获取线程数目 cout<<"线程数目:"<<k<<"\n"; k=omp_get_thread_num();//当前线程ID cout<<"当前线程ID:"<<k<<"\n"; } cout<<"\n程序并行结束!\n"; endtime=omp_get_wtime();//获取当前时间 cout<<"程序结束时间:"<<endtime<<"s\n"; cout<<"程序运行时间:"<<endtime-starttime<<"s\n"; }
运行程序,其结果如下:
主线程中:
线程数目:1
最多线程数目:8
当前线程ID:0
程序可用的处理器数目:8
程序开始运行时间:42747.9s
程序是否处于并行:0
是否允许并行嵌套:0
程序开始并行:
程序是否处于并行:1
线程数目:8
当前线程ID:0
程序是否处于并行:1
线程数目:8
当前线程ID:1
程序并行结束!
程序结束时间:42747.9s
程序运行时间:0.0105584s