0% found this document useful (0 votes)
45 views25 pages

Lecture Open MP

OpenMP is a specification for multi-platform shared memory parallel programming. It uses compiler directives, library routines, and environment variables to define parallel regions of code. OpenMP allows a programmer to separate serial and parallel regions of a program without managing threads directly. It provides constructs for parallelizing loops and synchronizing threads that hide complexity and allow portable parallel programming across platforms.
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PPT, PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
45 views25 pages

Lecture Open MP

OpenMP is a specification for multi-platform shared memory parallel programming. It uses compiler directives, library routines, and environment variables to define parallel regions of code. OpenMP allows a programmer to separate serial and parallel regions of a program without managing threads directly. It provides constructs for parallelizing loops and synchronizing threads that hide complexity and allow portable parallel programming across platforms.
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PPT, PDF, TXT or read online on Scribd
You are on page 1/ 25

Parallel

Programming
with OpenMP

CS240A, T. Yang, 2013


Modified from Demmel/Yelick’s
and Mary Hall’s Slides

1
Introduction to OpenMP
• What is OpenMP?
• Open specification for Multi-Processing
• “Standard” API for defining multi-threaded shared-memory
programs
• openmp.org – Talks, examples, forums, etc.

• High-level API
• Preprocessor (compiler) directives ( ~ 80% )
• Library Calls ( ~ 19% )
• Environment Variables ( ~ 1% )

2
A Programmer’s View of OpenMP
• OpenMP is a portable, threaded, shared-memory
programming specification with “light” syntax
• Exact behavior depends on OpenMP implementation!
• Requires compiler support (C or Fortran)

• OpenMP will:
• Allow a programmer to separate a program into serial regions and
parallel regions, rather than T concurrently-executing threads.
• Hide stack management
• Provide synchronization constructs

• OpenMP will not:


• Parallelize automatically
• Guarantee speedup
• Provide freedom from data races

3
Motivation – OpenMP

int main() {

// Do this part in parallel

printf( "Hello, World!\n" );

return 0;
}

4
Motivation – OpenMP

int main() {

omp_set_num_threads(4);

// Do this part in parallel Printf Printf Printf Printf


#pragma omp parallel
{
printf( "Hello, World!\n" );
}

return 0;
}

5
OpenMP parallel region construct
• Block of code to be executed by multiple threads in
parallel
• Each thread executes the same code redundantly
(SPMD)
• Work within work-sharing constructs is distributed among the
threads in a team
• Example with C/C++ syntax
#pragma omp parallel [ clause [ clause ] ... ] new-line
structured-block
• clause can include the following:
private (list)
shared (list)
OpenMP Data Parallel Construct: Parallel Loop
• All pragmas begin: #pragma
• Compiler calculates loop bounds for each thread directly
from serial source (computation decomposition)
• Compiler also manages data partitioning
• Synchronization also automatic (barrier)
Programming Model – Parallel Loops
• Requirement for parallel loops
• No data dependencies
(reads/write or write/write
pairs) between iterations!

• Preprocessor calculates loop


bounds and divide iterations
among parallel threads

#pragma omp parallel for


?
for( i=0; i < 25; i++ )
{
printf(“Foo”);
}
8
OpenMp: Parallel Loops with Reductions
• OpenMP supports reduce operation
sum = 0;
#pragma omp parallel for reduction(+:sum)
for (i=0; i < 100; i++) {
sum += array[i];
}

• Reduce ops and init() values (C and C++):


+ 0 bitwise & ~0 logical & 1
- 0 bitwise | 0 logical | 0
* 1 bitwise ^ 0
Example: Trapezoid Rule for Integration

• Straight-line approximation
1
f ( x )dx   c i f ( x i )  c 0 f ( x 0 )  c 1 f ( x 1 )
b
a
i 0

h
  f ( x 0 )  f ( x 1 )
2
f(x)

L(x)

x0 x1 x
Composite Trapezoid Rule
b x1 x2 xn

a
f(x)dx   f(x)dx   f(x)dx    
x0 x1 xn  1
f(x)dx
h
  f(x0 )  f(x1 )  h  f(x1 )  f(x 2 )    h  f(x n1 )  f(x n )
2 2 2
h
  f(x 0 )  2 f(x 1 )    2f(x i )    2 f ( x n  1 )  f ( x n )
2
f(x)

ba
h
n
x0 h x1 h x2 h x3 h x4 x
Serial algorithm for composite trapezoid rule

f(x)

x h x h x2 h x3 h x4 x
From Serial Code to Parallel Code
f(x)

