`
jgsj
  • 浏览: 972428 次
文章分类
社区版块
存档分类
最新评论

OpenMP简介

 
阅读更多

转自:http://baike.baidu.com/view/1687659.htm

OpenMP是由OpenMP Architecture Review Board牵头提出的,并已被广泛接受的,用于共享内存并行系统的多线程程序设计的一套指导性注释(Compiler Directive)。OpenMP支持的编程语言包括C语言、C++和Fortran;而支持OpenMP的编译器包括Sun Compiler,GNU Compiler和Intel Compiler等。OpenMP提供了对并行算法的高层的抽象描述,程序员通过在源代码中加入专用的pragma来指明自己的意图,由此编译器可以自动将程序进行并行化,并在必要之处加入同步互斥以及通信。当选择忽略这些pragma,或者编译器不支持OpenMP时,程序又可退化为通常的程序(一般为串行),代码仍然可以正常运作,只是不能利用多线程来加速程序执行。

  OpenMP提供的这种对于并行描述的高层抽象降低了并行编程的难度和复杂度,这样程序员可以把更多的精力投入到并行算法本身,而非其具体实现细节。对基于数据分集的多线程程序设计,OpenMP是一个很好的选择。同时,使用OpenMP也提供了更强的灵活性,可以较容易的适应不同的并行系统配置。线程粒度和负载平衡等是传统多线程程序设计中的难题,但在OpenMP中,OpenMP库从程序员手中接管了部分这两方面的工作。

  但是,作为高层抽象,OpenMP并不适合需要复杂的线程间同步和互斥的场合。OpenMP的另一个缺点是不能在非共享内存系统(如计算机集群)上使用。在这样的系统上,MPI使用较多。

多执行绪的概念

OpenMP是作为共享存储标准而问世的。它是为在多处理机上编写并行程序而设计的一个应用编程接口。它包括一套编译指导语句和一个用来支持它的函数库。

  目前双核、四核的 CPU 当道,而六核的CPU也已经面世多时,所以在多处理机上编写、运行并行程序会变得相当普遍。

  对于一般单一执行绪(single thread)的程式,多核心的处理器并没有办法提升它的处理效能;不过对於多执行绪(multi thread)的程式,就可以透过不同的核心同时计算,来达到加速的目的了!简单的例子,以单执行绪的程式来说,一件事做一次要十秒的话,要做十次,都丢给同一颗核心做的话,自然就是 10 秒 * 10 次,也就是 100 秒了;但是以多执行绪的程式来说,它可以把这一件事,分给两颗核心各自做,每颗核心各做 5 次,所以所需要的时间就只需要 50 秒!

  当然,多执行绪的程式实际上没这么简单。在工作的切割、结合上,也是要多花时间的,所以在现实中,即使最佳状况,双核心的效能也不会是 1 + 1 = 2 这样的理想化。除此之外,也不是所有工作都是可以切割的!很多工作是有关联性的,这样如果直接切割给不同的处理核心各自去平行运算,出来的结果是肯定有问题的。而且,多执行绪的程式在编写、维护上,也都比单一执行绪的程式复杂上不少。

  不过,如果电脑本身是多处理器、多核心处理器,或是处理器拥有像 Intel Hyper-Threading Technology 这类的能在同一个时间处理多个执行绪的功能的话,那把各自独立的工作由单一执行绪改成多执行绪,在执行的效率上,大多还是会有增进的!

多执行绪的程式

 写程式的时候该怎么去写多执行绪的程式呢?一般的方法,就是真的利用 thread 的控制,去实际在程式中去产生其他的 thread 来处理。像 POSIX Threads 这套 library,就是用来产生、控制执行绪的函式库。而像 Microsoft VisualStudio 2005 中,也有提供控制 thread 的功能。这种方法,大多就是产生多个 thread,而再由主要的 thread 把工作拆开,分给各 thread 去运算,最後再由主要的 thread 回收结果、整合。

  但是,实际上要去控制 thread 是满麻烦的~在程式的编写上,也会复杂不少;而如果我们只是想要把一些简单的回圈平行化处理,用 thread library 来控制,实在有点杀鸡用牛刀的感觉。这时候,用 Open MP 就简单多了!OpenMP 是一种能透过高阶指令,很简单地将程式平行化、多执行绪化的 API;在最简单的情形,甚至可以只加一行指令,就可以将回圈内的程式平行化处理了!

OpenMP 的基本使用

要在Visual C++ 2005 中使用OpenMP其实不难,只要将 Project 的Properties中C/C++里Language的OpenMP Support开启(参数为 /openmp),就可以让VC++2005 在编译时支持OpenMP 的语法了;而在编写使用OpenMP 的程序时,则需要先include OpenMP的头文件:omp.h。

  而要将 for 回圈平行化处理,该怎么做呢?非常简单,只要在前面加上一行

  #pragma omp parallel for

  就够了!

  也可以实际用一段简单的程序,来弄清楚它的运作方式。

  #include <STDIO.H>

  #include <STDLIB.H>

  void Test(int n) {

  for (int i = 0; i < 10000; ++i)

  {

  //do nothing, just waste time

  }

  printf("%d, ", n);

  }

  int main(int argc, char* argv[])

  {

  for (int i = 0; i < 10; ++i)

  Test(i);

  system("pause");

  }

  上面的程序,在 main() 是一个很简单的回圈,跑十次,每次都会调用Test()这个函数,并把是回圈的执行次数(i)传进Test() 并打印出来。想当然,它的结果会是:

  0, 1, 2, 3, 4, 5, 6, 7, 8, 9,

  而如果想利用 OpenMP把 main() 里面的回圈平行化处理呢?只需要修改成下面的样子:

  #include <omp.h>

  #include <stdio.h>

  #include <stdlib.h>

  void Test (int n) {

  for (int i = 0; i < 10000; ++i) {

  //do nothing, just waste time

  }

  printf("%d, ", n);

  }

  int main(int argc, char* argv[]) {

  #pragma omp parallel for for (int i = 0; i < 10; ++i)

  

  Test( i );

  system("pause");

  }

  够简单吧?重头到尾,只加了两行!而执行后,可以发现结果也变了!

  0, 5, 1, 6, 2, 7, 3, 8, 4, 9,

  可以从结果很明显的发现,他没有照着0到9的顺序跑了!而上面的顺序怎么来的?其实很简单,OpenMP只是把回圈 0 - 9 共十个步骤,拆成 0 - 4, 5 - 9 两部份,丢给不同的执行绪去跑,所以数字才会出现这样交错性的输出~

  而要怎么确定真的有跑多执行绪呢?如果本来有多处理器、多核心处理器或有 Hyper Thread 的话,一个单执行绪程序,最多只会把一颗核心的使用量吃完;像比如说在 Pentium 4 HT 上跑,单一执行绪的程序,在工作管理员中看到的 CPU 使用率最多就是 50%。而利用 OpenMP 把回圈进行平行化处理后,就可以在执行回圈时,把两颗核心的 CPU 都榨光了!也就是CPU 使用率是100%。

分享到:
评论

相关推荐

    openmp简介

    openMP简介,介绍并行计算的基本概念和语法,可以完成简单的程序编写

    OpenMP简介和开发教程.pptx

    OpenMP简介和开发教程

    OpenMP程序设计

    OpenMP简介 OpenMP多线程编程模式 OpenMP并行程序设计 OpenMP的性能因素与不足

    OPenMp多核编程

    OPenMp多核编程命令详解包括:OpenMP简介,基本语法,以及相关练习

    openmp入门简介

    openmp入门简介 一些openMP的简单小知识

    3-9-基于AM57x的OpenMP例程使用手册.pdf

    1 OpenMP简介 3 2 OpenMP例程编译 3 3 OpenMP例程测试 6 3.1 dspheap例程 6 3.2 vecadd向量相加例程 6 3.3 vecadd_complex例程 7 3.4 其他例程测试说明 7 更多帮助 8

    多核架构及编程技术-第4章OpenMP程序设计1

    多核架构与编程技术OpenMP程序设计OpenMP简介OpenMP多线程编程模式OpenMP的指令、库函数、子句与环境变量OpenMP编程技术——循环并行化Op

    OpenMP用户手册(中文).docx

    摘要:本教程涵盖了OpenMP 3.1的大多数主要功能,包括其用于指定并行区域,工作共享,同步和数据环境的各种结构和指令。...对于通常不熟悉并行编程的用户,EC3500:并行计算简介中介绍的材料 将有所帮助。

    OPENMP程序设计

    OPENMP 程序设计 OpenMP概述 OpenMP编程简介 OpenMP计算实例

    OpenMP编程教程

    本文集中讨论基于共享变量的共享存储系统的并行编程。首先简单介绍共享存储并行编程的一些基本问题以及纯共享存储环境和虚拟共享存储...讨论了OpenMP标准,主要包括OpenMP简介、编译制导语句、运行库例程和环境变量等。

    openmp tutorial

    openmp的简介,openmp是一种通用的并行开发框架

    OpenMP-Collaboration

    使用OpenMP的共享内存并行编程简介 该在线课程是在HPC2N和LUNARC之间合作提供的。 OpenMP提供了一种有效的方法来用C,C ++和Fortran编写并行程序。 OpenMP程序适合在共享内存体系结构上执行,例如现代多核系统或...

    Parallel-Computing:并行计算的基础介绍并行算法的实现、MPI、OpenMP和CUDA并行

    并行计算目录并行计算基础并行计算简介并行计算机结构模型基础并行算法经典算法的并行计算矩阵计算线性方程组经典迭代算法特征值问题智能计算并行编程消息传递编程接口 MPI共享存储并行编程 openMPGPU并行加速技术 ...

    并行编程方法与优化实践

    资源名称:并行编程方法与优化实践内容简介:本书介绍了并行编程的方法和优化实践,主要结合X86SSE与AVX、ARMNeon、OpenMP、CUDA和OpenCL等讲解了并行编程的技术、方法和*实践。第1章讲解X86SSE与AVX的矩阵实现;第2...

    book review

    对英文书《The Sourcebook of the OpenMP Programming Model》作了简介!

    18302010012_王栋辉_Java、JavaScript和C++对异步IO的实现方法及其效率1

    摘要2目录 3第一章异步 IO 方法简介 41.1使用 openMP 对 C 语言代码进行改造 41.2.1 Java 实现异步 IO 的方式 41.3 基于

    程序的编译运行,中山大学广州超算中心

    一.Linux常用编译器简介 1.1 GCC、Intel ,简单程序编译和执行 2.1程序的编译流程 2.2函数库的使用和生成 2.3程序的执行 2.4 module的使用 2.5 yhbatch和简单bash脚本 三.并行程序的编译运行 3.1OpenMP和MPI程序...

Global site tag (gtag.js) - Google Analytics