What is OpenMP?
OpenMP is a specification for a set of compiler directives, library routines, and environment variables that can be used to specify shared memory parallelism in Fortran and C/C++ programs.
Why a new standard?
Shared-memory parallel programming directives have never been standardized in the industry. An earlier standardization effort, ANSI X3H5 was never formally adopted. So vendors have each provided a different set of directives, very similar in syntax and semantics, and each used a unique comment notation for "portability". OpenMP consolidates these directive sets into a single syntax and semantics, and finally delivers the long-awaited promise of single source portability for shared-memory parallelism.
OpenMP also addresses the inability of current shared-memory directive sets to deal with coarse grain parallelism. Limited support for coarse grain work has led to developers thinking that shared-memory parallel programming was inherently limited to fine-grain parallelism -- this isn't the case with OpenMP. OpenMP goes beyond standardizing fine-grain parallelism by introducing functionality useful for writing coarse grain parallel applications.
SGI and Cray already have parallel directives; why new ones?
The SGI MIPSpro Power compiler directives (DOACROSS) and Cray Autotasking directives (DOALL) provide much of the same functionality as OpenMP. OpenMP provided an opportunity for the two companies to revisit the requirements for parallel programming, review the strengths and weaknesses of these earlier sets of directives, and design a more refined parallel model. OpenMP goes beyond these earlier models with powerful new features like orphaning, necessary for coarse grain parallel applications.
SGI encourages you to move to OpenMP as soon as practical. The additional functionality and the promise of industry-wide portability make OpenMP the model of choice. But the older models will continue to be supported for some period of time, allowing you to make the move to OpenMP when it best suits your schedule and requirements.
How does OpenMP compare with...
What about nested parallelism?
Nested parallelism is permitted by the OpenMP specification. Supporting nested parallelism effectively can be difficult, and we expect most vendors (including SGI) will start out by executing nested parallel constructs on a single thread. At the same time, vendors will be experimenting with nested parallelism to better understand how to approach this topic. We then expect the OpenMP group to add this functionality to the specifications.
What about task parallelism?
Full support for task parallelism is not included in the OpenMP specification. This may be added in future extensions.
What if I just want loop-level parallelism?
OpenMP fully supports loop-level parallelism. Loop-level parallelism is useful for applications which have lots of coarse loop-level parallelism, especially those that will never be run on large numbers of processors or for which restructuring the source code is either impractical or disallowed. Typically, though, the amount of loop-level parallelism in an application is limited, and this in turn limits the scalability of the application.
OpenMP allows you to use loop-level parallelism as a way to start scaling your application for multiple processors, but then move into coarser grain parallelism, while maintaining the value of your earlier investment. This incremental development strategy avoids the all-or-none risks involved in moving to message-passing or other parallel programming models.
What does orphaning mean?
In early shared-memory models, parallel directives were only permitted within the lexical extent of parallel regions. What this means to non-compiler writers is that the directives had to be defined in such a way that all information needed to parallelize a loop or subroutine had to be specified within the source for that loop or subroutine. If another subroutine was called, parallel information specific to that subroutine had to be specified at the call site, or the called subroutine had to b