VS2010开启OpenMP,进行并行化程序设计

39 篇文章 5 订阅

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,更多博文干货等着您。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

HW140701

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值