Each process has associated with it a unique data environment that provides a context for execution. The initial process (i.e. at program start up) has associated with it an initial data environment that exists for the duration of the program. New data environments are constructed only for new processes created during program execution. The objects comprising a data environment may have one of three basic attributes: SHARED, PRIVATE, or REDUCTION.
The concept of REDUCTION as an attribute is new in OpenMP. Reduction operations are important to many applications and the REDUCTION attribute allows these to be efficiently implemented by the compiler. This is especially important on cache based systems where the compiler can take care to eliminate any false sharing. On large scale SSMP architectures the compiler also may choose to implement tree-based reductions for even better performance.
OpenMP has a very rich data environment. In addition to the REDUCTION attribute, OpenMP allows PRIVATE initialization with FIRSTPRIVATE and COPYIN, and some limited PRIVATE persistence with LASTPRIVATE. None of these features exist in X3H5 but experience has indicated a real need for them.
Global objects can be made PRIVATE with the THREADPRIVATE (in Fortran) directive. In the interest of performance, OpenMP implements a ``p-copy'' model for privatizing global objects. In other words, THREADPRIVATE will create p copies of the global object, one for each of the p members in the team executing the parallel region. Often, however, it is desirable either from memory constraints or for algorithmic reasons to privatize only certain elements from a compound global object. In either X3H5 or the DOACROSS model this would require splitting the compound object. This can be a tedious and error prone process, greatly adding to the programming effort required in parallelizing existing software. OpenMP solves this problem by allowing individual elements of a compound global object to appear in a PRIVATE list.