认识OpenMP

来源:互联网 发布:java classloader机制 编辑:程序博客网 时间:2024/04/27 20:54

OpenMP(Open Multi-Processing)是一套支持跨平台共享内存方式的多线程并发的编程API,使用C,C++和Fortran语言,可以在大多数的处理器体系和操作系统中运行,包括Solaris, AIX, HP-UX,GNU/Linux, Mac OS X, 和Microsoft Windows。包括一套编译器指令、库和一些能够影响运行行为的环境变量。

OpenMP采用可移植的、可扩展的模型,为程序员提供了一个简单而灵活的开发平台,从标准桌面电脑到超级计算机的并行应用程序接口。

混合并行编程模型构建的应用程序可以同时使用OpenMP和MPI,或更透明地通过使用OpenMP扩展的非共享内存系统上运行的计算机集群。

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

优点和缺点[编辑]

优点

  • 可移植的多线程代码(在C/C++和其他语言中,人们通常为了获得多线程而调用特定于平台的原语)
  • 简单,没必要向MPI中那样处理消息传递
  • 数据分布和分解由指令自动完成
  • 增量并行,一次可以只在代码的一部分执行,对代码不需要显著的改变
  • 统一的顺序执行和并行执行的代码,在顺序执行编译器上,OpenMP的执行按照注释进行对待;
  • 在一般情况下,使用OpenMP并行时原始的(串行)代码语句不需要进行修改,这减少不经意间引入错误的机会。
  • 同时支持粗粒度和细粒度的并行

缺点

  • 存在引入难以调试的同步错误和竞争条件的风险
  • 目前,只能在共享内存的多处理器平台高效运行
  • 需要一个支持OpenMP的编译器
  • 可扩展性是受到内存架构的限制
  • 不支持比较和交换
  • 缺乏可靠的错误处理
  • 缺乏对线程与处理器映射的细粒度控制
  • 在GPU上不能使用
  • 很容易出现一些不能共享的代码
  • 多线程的可执行文件的启动需要更多的时间,可能比单线程的运行的慢,因此,使用多线程一定要有其他有优势的地方
  • 很多情况下使用多线程不仅没有好处,还会带来一些额外消耗

争议[编辑]

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

编译器支持[编辑]

主流C/C++编译器,如gcc与visual C++,都内在支持OpenMP。一般都必须在程序中#inculude <omp.h>

gcc编译时需使用编译选项-fopenmp。但是,如果编译为目标文件与链接生成可执行文件是分开为两步操作,那么链接时需要给出附加库gomp,否则会在链接时报错“undefined reference to `omp_get_thread_num'"。

Visual C++需要在IDE的编译选项->语言->支持OpenMP。这实际上使用了编译选项/openmp


0 0
原创粉丝点击