HPC Lab - Session 2: OpenMP - TUM...TUM – SCCS HPC Lab Session 2: OpenMP Sebastian Rettenberger,...

17
TUM – SCCS HPC Lab Session 2: OpenMP Sebastian Rettenberger, Chaulio Ferreira, Michael Bader October 26, 2015 Rettenberger, Ferreira, Bader: HPC Lab Session 2: OpenMP, October 26, 2015 1

Transcript of HPC Lab - Session 2: OpenMP - TUM...TUM – SCCS HPC Lab Session 2: OpenMP Sebastian Rettenberger,...

Page 1: HPC Lab - Session 2: OpenMP - TUM...TUM – SCCS HPC Lab Session 2: OpenMP Sebastian Rettenberger, Chaulio Ferreira, Michael Bader October 26, 2015 Rettenberger, Ferreira, Bader: HPC

TUM – SCCS

HPC LabSession 2: OpenMP

Sebastian Rettenberger, Chaulio Ferreira, Michael Bader

October 26, 2015

Rettenberger, Ferreira, Bader: HPC Lab

Session 2: OpenMP, October 26, 2015 1

Page 2: HPC Lab - Session 2: OpenMP - TUM...TUM – SCCS HPC Lab Session 2: OpenMP Sebastian Rettenberger, Chaulio Ferreira, Michael Bader October 26, 2015 Rettenberger, Ferreira, Bader: HPC

TUM – SCCS

What is OpenMP?

“OpenMP is a specification for a set of compiler directives,library routines, and environment variables that can be

used to specify high-level parallelism in Fortran andC/C++ programs”

http://openmp.org/openmp-faq.html#WhatIs

Rettenberger, Ferreira, Bader: HPC Lab

Session 2: OpenMP, October 26, 2015 2

Page 3: HPC Lab - Session 2: OpenMP - TUM...TUM – SCCS HPC Lab Session 2: OpenMP Sebastian Rettenberger, Chaulio Ferreira, Michael Bader October 26, 2015 Rettenberger, Ferreira, Bader: HPC

TUM – SCCS

Shared-Memory-Parallelism

• Transparent programming view: Coresaccess “same” memory

• In hardware: Be aware of layout,e.g. NUMA; first touch policy

https://computing.llnl.gov/tutorials/openMP/

Sandy Bridge CPU,http://www.bit-tech.net/hardware/cpus/2011/01/03/intel-sandy-bridge-review/1

Knights Corner and Knights Landing,http://www.zdnet.com/sc13-intel-reveals-knights-landing-high-performance-cpu-7000023393/

Rettenberger, Ferreira, Bader: HPC Lab

Session 2: OpenMP, October 26, 2015 3

Page 4: HPC Lab - Session 2: OpenMP - TUM...TUM – SCCS HPC Lab Session 2: OpenMP Sebastian Rettenberger, Chaulio Ferreira, Michael Bader October 26, 2015 Rettenberger, Ferreira, Bader: HPC

TUM – SCCS

Fork-Join Model

https://computing.llnl.gov/tutorials/openMP/#ProgrammingModel

Rettenberger, Ferreira, Bader: HPC Lab

Session 2: OpenMP, October 26, 2015 4

Page 5: HPC Lab - Session 2: OpenMP - TUM...TUM – SCCS HPC Lab Session 2: OpenMP Sebastian Rettenberger, Chaulio Ferreira, Michael Bader October 26, 2015 Rettenberger, Ferreira, Bader: HPC

TUM – SCCS

A Simple Loop

1 #include <omp.h>2 // some initialization3

4 #pragma omp parallel for5 for (i = 0; i < n; i++) {6 for (j = 0; j < n; j++) {7 // do some work8 }9 }

OpenMP - Parallel programming on shared mem-ory systemshttps://www.lrz.de/services/software/parallel/openmp/

Rettenberger, Ferreira, Bader: HPC Lab

Session 2: OpenMP, October 26, 2015 5

Page 6: HPC Lab - Session 2: OpenMP - TUM...TUM – SCCS HPC Lab Session 2: OpenMP Sebastian Rettenberger, Chaulio Ferreira, Michael Bader October 26, 2015 Rettenberger, Ferreira, Bader: HPC

TUM – SCCS

OMP: An Overview

• Compiler-directives:#pragma omp ...[clause[[,] clause]...]

• Work-sharing#pragma omp for ..., and many more

• Synchronization#pragma omp barrier, and many more

• Data Scope Clausesshared, private, firstprivate, reduction, ...

