欢迎来到天天文库
浏览记录
ID:12157329
大小:117.00 KB
页数:28页
时间:2018-07-15
《openmp并行程序设计》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、OpenMP并行程序设计(一)OpenMP是一个支持共享存储并行设计的库,特别适宜多核CPU上的并行程序设计。今天在双核CPU机器上试了一下OpenMP并行程序设计,发现效率方面超出想象,因此写出来分享给大家。在VC8.0中项目的属性对话框中,左边框里的“配置属性”下的“C/C++”下的“语言”页里,将OpenMP支持改为“是/(OpenMP)”就可以支持OpenMP了。先看一个简单的使用了OpenMP程序intmain(intargc,char*argv[]){#pragmaompparallelforfor(inti=0;i<10;
2、i++){printf("i=%d",i);}return0;}这个程序执行后打印出以下结果:i=0i=5i=1i=6i=2i=7i=3i=8i=4i=9可见for循环语句中的内容被并行执行了。(每次运行的打印结果可能会有区别)这里要说明一下,#pragmaompparallelfor这条语句是用来指定后面的for循环语句变成并行执行的,当然for循环里的内容必须满足可以并行执行,即每次循环互不相干,后一次循环不依赖于前面的循环。有关#pragmaompparallelfor这条语句的具体含义及相关OpenMP指令和函数的介绍暂时先
3、放一放,只要知道这条语句会将后面的for循环里的内容变成并行执行就行了。将for循环里的语句变成并行执行后效率会不会提高呢,我想这是我们最关心的内容了。下面就写一个简单的测试程序来测试一下:voidtest(){inta=0;clock_tt1=clock();for(inti=0;i<100000000;i++){a=i+1;}clock_tt2=clock();printf("Time=%d",t2-t1);}intmain(intargc,char*argv[]){clock_tt1=clock();#pragmaomppar
4、allelforfor(intj=0;j<2;j++){test();}clock_tt2=clock();printf("Totaltime=%d",t2-t1);test();return0;}在test()函数中,执行了1亿次循环,主要是用来执行一个长时间的操作。在main()函数里,先在一个循环里调用test()函数,只循环2次,我们还是看一下在双核CPU上的运行结果吧:Time=297Time=297Totaltime=297Time=297可以看到在for循环里的两次test()函数调用都花费了297ms,但是打印出的总
5、时间却只花费了297ms,后面那个单独执行的test()函数花费的时间也是297ms,可见使用并行计算后效率提高了整整一倍。OpenMP并行程序设计(二)1、fork/join并行执行模式的概念OpenMP是一个编译器指令和库函数的集合,主要是为共享式存储计算机上的并行程序设计使用的。前面一篇文章中已经试用了OpenMP的一个Parallelfor指令。从上篇文章中我们也可以发现OpenMP并行执行的程序要全部结束后才能执行后面的非并行部分的代码。这就是标准的并行模式fork/join式并行模式,共享存储式并行程序就是使用fork/jo
6、in式并行的。标准并行模式执行代码的基本思想是,程序开始时只有一个主线程,程序中的串行部分都由主线程执行,并行的部分是通过派生其他线程来执行,但是如果并行部分没有结束时是不会执行串行部分的,如上一篇文章中的以下代码:intmain(intargc,char*argv[]){clock_tt1=clock();#pragmaompparallelforfor(intj=0;j<2;j++){test();}clock_tt2=clock();printf("Totaltime=%d",t2-t1);test();return0;}在没
7、有执行完for循环中的代码之前,后面的clock_tt2=clock();这行代码是不会执行的,如果和调用线程创建函数相比,它相当于先创建线程,并等待线程执行完,所以这种并行模式中在主线程里创建的线程并没有和主线程并行运行。2、OpenMP指令和库函数介绍下面来介绍OpenMP的基本指令和常用指令的用法,在C/C++中,OpenMP指令使用的格式为#pragmaomp指令[子句[子句]…]前面提到的parallelfor就是一条指令,有些书中也将OpenMP的“指令”叫做“编译指导语句”,后面的子句是可选的。例如:#pragmaompp
8、arallelprivate(i,j)parallel就是指令,private是子句为叙述方便把包含#pragma和OpenMP指令的一行叫做语句,如上面那行叫parallel语句。OpenMP的指令有以下
此文档下载收益归作者所有