【文章系列】: 基于OMP的多核开发技术(01) 【文章标题】: OMP介绍和开发环境配置 【文章作者】: 加百力 【作者博客】: adfK9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8X3u0D9L8$3N6Q4x3X3f1I4y4U0y4Q4x3X3g2U0L8$3#2Q4x3V1k6Y4k6h3!0J5k6$3g2Q4y4h3k6^5N6h3g2Z5N6h3V1`. 【内部编号】: MASSADA 0027 【软件名称】: OpenMP 【下载地址】: 177K9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8Y4N6%4N6#2)9J5k6h3!0H3k6h3&6E0M7q4)9J5k6h3!0J5k6H3`.`. 【编写语言】: 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++语言的实现规范已经完成。 最新资料可以参看官方网站:c07K9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8Y4N6%4N6#2)9J5k6h3!0H3k6h3&6E0M7q4)9J5k6h3!0J5k6#2!0q4x3#2)9^5x3q4)9^5x3R3`.`.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++ 标准规范相结合 相关的规范可在c54K9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8Y4N6%4N6#2)9J5k6h3!0H3k6h3&6E0M7q4)9J5k6h3!0J5k6#2)9J5c8Y4N6H3i4@1f1@1i4@1t1^5i4@1q4p5i4@1f1@1i4@1t1^5i4K6S2n7i4@1f1^5i4@1u0p5i4@1u0p5OpenMP并行编程模型 首先,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开发。简单代码示例:
[注意]看雪招聘,专注安全领域的专业人才平台!