一、引言
第一节通过一个简单的示例程序演示了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 <iostream> #include <omp.h> // 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 <iostream> #include <omp.h> // 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循环的并行化。