• Library routinesomp get num threads(), omp get thread num(), ...

Rettenberger, Ferreira, Bader: HPC Lab

Session 2: OpenMP, October 26, 2015 6

Page 7: HPC Lab - Session 2: OpenMP - TUM...TUM – SCCS HPC Lab Session 2: OpenMP Sebastian Rettenberger, Chaulio Ferreira, Michael Bader October 26, 2015 Rettenberger, Ferreira, Bader: HPC

TUM – SCCS

Compilation and Execution

• compile with additional Compiler-Flag -openmp (-fopenmp incase of gcc):icc -openmp -o my algorithm alg.c

• export OMP NUM THREADS=number of threads

./my algorithm

Rettenberger, Ferreira, Bader: HPC Lab

Session 2: OpenMP, October 26, 2015 7

Page 8: HPC Lab - Session 2: OpenMP - TUM...TUM – SCCS HPC Lab Session 2: OpenMP Sebastian Rettenberger, Chaulio Ferreira, Michael Bader October 26, 2015 Rettenberger, Ferreira, Bader: HPC

TUM – SCCS

Parallel Region

1 #pragma omp parallel [clause[[,] clause]...]2 structured block

• code within parallel region is executed by all threads

1 #include <omp.h>2 // more initialization ...3

4 #pragma omp parallel private(size, rank) {5 size = omp_get_num_threads();6 rank = omp_get_thread_num();7 printf("Hello World! (Thread %d of %d)", rank, size);8 }

Rettenberger, Ferreira, Bader: HPC Lab

Session 2: OpenMP, October 26, 2015 8

Page 9: HPC Lab - Session 2: OpenMP - TUM...TUM – SCCS HPC Lab Session 2: OpenMP Sebastian Rettenberger, Chaulio Ferreira, Michael Bader October 26, 2015 Rettenberger, Ferreira, Bader: HPC

TUM – SCCS

Work Sharing: for#pragma omp for [clause[[,] clause]...]

for-loop

• within a parallel region and directly in front of afor -loop

• iterations are scheduled across different threads

• schedule clause determines how to map iterationsto threads

• schedule(static[, chunksize]) default-valuechunksize is #iterations divided by #threadsschedule(dynamic[,chunksize]) default-valuechunksize is 1schudule(runtime) Scheduling is given byenvironment variable OMP SCHEDULE

• implicit synchronization ad the end of for -loop (canbe disabled with nowait clause)

• shortcut possible: #pragma omp parallel for

https://computing.llnl.gov/tutorials/openMP/

Rettenberger, Ferreira, Bader: HPC Lab

Session 2: OpenMP, October 26, 2015 9

Page 10: HPC Lab - Session 2: OpenMP - TUM...TUM – SCCS HPC Lab Session 2: OpenMP Sebastian Rettenberger, Chaulio Ferreira, Michael Bader October 26, 2015 Rettenberger, Ferreira, Bader: HPC

TUM – SCCS

Work Sharing: for#pragma omp for [clause[[,] clause]...]

for-loop

• within a parallel region and directly in front of afor -loop

• iterations are scheduled across different threads

• schedule clause determines how to map iterationsto threads

• schedule(static[, chunksize]) default-valuechunksize is #iterations divided by #threadsschedule(dynamic[,chunksize]) default-valuechunksize is 1schudule(runtime) Scheduling is given byenvironment variable OMP SCHEDULE

• implicit synchronization ad the end of for -loop (canbe disabled with nowait clause)

• shortcut possible: #pragma omp parallel for

Intel, Load Balance andParallel Performance,https://software.intel.com/en-us/articles/load-balance-and-parallel-performance

Rettenberger, Ferreira, Bader: HPC Lab

Session 2: OpenMP, October 26, 2015 9

Page 11: HPC Lab - Session 2: OpenMP - TUM...TUM – SCCS HPC Lab Session 2: OpenMP Sebastian Rettenberger, Chaulio Ferreira, Michael Bader October 26, 2015 Rettenberger, Ferreira, Bader: HPC

TUM – SCCS

Work Sharing: task

#pragma omp task [clause[[,] clause]...]

structured block

where clause can be. . .

• final(expression): if expression is true, task isexecuted sequentially; no recursive taskgeneration

• untied: the execution of a task is no tied onesingle thread

• shared | firstprivate | private [...]

#pragma omp taskwait: waits for children completionIntel, Load Balance andParallel Performance,https://software.intel.com/en-us/articles/load-balance-and-parallel-performance

Rettenberger, Ferreira, Bader: HPC Lab

