首页
论坛
课程
招聘
[原创]基于OMP的多核开发技术(01)OMP介绍和开发环境配置
2009-4-26 16:47 7130

[原创]基于OMP的多核开发技术(01)OMP介绍和开发环境配置

2009-4-26 16:47
7130
【文章系列】: 基于OMP的多核开发技术(01)
【文章标题】: OMP介绍和开发环境配置
【文章作者】: 加百力
【作者博客】: http://blog.163.com/george_xuehui
【内部编号】: MASSADA 0027
【软件名称】: OpenMP
【下载地址】: http://www.openmp.org
【编写语言】: C++
【使用工具】: VS2005/GCC
【操作平台】: Windows XP SP2/CentOS 5.2

--------------------------------------------------------------------------------
【详细过程】

什么是OpenMP:

OpenMP起源于ANSI X3H5标准,它具有简单、移植性好和可扩展等优点,是共享存储系统编程的一个工业标准。OpenMP使用Fork-Join并行执行模型。支持增量并行化(Incremental Parallelization) 。实际上OpenMP并不是一门新的语言,它是对基本语言(如Fortan77、Fortan90、C、C++等)的扩展。OpenMP规范中定义的编译制导(Compiler Directive)、运行库(Runtime Library)和环境变量(Environment Variables),能够使用户在保证程序的可移植性的前提下,按照标准将已有的串行程序逐步并行化。

制导指令是对程序设计语言的扩展,进一步提供了对并行区域、工作共享、同步构造的支持,并且支持数据的共享和私有化。这样,用户对串行程序添加制导指令的过程,就类似于进行显式并行程序设计。

运行库和环境变量,使得用户可以调整并行程序的执行环境。OpenMP的提出,是希望遵循该并行编程模型的并行程序,可以在不同的产商提供的共享存储体系结构间比较容易地移植。

实际上,已经有许多硬件和软件供应商提供支持OepnMP的编译器,如DEC、Intel、IBM、HP、Sun、SGI、及U.S.DOE ASCI program等,并且包括了Linux,UNIX和Windows等多种操作系统平台。目前,Fortran77、Fortran90、C、C++语言的实现规范已经完成。

最新资料可以参看官方网站:http://www.openmp.org。

OpenMP不包含的性质

不是建立在分布式存储系统上的

不是在所有的环境下都是一样的

不是能保证让多数共享存储器均能有效的利用

OpenMP的历史

1994年,第一个ANSI X3H5草案提出,被否决

1997年,OpenMP标准规范代替原先被否决的ANSI X3H5,被人们认可

1997年10月公布了与Fortran语言捆绑的第一个标准规范 FORTRAN version 1.0

1998年11月9日公布了支持C和C++的标准规范C/C++ version 1.0

2000年11月推出FORTRAN version 2.0

2002年3月推出C/C++ version 2.0

2005年5月OpenMP2.5将原来的Fortran和C/C++ 标准规范相结合

相关的规范可在http://www.openmp.org/wp中下载

OpenMP并行编程模型
首先,OpenMP是基于线程的并行编程模型(Programming Model),一个共享存储的进程由多个线程组成,OpenMP就是基于已有线程的共享编程范例;其次,OpenMP是一个外部的编程模型,而不是自动编程模型,它能够使程序员完全控制并行化。

OpenMP使用Fork-Join并行执行模型。所有的OpenMP程序开始于一个单独的主线程(Master Thread)。主线程会一直串行的执行,直到遇见第一个并行域(Parallel Region)才开始并行执行。

接下来的过程如下:
①Fork:主线程创建一队并行的线程,然后,并行域中的代码在不同的线程队中并行执行;②Join:当主线程在并行域中执行完之后,它们或被同步或被中断,最后只有主线程在执行。
实际上,所有OpenMP的并行化,都是通过使用嵌入到C/C++或Fortran源代码中的编译制导语句来达到的。并且,一个OpenMP应用编程接口(API)的并行结构可以嵌入到别的并行结构中去。应用编程接口还可以随着不同并行域的需要动态地改变线程数。有些应用也可能不支持上述性质。

编译制导:

OpenMP的#pragma语句的格式为:

         #pragma omp directive_name .....

#pragma omp
      
             制导指令前缀。对所有的OpenMP语句都需要这样的前缀。

