一起来学OpenMP(2)——常用的库函数

一、引言

第一节通过一个简单的示例程序演示了OpenMP,这一节介绍常用的四个库函数,来进一步认识OpenMP。

 

二、常用的库函数

函数原型                                        功能

int omp_get_num_procs(void)     返回当前可用的处理器个数

int omp_get_num_threads(void)  返回当前并行区域中的活动线程个数,如果在并行区域外部调用,返回1

int omp_get_thread_num(void)    返回当前的线程号(个人感觉这里为omp_get_thread_ID好一些)

int omp_set_num_threads(void)  设置进入并行区域时,将要创建的线程个数

 

三、并行区域

#include #include // OpenMP编程需要包含的头文件 int main() { std::cout << omp_get_num_procs() << std::endl; #pragma omp parallel //指明下面大括号内部为并行区域 { std::cout << "OpenMP" << std::endl; } return 0; }

输入结果:

   

 

系统为双核,所以默认创建了两个线程来执行并行区域,所以打印了两次OpenMP。

 

若将系统环境变量做如下设置:

 

重启VS2008,则输出

 

这是因为默认情况下,有几个核,则创建几个线程,但是可以通过环境变量来指定可以创建的线程个数。其实omp_set_num_threads函数也可以做到这一点,后面再做描述。

 

四、常用库函数示例

下面的示例代码同时演示了四个库函数。

 #include #include // OpenMP编程需要包含的头文件 int main() { std::cout << "CPU number: " << omp_get_num_procs() << std::endl; std::cout << "Parallel area 1: " << std::endl; #pragma omp parallel //指明下面大括号内部为并行区域 { std::cout << "Num of threads is " << omp_get_num_threads(); std::cout << "; This thread ID is " << omp_get_thread_num() << std::endl; } std::cout << "Parallel area 2: " << std::endl; omp_set_num_threads(4); // 设置成为并行区域创建4个线程 #pragma omp parallel //指明下面大括号内部为并行区域 { std::cout << "Num of threads is " << omp_get_num_threads(); std::cout << "; This thread ID is " << omp_get_thread_num() << std::endl; } return 0; }

输出:

 

第一个并行区域默认创建两个线程,线程ID分别为0和1,由于是并行输出,所以打印有些乱,但可以看到最后的01分别代表线程ID 0和ID 1。

第二个并行区域中指定创建线程个数为4,线程ID分别为0、1、2、3。

 

 

五、小节

演示了常用OpenMP库函数的使用方法,下一节讲解for循环的并行化。

你可能感兴趣的:(多核编程)