Академический Документы
Профессиональный Документы
Культура Документы
Compiler Directives
Runtime Library Routines
Environment Variables
An abbreviation for:
Explicit Parallelism:
Nested Parallelism:
Dynamic Threads:
I/O:
All OpenMP programs begin as a single process: the master thread. The master thread
executes sequentially until the first parallel region construct is encountered.
FORK: the master thread then creates a team of parallel threads.
The statements in the program that are enclosed by the parallel region construct are
then executed in parallel among the various team threads.
JOIN: When the team threads complete the statements in the parallel region construct,
they synchronize and terminate, leaving only the master thread.
The number of parallel regions and the threads that comprise them are arbitrary.
Three Components
The OpenMP API is comprised of three distinct components. As of
version 3.1:
Compiler Directives (20)
Runtime Library Routines (32)
Environment Variables (9)
The application developer decides how to employ these
components. In the simplest case, only a few of them are needed.
Implementations differ in their support of all API components. For
example, an implementation may state that it supports nested
parallelism, but the API makes it clear that may be limited to a
single thread - the master thread. Not exactly what the developer
might expect?
main () {
INTEGER VAR1, VAR2, VAR3
int var1, var2, var3;
Serial code
. Serial code
. .
. .
.
Beginning of parallel section. Fork a team of threads.
Beginning of parallel section. Fork a team of threads.
Specify variable scoping
Specify variable scoping
!$OMP PARALLEL PRIVATE(VAR1, VAR2) #pragma omp parallel private(var1, var2) shared(var3)
SHARED(VAR3) {
Parallel section executed by all threads Parallel section executed by all threads
. .
Other OpenMP directives Other OpenMP directives
. .
Run-time Library calls
Run-time Library calls
.
.
All threads join master thread and disband
All threads join master thread and disband
}
!$OMP END PARALLEL
Resume serial code
Resume serial code .
. .
. .
.
}
END
10/6/2020 Advanced Computers Architecture 20
COMPILING OPENMP PROGRAMS
All the compilers require to use the appropriate compiler flag to "turn on"
OpenMP compilations. The table below shows what to use for each compiler.
Compiler / Platform Compiler Flag
Intel icc -openmp
Linux Opteron/Xeon icpc
ifort
PGI pgcc -mp
Linux Opteron/Xeon pgCC
pgf77
pgf90
GNU gcc -fopenmp
Linux Opteron/Xeon g++
IBM Blue Gene g77
gfortran
IBM bgxlc_r, bgcc_r -qsmp=omp
Blue Gene bgxlC_r, bgxlc++_r
bgxlc89_r
bgxlc99_r
bgxlf_r
bgxlf90_r
bgxlf95_r
bgxlf2003_r
*Be sure to use a thread-safe compiler -
its name ends with _r
All Fortran OpenMP directives A valid OpenMP directive. Must Optional. Clauses can be in any
must begin with a sentinel. The appear after the sentinel and before order, and repeated as necessary
accepted sentinels depend upon any clauses. unless otherwise restricted.
the type of Fortran source.
Possible sentinels are:
!$OMP
C$OMP
*$OMP
Example
!$OMP PARALLEL DEFAULT(SHARED) PRIVATE(BETA,PI)
Required for all A valid OpenMP directive. Optional. Clauses can be Required. Precedes the
OpenMP C/C++ Must appear after the in any order, and repeated structured block which is
directives. pragma and before any as necessary unless enclosed by this directive.
clauses. otherwise restricted.
Example
#pragma omp parallel default(shared) private(beta, pi)
block
structured_block
C Fork a team of threads with each thread having a /* Fork a team of threads with each thread having a private
private TID variable tid variable */
!$OMP PARALLEL PRIVATE(TID) #pragma omp parallel private(tid)
{
C Obtain and print thread id
TID = OMP_GET_THREAD_NUM() /* Obtain and print thread id */
PRINT *, 'Hello World from thread = ', TID tid = omp_get_thread_num();
printf("Hello World from thread = %d\n", tid);
C Only master thread does this
IF (TID .EQ. 0) THEN /* Only master thread does this */
NTHREADS = OMP_GET_NUM_THREADS() if (tid == 0)
PRINT *, 'Number of threads = ', NTHREADS {
END IF nthreads = omp_get_num_threads();
printf("Number of threads = %d\n", nthreads);
C All threads join master thread and disband }
!$OMP END PARALLEL
} /* All threads join master thread and terminate */
END
}