directive-name

            OpenMP制导指令。在制导指令前缀和子句之间必须有一个正确的OpenMP制导指令。

[clause, ...]

            子句。在没有其它约束条件下,子句可以无序,也可以任意的选择。 这一部分也可以没有。

newline

         换行符。表明这条制导语句的终止。

开发系统对OMP的支持:

微软的VS2005开始支持OMP开发。

Linux下GCC4.2可以支持OMP开发。

简单代码示例:

#include "stdio.h"
#include "omp.h"
int main(int argc, char* argv[])
{
#pragma omp parallel num_threads(10)
    printf("Hello OMP from Thread %d\n",omp_get_thread_num());
    return 0;
}


//该程序打开10个线程显示字符串。同时显示由哪个线程输出了该字符串。

编写OMP程序时需要在包含文件中加入 #include "omp.h" 。

对于VS2005/2008平台:项目属性 -> C/C++语言中,必须打开"OpenMP"支持才行。

对于Linux平台:在gcc的构建选项中需要加入:  -fopenmp。

★  为了方便和大家交流加百力也开博了。
     我准备陆续加入自己在软件编写、开发管理、投资方面的心得体会。地址为:http://blog.163.com/george_xuehui 欢迎大家来做客!

--------------------------------------------------------------------------------
【版权声明】: 本文原创于看雪技术论坛, 转载请注明作者并保持文章的完整, 谢谢!

                                                       2009年04月26日 16:30:00

2022 KCTF春季赛【最佳人气奖】火热评选中!快来投票吧~

收藏
点赞0
打赏
分享
最新回复 (6)
雪    币: 2309
活跃值: 活跃值 (48)
能力值: (RANK:510 )
在线值:
发帖
回帖
粉丝
加百力 活跃值 12 2009-4-26 16:51
2
0
最近为了提高软件的性能充分发挥4核服务器的优势,做了些基于OMP的多核开发研究,感觉很有趣。同时看到论坛里面介绍这方面的东西比较少,就发个原创系列,介绍一下。

去年就已经看到有同事在使用具有双核的HTC手机了。相信多核也是未来嵌入式发展的一个方向。
雪    币: 2309
活跃值: 活跃值 (48)
能力值: (RANK:510 )
在线值:
发帖
回帖
粉丝
加百力 活跃值 12 2009-4-26 17:03
3
0
目前无论是个人PC还是服务器很多都具有多个核心,而如果软件开发中没有使用多核技术是不能充分发挥其性能的。掌握多核开发技术对于提高软件性能充分发挥硬件潜力有重要意义。

前面做了一些复杂运算的测试,感觉使用多核开发技术效果确实是立杆见影。并且基于OMP的多核开发技术难度不大,很容易掌握。后面会陆续发表介绍文章和示例程序让大家看看效果。
雪    币: 255
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
alextooter 活跃值 2009-4-27 23:20
4
0
手机里面的双核并不是pc机里面的那个概念。。。

一般而言,手机的双核指的是一个arm核心,用来做普通计算,和cpu一个功能;一个dsp核,做网络信号处理,双方通过share memory通信。也有只用一个arm来做的,各有利弊。

而pc上的双核或多核,是指相同功能的核心,所以才可以用OpenMp来做并行计算。
雪    币: 2309
活跃值: 活跃值 (48)
能力值: (RANK:510 )
在线值:
发帖
回帖
粉丝
加百力 活跃值 12 2009-4-28 07:54
5
0
说的对,嵌入式系统中的“双核”至少到目前同PC中的“双核”不是同一个概念,也不能用OpenMP开发。个人认为在未来这是一个发展趋势。
雪    币: 390
活跃值: 活跃值 (12)
能力值: ( LV9,RANK:330 )
在线值:
发帖
回帖
粉丝
Ptero 活跃值 8 2009-4-29 07:34
6
0
最近在学多核处理器,正好讲到OpenMP
期待更多更详细的介绍
雪    币: 2309
活跃值: 活跃值 (48)
能力值: (RANK:510 )
在线值:
发帖
回帖
粉丝
加百力 活跃值 12 2009-4-29 08:28
7
0
我也是根据工作需要了解了一点,感觉很有趣,就在继续深入学习。
多交流,共同提高。
游客
登录 | 注册 方可回帖
返回