Session 2: OpenMP, October 26, 2015 10

Page 12: HPC Lab - Session 2: OpenMP - TUM...TUM – SCCS HPC Lab Session 2: OpenMP Sebastian Rettenberger, Chaulio Ferreira, Michael Bader October 26, 2015 Rettenberger, Ferreira, Bader: HPC

TUM – SCCS

“Work Sharing”: single

#pragma omp single [clause[[,] clause]...]

structured block

where clause can be. . .

• use only one (arbitrary) thread

• implicit synchronization

#pragma omp master

structured block

• use only master thread for structured block

• NO synchronization at the end https://computing.llnl.gov/tutorials/openMP/

Rettenberger, Ferreira, Bader: HPC Lab

Session 2: OpenMP, October 26, 2015 11

Page 13: HPC Lab - Session 2: OpenMP - TUM...TUM – SCCS HPC Lab Session 2: OpenMP Sebastian Rettenberger, Chaulio Ferreira, Michael Bader October 26, 2015 Rettenberger, Ferreira, Bader: HPC

TUM – SCCS

Synchronization

• #pragma omp barrier: block execution until all threads havereached the barrier

• #pragma omp critical:structured block

• only one thread at a time can execute the structured blockencapsulated by critical

• Warning: Use carefully; can definitely kill performance!

Rettenberger, Ferreira, Bader: HPC Lab

Session 2: OpenMP, October 26, 2015 12

Page 14: HPC Lab - Session 2: OpenMP - TUM...TUM – SCCS HPC Lab Session 2: OpenMP Sebastian Rettenberger, Chaulio Ferreira, Michael Bader October 26, 2015 Rettenberger, Ferreira, Bader: HPC

TUM – SCCS

Reduction

reduction(operator: list)

• executes a reduction of variables in list using operator• available operators: +, ∗, -, &&, ||

since OpenMP 3.1: min, max

1 #pragma omp parallel for private(r), reduction(+: sum)2 for(i = 0; i < n; i++) {3 r = compute_r(i);4 sum = sum + r;5 }

Rettenberger, Ferreira, Bader: HPC Lab

Session 2: OpenMP, October 26, 2015 13

Page 15: HPC Lab - Session 2: OpenMP - TUM...TUM – SCCS HPC Lab Session 2: OpenMP Sebastian Rettenberger, Chaulio Ferreira, Michael Bader October 26, 2015 Rettenberger, Ferreira, Bader: HPC

TUM – SCCS

Scopes

• private(list): declares variables in list as private for eachthread (no copy!)

• shared(list): variables in list are used by all threads (raceconditions are possible!), write accesses have to be handled bythe programmer

• firstprivate(list): private variables and init them with thelatest valid value before parallel region

• lastprivate(list): after parallel execution, in serial partreused last modification

• . . .• default data scope is shared, but exceptions exit⇒ be precise!

• local variables are always private• loop-variables of for -loops are private• Changes between OpenMP-2 and OpenMP-3!

Rettenberger, Ferreira, Bader: HPC Lab

Session 2: OpenMP, October 26, 2015 14

Page 16: HPC Lab - Session 2: OpenMP - TUM...TUM – SCCS HPC Lab Session 2: OpenMP Sebastian Rettenberger, Chaulio Ferreira, Michael Bader October 26, 2015 Rettenberger, Ferreira, Bader: HPC

TUM – SCCS

Fill the Gaps

1 k = compute_k();2

3 #pragma omp parallel for private(?), shared(?), firstprivate(?),lastprivate(?), reduction(?)

4 for (i = 0; i < n; i++) {5 k = compute_my_k(i, k);6 r = compute_r(i, k, h);7 sum = sum + r;8 }

Rettenberger, Ferreira, Bader: HPC Lab

Session 2: OpenMP, October 26, 2015 15

Page 17: HPC Lab - Session 2: OpenMP - TUM...TUM – SCCS HPC Lab Session 2: OpenMP Sebastian Rettenberger, Chaulio Ferreira, Michael Bader October 26, 2015 Rettenberger, Ferreira, Bader: HPC

TUM – SCCS

NUMA

• Non-uniform memory access(NUMA): Not all cores accessall memory in the same time

• Pinning: Use close-to-corememory as far as possible

• Linux first touch policy:not the malloc counts butthe first (write) access

• numactl has someoptions

Georg Hager’s Blog,http://blogs.fau.de/hager/

Rettenberger, Ferreira, Bader: HPC Lab

Session 2: OpenMP, October 26, 2015 16