1.OpenMP介绍
OpenMP 是 Open MultiProcessing 的缩写,用于共享内存并行系统的多处理器程序设计的一套指导性编译处理方案。在项目程序已经完成好的情况下不需要大幅度的修改源代码,只需要加上专用的pragma来指明自己的意图,由此编译器可以自动将程序进行并行化,并在必要之处加入同步互斥以及通信。当选择忽略这些pragma,或者编译器不支持OpenMp时,程序又可退化为通常的程序(一般为串行),代码仍然可以正常运作,只是不能利用多线程来加速程序执行。OpenMP提供的这种对于并行描述的高层抽象降低了并行编程的难度和复杂度,这样程序员可以把更多的精力投入到并行算法本身,而非其具体实现细节。对基于数据分集的多线程程序设计,OpenMP是一个很好的选择。
2.VS2010中开启OpenMP
右键项目属性-配置属性-C/C++-语言-OpenMP支持-点击是。
3. OpenMP并行化测试
在已有源代码的基础上,要对此段代码进行并行化处理,只需要使用
#pragma omp parallel
{
//需要并行化处理的代码段
}
来进行标识需要处理的代码段。
以下是一个简单的示例
#include <iostream>
#include "omp.h"
using namespace std;
int main()
{
omp_set_num_threads(4); //设置线程数,一般设置的线程数不超过CPU核心数,这里开4个线程执行并行代码段
#pragma omp parallel //标识需要并行化处理的代码段
{
cout << "Thread " << omp_get_thread_num() << endl; //omp_get_thread_num()是获取当前线程id号
}
getchar();//使程序停顿查看输出结果
}
程序结果
当我们修改为8个线程的时候,其结果为
可以看出4个线程和8个线程都执行了cout << "Thread " << omp_get_thread_num() << endl; //omp_get_thread_num()是获取当前线程id号这句代码,而且先后顺序没有特定的从线程1到线程2执行,可以看出简单的实现了并行块的设计。
下面以一个较大的for循环来测试OpenMP并行程序与普通串行程序的速度问题。
需要对for程序代码段执行并行化需要添加#pragma omp parallel for
串行化程序:
#include<omp.h>
#include<iostream>
using namespace std;
int main()
{
cout<<"串行化程序"<<endl;
double start = omp_get_wtime( );//获取起始时间
for(int i = 0; i < 100000000; i++) //100000000次的空循环
{
}
double end = omp_get_wtime( );
cout<<"串行化程序计算耗时为:"<<end-start<<endl;
getchar();
return 0;
}
串行化程序结果:
并行化程序:
#include<omp.h>
#include<iostream>
using namespace std;
int main()
{
cout<<"并行化程序"<<endl;
omp_set_num_threads(4); //设置线程的个数为4
double start = omp_get_wtime( );//获取起始时间
#pragma omp parallel for
for(int i = 0; i < 100000000; i++) //100000000次的空循环
{
}
double end = omp_get_wtime( );
cout<<"并行化程序计算耗时为:"<<end-start<<endl;
getchar();
return 0;
}
并行化程序的测试结果:
程序执行的时间和你的电脑配置有很大的关系,从以上上亿次 的循环测试中来看,并行化程序确实比串行化程序更快的处理速度。
如果您觉得这篇博文有用,请访问我的个人站:http://www.stubbornhuang.com,更多博文干货等着您。