Open是一种面向共享内存以及分布式共享内存的多处理器多线程并行编程语言。
我的开发环境是Windows、VS2008、双核处理器。
1。 在VS2008程序目录下找到vcomp90d.dll文件,并复制到windows/system32/目录下。
2。创建一个名为OpenMP的空控制台工程(即没有VS2008不会生成任何文件)
3。添加一个名为OpenMP.cpp的源文件
4。“工程属性->C/C++->OpenMP支持”设置如下图:
5。简单的OpenMP代码。
- #include <iostream>
- #include <stdio.h>
- #include <omp.h> // OpenMP编程需要包含的头文件
- int main()
- {
- #pragma omp parallel for
- for(int i = 0; i < 10; ++i)
- {
- std::cout << i << std::endl;
- }
- return 0;
- };
执行结果如下:
可以看到,i从0至9的循环任务被分配到两个核上,第一个核执行了0~4,第二个核执行了5~9。
6。小节
通过#pragma omp预处理指示符指定要采用OpenMP,这里通过#pragma omp parallel for来指定下方的for循环采用多线程执行,此时编译器会根据CPU的个数来创建线程
数,对于双核系统,编译器会默认创建两个线程执行并行区域的代码。
一、引言
第一节通过一个简单的示例程序演示了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循环的并行化。