概念

        OpenMP是由一群专业的计算机软件及硬件厂商共同制定的应用程序编程接口(API),为开发者提供了一种可移植、伸缩的共享内存式编程模型。

        支持多种系统下(UNIX & Windows NT)的C/C++和Fortran。这篇文章涉及到OpenMP的大多数重要特性,包括其指定并行区域、工作共享、同步、

数据环境的若干成分和指令,也会提及运行时库函数和环境变量。提供C和Fortran示例代码和自测。

        预备知识:提供给用OpenMP进行并行编程的初学者。假定读者对用C或者Fortran进行并行编程有了一定的了解。

        如果不了解什么是并行编程,请参考EC3500: Introduction to Parallel Computing

简介

什么是OpenMP?

OpenMP 是:

  • 直接控制共享内存式并行编程的应用程序接口(API)
  • 由三个主要的API组成:
  • 编译指令
  • 运行库Runtime Library Routines
  • 环境变量Environment Variables
  • 可移植性Portable:
  • 适合C/C++和Fortran的API
  • 已在多种主要系统实现( Unix/Linux platforms and Windows NT )
  • 标准:
  • 由一群主要的硬件及软件厂家共同制定和支持
  • 今后可能会成为 ANSI 标准???
  • OpenMP 为什么制定?
  • 简短版本:开放式多处理器编程
  • 啰嗦版本:来自软硬件厂家、政府、学术的,关于多处理器并行处理的开放说明

OpenMP 不是:

  • 分布式内存并行系统
  • 所有厂商必须实现
  • 保证最有效率地利用共享内存
  • 检查数据相关、数据冲突、速度瓶颈或死锁
  • 检查导致了非相容性问题的代码流程
  • 说明编译器生成的自动并行话指令并指导编译器协调这些并行化处理
  • 保证在并行执行时对文件的输入输出操作同步。程序员负责输入输出的同步。

参考:

历史

很久很久以前:

  • 早在90年代,共享内存式计算机供应商提供了类似的、基于指令的Fortran编程扩展:
  • 用户用指令指定串行Fortran程序中的特定循环将被并行化
  • 编译器通过 SMP 处理器将此类循环自动并行化
  • 实现在功能上是类似的,但有分歧
  • 第一次标准化的尝试是在1994年的ANSI X3H5草案。却永远没有通过,相当部分原因是分布式内存机器开始流行。

导致...

  • 1997年春天,在ANSI X3H5之后,OpenMP标准化规范开始。当时新的共享内存式架构已开始流行.
  • 由OpenMP体系结构审核委员会带领(Architecture Review Board (ARB)). 最初的ARB 成员包括: (Disclaimer: all partner names derived from the OpenMP web site)
  • Compaq / Digital
  • Hewlett-Packard Company
  • Intel Corporation
  • International Business Machines (IBM)
  • Kuck & Associates, Inc. (KAI)
  • Silicon Graphics, Inc.
  • Sun Microsystems, Inc.
  • U.S. Department of Energy ASCI program
  • 其他的赞助者:

Endorsing application developers:

o ADINA R&D, Inc.

o ANSYS, Inc.

o Dash Associates

o Fluent, Inc.

o ILOG CPLEX Division

o Livermore Software Technology Corporation (LSTC)

o MECALOG SARL

o Oxford Molecular Group PLC

o The Numerical Algorithms Group Ltd.(NAG)


Endorsing software vendors:

o Absoft Corporation

o Edinburgh Portable Compilers

o GENIAS Software GmBH

o Myrias Computer Technologies, Inc.

o The Portland Group, Inc. (PGI)

发布历史

OpenMP的目标

标准化:

  • 适用于多种共享内存式系统/平台

快捷:

  • 建立简单的共享内存式计算机编程指令有限集和。 3~4条指令就可以实现并行处理.

易用:

  • 可以部分并行化串行程序,而不像消息传递库(MPI)那么绝对。
  • 实现粗粒度和细粒度的并行化

可移植:

  • 支持Fortran (77, 90, 和95), C, 和C++

API和会员的公共论坛

编程模型

共享内存,基于线程的并行处理:

  • OpenMP基于共享内存编程范式中存在的多线程。一个共享内存进程由多个线程构成。

显式并行处理:

  • OpenMP是显式(不是自动)编程模型,让程序员完全控制并行化。

Fork - Join 模型:

  • OpenMP 以 fork-join 模型执行并行:
  • 所有的OpenMP程序都作为单独的进程开始:主线程. 主线程顺序执行,直到遇到第一个parallel region
  • FORK: 主线程接着创建一系列的线程
  • 被并行区域构造包围的语句以并行方式由这组线程执行
  • JOIN:当线程组完成了并行区域构造中的任务后,经过同步和终止,最终只剩下主线程

基于编译器指令:

  • 大多数的OpenMP并行化处理通过在C/C++或者Fortran代码嵌入编译器指令指定

嵌套并行支持:

  • 该API提供了在一个并行结构中放置其他的并行结构
  • 具体实现时不确定支持这种特性

动态线程:

  • 该API可以动态修订执行不同并行区域的线程数量
  • 具体实现时不确定支持这种特性

I/O:

  • OpenMP没有并行I/O的规定,当多个线程试图对同一个文件进行读写操作时要特别注意。
  • 如果不同的线程进行不同文件的I/O操作,就不成问题
  • 完全由程序员确认一个多线程程序I/O的正确性

内存模型: 经常刷新(FLUSH)?

  • OpenMP声称提供了一个“宽松连贯”和“临时”的线程内存视图。也就是说,线程可以缓存自己的数据而不用每时每刻都去维护与真实内存的一致性。
  • 当所有线程监视同一个共享变量时特别关键,程序员要确保这个变量被所有需要的线程刷新(flushed)
  • 待续...

OpenMP 代码结构示范

C / C++ - General Code Structure





#include <omp.h>


main ()  {


int var1, var2, var3;


Serial code (串行代码)

.
.
.


Beginning of parallel section. Fork a team of threads.

Specify variable scoping


#pragma omp parallel private(var1, var2) shared(var3)
{


Parallel section executed by all threads
.
.
.


All threads join master thread and disband


}


Resume serial code (串行代码)

.
.
.


}