x h x h x h x h x
0 1 2 3 4
Programming Model – Loop Scheduling
• schedule clause determines how loop iterations are
divided among the thread team
• static([chunk]) divides iterations statically between
threads
• Each thread receives [chunk] iterations, rounding as necessary to
account for all iterations
• Default [chunk] is ceil( # iterations / # threads )
• dynamic([chunk]) allocates [chunk] iterations per thread,
allocating an additional [chunk] iterations when a thread
finishes
• Forms a logical work queue, consisting of all loop iterations
• Default [chunk] is 1
• guided([chunk]) allocates dynamically, but [chunk] is
exponentially reduced with each allocation

14
Loop scheduling options

2(2)
Impact of Scheduling Decision
• Load balance
• Same work in each iteration?
• Processors working at same speed?
• Scheduling overhead
• Static decisions are cheap because they require no run-time
coordination
• Dynamic decisions have overhead that is impacted by
complexity and frequency of decisions
• Data locality
• Particularly within cache lines for small chunk sizes
• Also impacts data reuse on same processor
More loop scheduling attributes
• RUNTIME The scheduling decision is deferred until
runtime by the environment variable OMP_SCHEDULE.
It is illegal to specify a chunk size for this clause.
• AUTO The scheduling decision is delegated to the
compiler and/or runtime system.
• NO WAIT / nowait: If specified, then threads do not
synchronize at the end of the parallel loop.
• ORDERED: Specifies that the iterations of the loop must
be executed as they would be in a serial program.
• COLLAPSE: Specifies how many loops in a nested loop
should be collapsed into one large iteration space and
divided according to the schedule clause (collapsed
order corresponds to original sequential order).
OpenMP environment variables
OMP_NUM_THREADS
 sets the number of threads to use during execution
 when dynamic adjustment of the number of threads is enabled, the
value of this environment variable is the maximum number of
threads to use
 For example,
setenv OMP_NUM_THREADS 16 [csh, tcsh]
export OMP_NUM_THREADS=16 [sh, ksh, bash]
OMP_SCHEDULE
 applies only to do/for and parallel do/for directives that have the
schedule type RUNTIME
 sets schedule type and chunk size for all such loops
 For example,
setenv OMP_SCHEDULE GUIDED,4 [csh, tcsh]
export OMP_SCHEDULE= GUIDED,4 [sh, ksh, bash]
Programming Model – Data Sharing
• Parallel programs often employ
// shared, globals
two types of data
• Shared data, visible to all int bigdata[1024];
threads, similarly named
• Private data, visible to a single
void* foo(void* bar) {
thread (often stack-allocated)
intprivate,
// tid; stack
• PThreads:
• Global-scoped variables are int tid;
shared #pragma omp parallel \
• Stack-allocated variables are
private shared
/* ( bigdata
Calculation ) \
goes
private ( tid )
here */
• OpenMP:
• shared variables are shared } {
• private variables are private /* Calc. here */
}
}
19
Programming Model - Synchronization
• OpenMP Synchronization
#pragma omp critical
• OpenMP Critical Sections
{
• Named or unnamed /* Critical code here */
• No explicit locks / mutexes }

• Barrier directives
#pragma omp barrier

• Explicit Lock functions omp_set_lock( lock l );


• When all else fails – may /* Code goes here */
require flush directive omp_unset_lock( lock l );

• Single-thread regions within#pragma omp single


parallel regions {
• master, single directives /* Only executed once */
}

20
Microbenchmark: Grid Relaxation (Stencil)

for( t=0; t < t_steps; t++) {


#pragma omp parallel for \
shared(grid,x_dim,y_dim) private(x,y)

for( x=0; x < x_dim; x++) {


for( y=0; y < y_dim; y++) {
grid[x][y] = /* avg of neighbors */
}
}
// Implicit Barrier Synchronization
temp_grid = grid;
grid = other_grid;
} other_grid = temp_grid;

CS267 Lecture 6 21
Microbenchmark: Ocean

CS267 Lecture 6 22
Microbenchmark: Ocean

CS267 Lecture 6 23
OpenMP Summary
• OpenMP is a compiler-based technique to create
concurrent code from (mostly) serial code
• OpenMP can enable (easy) parallelization of loop-based
code
• Lightweight syntactic language extensions

• OpenMP performs comparably to manually-coded


threading
• Scalable
• Portable

• Not a silver bullet for all applications

25
More Information

• openmp.org
• OpenMP official site

• www.llnl.gov/computing/tutorials/openMP/
• A handy OpenMP tutorial

• www.nersc.gov/nusers/help/tutorials/openmp/
• Another OpenMP tutorial and reference

CS267 Lecture 6 26

You might also like