This chapter gives guidelines for converting legacy programs using Sun or Cray directives and pragmas to OpenMP.
Note - Legacy Sun and Cray parallelization directives are now deprecated and no longer supported by Sun Studio compilers.
|
6.1 Converting Legacy Fortran Directives
Legacy Fortran programs use either Sun or Cray style parallelization directives. A description of these directives can be found in the chapter Parallelization in the Fortran Programming Guide.
6.1.1 Converting Sun-Style Fortran Directives
The following tables give OpenMP near equivalents to Sun parallelization directives and their subclauses. These are only suggestions.
TABLE 6-1 Converting Sun Parallelization Directives to OpenMP
Sun Directive
|
Equivalent OpenMP Directive
|
C$PAR DOALL [qualifiers]
|
!$omp parallel do [qualifiers]
|
C$PAR DOSERIAL
|
No exact equivalent. You can use:
!$omp master
loop
!$omp end master
|
C$PAR DOSERIAL*
|
No exact equivalent. You can use:
!$omp master
loopnest
!$omp end master
|
C$PAR TASKCOMMON block[,...]
|
!$omp threadprivate (/block/[,...])
|
The DOALL directive can take the following optional qualifier clauses.
TABLE 6-2 DOALL Qualifier Clauses and OpenMP Equivalent Clauses
Sun DOALL Clause
|
OpenMP PARALLEL DO Equivalent Clauses
|
PRIVATE(v1,v2,...)
|
private(v1,v2,...)
|
SHARED(v1,v2,...)
|
shared(v1,v2,...)
|
MAXCPUS(n)
|
num_threads(n). No exact equivalent.
|
READONLY(v1,v2,...)
|
No exact equivalent. You can achieve the same effect by using firstprivate(v1,v2,...).
|
STOREBACK(v1,v2,...)
|
lastprivate(v1,v2,...).
|
SAVELAST
|
No exact equivalent. You can achieve the same effect by using lastprivate(v1,v2,...).
|
REDUCTION(v1,v2,...)
|
reduction(operator:v1,v2,...) Must supply the reduction operator as well as the list of variables.
|
SCHEDTYPE(spec)
|
schedule(spec) (See TABLE 6-3)
|
The SCHEDTYPE(spec) clause accepts the following scheduling specifications.
TABLE 6-3 SCHEDTYPE Scheduling and OpenMP schedule Equivalents
SCHEDTYPE(spec)
|
OpenMP schedule(spec) Clause Equivalent
|
SCHEDTYPE(STATIC)
|
schedule(static)
|
SCHEDTYPE(SELF(chunksize))
|
schedule(dynamic,chunksize)
Default chunksize is 1.
|
SCHEDTYPE(FACTORING(m))
|
No exact equivalent.
|
SCHEDTYPE(GSS(m))
|
schedule(guided, m)
Default m is 1.
|
6.1.1.1 Issues Between Sun-Style Fortran Directives and OpenMP
- Scoping of private variables must be declared explicitly with OpenMP. With Sun directives, the compiler uses its own default scoping rules for variables not explicitly scoped in a PRIVATE or SHARED clause: all scalars are treated as PRIVATE, and all array references are SHARED. With OpenMP, the default data scope is SHARED unless a DEFAULT(PRIVATE) clause appears on the PARALLEL DO directive. A DEFAULT(NONE) clause causes the compiler to flag variables not scoped explicitly. However, see Chapter 3 for information on autoscoping in Fortran.
- Since there is no DOSERIAL directive, mixing automatic and explicit OpenMP parallelization may have different effects: some loops may be automatically parallelized that would not have been with Sun directives.
- OpenMP provides a richer parallelism model by providing parallel regions and parallel sections. It could be possible to get better performance by redesigning the parallelism strategies of a program that uses Sun directives to take advantage of these features of OpenMP.
6.1.2 Converting Cray-Style Fortran Directives
Cray-style Fortran parallelization directives are identical to Sun-style except that the sentinel that identifies these directives is !MIC$. Also, the set of qualifier clauses on the !MIC$ DOALL is different.
TABLE 6-4 OpenMP Equivalents for Cray-Style DOALL Qualifier Clauses
Cray DOALL Clause
|
OpenMP PARALLEL DO Equivalent Clauses
|
SHARED(v1,v2,...)
|
SHARED(v1,v2,...)
|
PRIVATE(v1,v2,...)
|
PRIVATE(v1,v2,...)
|
AUTOSCOPE
|
No equivalent. Scoping must be explicit, or with the DEFAULT clause, or with the __AUTO clause
|
SAVELAST
|
No exact equivalent. You can achieve the same effect by using lastprivate.
|
MAXCPUS(n)
|
num_threads(n). No exact equivalent.
|
GUIDED
|
schedule(guided, m)
Default m is 1.
|
SINGLE
|
schedule(dynamic,1)
|
CHUNKSIZE(n)
|
schedule(dynamic,n)
|
NUMCHUNKS(m)
|
schedule(dynamic,n/m) where n is the number of iterations
|
6.1.2.1 Issues Between Cray-Style Fortran Directives and OpenMP Directives
The differences are the same as for Sun-style directives, except that there is no equivalent for the Cray AUTOSCOPE.
6.2 Converting Legacy C Pragmas
The C compiler accepts legacy pragmas for explicit parallelization. These are described in the C User's Guide. As with the Fortran directives, these are only suggestions.
The legacy parallelization pragmas are:
TABLE 6-5 Converting Legacy C Parallelization Pragmas to OpenMP
Legacy C Pragma
|
Equivalent OpenMP Pragma
|
#pragma MP taskloop [clauses]
|
#pragma omp parallel for [clauses]
|
#pragma MP serial_loop
|
No exact equivalent. You can use
#pragma omp master
loop
|
#pragma MP serial_loop_nested
|
No exact equivalent. You can use
#pragma omp master
loopnest
|
The taskloop pragma can take on one or more of the following optional clauses.
TABLE 6-6 taskloop Optional Clauses and OpenMP Equivalents
taskloop Clause
|
OpenMP parallel for Equivalent Clause
|
maxcpus(n)
|
No exact equivalent. Use num_threads(n)
|
private(v1,v2,...)
|
private(v1,v2,...)
|
shared(v1,v2,...)
|
shared(v1,v2,...)
|
readonly(v1,v2,...)
|
No exact equivalent. You can achieve the same effect by using firstprivate(v1,v2,...).
|
storeback(v1,v2,...)
|
You can achieve the same effect by using lastprivate(v1,v2,...).
|
savelast
|
No exact equivalent. You can achieve the same effect by using lastprivate(v1,v2,...).
|
reduction(v1,v2,...)
|
reduction(operator:v1,v2,...). Must supply the reduction operator as well as the list of variables.
|
schedtype(spec)
|
schedule(spec) (See TABLE 6-7)
|
The schedtype(spec) clause accepts the following scheduling specifications.
TABLE 6-7 SCHEDTYPE Scheduling and OpenMP schedule Equivalents
schedtype(spec)
|
OpenMP schedule(spec) Clause Equivalent
|
SCHEDTYPE(STATIC)
|
schedule(static)
|
SCHEDTYPE(SELF(chunksize))
|
schedule(dynamic,chunksize)
Note: Default chunksize is 1.
|
SCHEDTYPE(FACTORING(m))
|
No exact equivalent.
|
SCHEDTYPE(GSS(m))
|
schedule(guided, m)
Default m is 1.
|
6.2.1 Issues Between Legacy C Pragmas and OpenMP
- OpenMP scopes variables declared within a parallel construct as private. A default(none) clause on a #pragma omp parallel for directive causes the compiler to flag variables not scoped explicitly.
- Since there is no serial_loop directive, mixing automatic and explicit OpenMP parallelization may have different effects: some loops may be automatically parallelized that would not have been with legacy C directives.
- Because OpenMP provides a richer parallelism model, it is often possible to get better performance by redesigning the parallelism strategies of a program that uses legacy C directives to take advantage of these features.
OpenMP API User's Guide
|
819-3694-10
|
|
Copyright © 2005, Sun Microsystems, Inc. All Rights Reserved.