OpenMP与C++ 事半功倍地获得多线程的好处 上

               

声明:本文并未获得翻译授权,本人翻译这篇文章仅用于学习和研究之用,任何人不得在未经授权之前将原文和译文用以商业用途.
因版权原因,暂不建议转载本文.
本文发表于
http://blog.csdn.net/lanphaday
请保留本文完整
本文发表于2005年第10期的<MSDN Mag>,英文版本地址:
http://msdn.microsoft.com/msdnmag/issues/05/10/OpenMP/default.aspx

OpenMPC++:事半功倍地获得多线程的好处(上)

 

Kang Su Gatlin & Pete Isensee

赖勇浩

 

       在并行计算领域有一个广为流传的笑话——并行计算是未来之事并且永远都是。这个小笑话几十年来一直都是对的。一种类似的观点在计算机架构社区中流传,处理器时钟速度的极限似乎近在眼前,但时钟速度却一直在加快。多核革命是并行社区的乐观和架构社区的悲观的冲突。

       现在主流的CPU厂商开始从追求时钟频率转移到通过多核处理器来增加并行支持。原因很简单:把多个CPU内核封装在一个芯片里可以让双核单处理器系统就像双处理器系统一样、四核单处理器系统像四处理器系统一样。这一实用方法让CPU厂商在能够提供更强大的处理器的同时规避了加速频率的诸多障碍。

       到此为止这听起来是一个好消息,但事实上如果你的程序没有从多核里获取优势的话,它并不会运行得更快。这就是OpenMP的用武之地了。OpenMP可以帮助C++开发者更快地开发出多线程应用程序。

       在这短小的篇幅里完整讲述OpenMP这个大而强的API库的相关内容是不可能的。因此,本文仅作一些初始介绍,通过示例让你能够快速地应用OpenMP的诸多特性编写多线程应用程序。如果你希望阅读更深入的内容,我们建议你去OpenMP的网站看看。

      

Visual C++中使用OpenMP

       OpenMP标准作为一个用以编写可移植的多线程应用程序的API库,规划于1997年。它一开始是一个基于Fortran的标准,但很快就支持CC++了。当前的版本是OpenMP 2.0(译者注:最新版本已经是2.5版), Visual C++ 2005XBox360平台都完全支持这一标准。

       在我们开始编码之前,你需要知道如何让编译器支持OpenMPVisual C++ 2005提供了一个新的/openmp开关来使能编译器支持OpenMP指令。(你也可以通过项目属性页来使能OpenMP指令。点击配置属性页,然后[C/C++],然后[语言],选中OpenMP支持。)当/openmp参数被设定,编译器将定义一个标识符_OPENMP,使得可以用#ifndef _OPENMP来检测OpenMP是否可用。

       OpenMP通过导入vcomp.lib来连接应用程序,相应的运行时库是vcomp.dllDebug版本导入的连接库和运行时库(分别为vcompd.libvcompd.dll)有额外的错误消息,当发生异常操作时被发出以辅助调试。记住尽管Xbox360平台支持静态连接OpenMP,但Visual C++并不支持。

      

OpenMP中的并行

       OpenMP应用程序刚运行时只有一条线程,这个线程我们叫它主线程。当程序执行时,主线程生成一组线程(包括主线程),随着应用程序执行可能会有一些区域并行执行。在并行结束后,主线程继续执行,其它线程被挂起。在一个并行区域内能够嵌套并行区域,此时原来的线程就成为它所拥有的线程组的主线程。嵌套的并行区域能够再嵌套并行区域。

(图1OpenMP并行段

       1展示了OpenMP如何并行工作。在最左边黄色的线是主线程,之前这一线程就像单线程程序那样运行,直到在执行到点1——它的第一个并行区域。在并行区域主线程生成了一个线程组(参照黄色和桔黄色的线条),并且这组线程同时运行在并行区域。

       在点2,有4条线程运行在并行区域并且在嵌套并行区域里生成了新的线程组(粉红、绿和蓝)。黄色和桔黄色进程分别作为他们生成的线程组的主线程。记住每一个线程都可以在不同的时间点生成一个新的线程组,即便它们没有遇到嵌套并行区域。

       在点3,嵌套的并行区域结束,每一个嵌套线程在并行区域同步,但并非整个区域的嵌套线程都同步。点4是第一个并行区域的终点,点5则开始了一个新的并行区域。在点5

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值