OpenMP并行程序设计.docVIP

  1. 1、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
OpenMP并行程序设计 1 OpenMP的基本概念 OpenMP是一个编译器指令和库函数的集合,主要是为共享式存储计算机上的并行程序设计使用的。目前支持OpenMP的语言主要有Fortran,C/C++。 1.1 fork/join并行执行模式的概念 OpenMP在并行执行程序时,采用的是fork/join式并行模式,共享存储式并行程序就是使用fork/join式并行的。在开始时,只有一个叫做主线程的运行线程存在 。在运行过程中,当遇到需要进行并行计算的时候,派生出(Fork)线程来执行并行任务 。在并行代码结束执行,派生线程退出或挂起,控制流程回到单独的主线程中(Join)。‘ 如图,标准并行模式执行代码的基本思想是,程序开始时只有一个主线程,程序中的串行部分都由主线程执行,并行的部分是通过派生其他线程来执行,但是如果并行部分没有结束时是不会执行串行部分的,先看一个简单例子: void test() { ???? int a = 0; ???? clock_t t1 = clock(); ???? for (int i = 0; i 100000000; i++) ???? { ???????? a = i+1; ???? } ???? clock_t t2 = clock(); ???? printf(Time = %d\n, t2-t1); } int main(int argc, char* argv[]) { ???? clock_t t1 = clock(); #pragma omp parallel for ???? for ( int j = 0; j 2; j++ ){ ???????? test(); ???? } ???? clock_t t2 = clock(); ???? printf(Total time = %d\n, t2-t1); ???? test(); ???? return 0; } 在main()函数中,没有执行完for循环中的代码之前,后面的clock_t t2 = clock();这行代码是不会执行的,如果和调用线程创建函数相比,它相当于先创建线程,并等待线程执行完,所以这种并行模式中在主线程里创建的线程并没有和主线程并行运行。 1.2 性能举例 如上一节的代码,在test()函数中,执行了1亿次循环,主要是用来执行一个长时间的操作。在main()函数里,先在一个循环里调用test()函数,只循环2次,我们看一下在双核CPU上的运行结果吧: Time = 297 Time = 297 Total time = 297 Time = 297 可以看到在for循环里的两次test()函数调用都花费了297ms, 但是打印出的总时间却只花费了297ms,后面那个单独执行的test()函数花费的时间也是297ms,可见使用并行计算后效率提高了整整一倍。 1.3 编译器对OpenMP的支持 目前支持OpenMP的C/C++编译器主要有微软的VC和Intel的C/C++编译器。 在微软的VC8.0中,要将项目的属性对话框中“配置属性”下的“C/C++”下的“语言”页里,将“OpenMP支持”由否改为“是/(openmp)”即可。 对于Intel的C/C++编译器,则需要在编译命令行参数里使用对应的编译参数。参数设置 windows下 “/Qopenmp”; Linux下 “-openmp”,在项目中配置链接参数: type=win32 name=Microsoft VC80.OpenMP version=8.0.50727.42 processorArchitecture=X86 publicKeyToken=1fc8b3b9a1e18e3b 当前的Visual Studio .Net 2005完全支持OpenMP 2.0标准 .通过新的编译器选项 /openmp来支持OpenMP程序的编译和链接 .使用VS 2005编写OpenMP程序 如下: 2 OpenMP编程模型 2.1 OpenMP指令和库函数介绍 下面来介绍OpenMP的基本指令和常用指令的用法,在C/C++中,OpenMP指令使用的格式为 ?????? #pragma omp 指令 [子句[子句]…] 前面提到的parallel for就是一条指令,有些书中也将OpenMP的“指令”叫做“编译指导语句”,后面的子句是可选的。例如: #pragma omp parallel private(i, j) parallel 就是指令, private是子句。为叙述方便把包含#pragma和OpenMP指令的一行叫做语句,如上面那行叫parallel语句。 OpenMP的指令有以下一些: parallel,用在一个代码段之前,

文档评论(0)

文档终结者 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档