Openmp* in Action
Total Page:16
File Type:pdf, Size:1020Kb
SC’05 OpenMP Tutorial OpenMP* in Action Tim Mattson Barbara Chapman Intel Corporation University of Houston Acknowledgements: Rudi Eigenmann of Purdue, Sanjiv Shah of Intel and others too numerous to name have contributed content for this tutorial. 1 * The name “OpenMP” is the property of the OpenMP Architecture Review Board. Agenda • Parallel computing, threads, and OpenMP • The core elements of OpenMP – Thread creation – Workshare constructs – Managing the data environment – Synchronization – The runtime library and environment variables – Recapitulation • The OpenMP compiler • OpenMP usage: common design patterns • Case studies and examples • Background information and extra details 2 The OpenMP API for Multithreaded Programming 1 SC’05 OpenMP Tutorial OpenMP* Overview: C$OMP FLUSH #pragma omp critical C$OMP THREADPRIVATE(/ABC/) CALL OMP_SET_NUM_THREADS(10) OpenMP: An API for Writing Multithreaded C$OMP parallel do shared(a, b, c) call omp_test_lock(jlok) Applications call OMP_INIT_LOCK (ilok) C$OMP ATOMIC C$OMP MASTER C$OMP SINGLEA setPRIVATE(X) of compilersetenv directives OMP_SCHEDULE and library “dynamic” routines for parallel application programmers C$OMP PARALLEL DO ORDERED PRIVATE (A, B, C) C$OMP ORDERED Greatly simplifies writing multi-threaded (MT) C$OMP PARALLELprograms REDUCTION in Fortran, (+: A, C andB) C++ C$OMP SECTIONS #pragma ompStandardizes parallel for lastprivate(A, 20 years B) of !$OMPSMP practice BARRIER C$OMP PARALLEL COPYIN(/blk/) C$OMP DO lastprivate(XX) Nthrds = OMP_GET_NUM_PROCS() omp_set_lock(lck) 3 * The name “OpenMP” is the property of the OpenMP Architecture Review Board. What are Threads? • Thread: an independent flow of control – Runtime entity created to execute sequence of instructions • Threads require: – A program counter – A register state – An area in memory, including a call stack – A thread id • A process is executed by one or more threads that share: – Address space – Attributes such as UserID, open files, working directory, 4 etc. The OpenMP API for Multithreaded Programming 2 SC’05 OpenMP Tutorial A Shared Memory Architecture Shared memory cache1 cache2 cache3 cacheN proc1 proc2 proc3 procN 5 How Can We Exploit Threads? • A thread programming model must provide (at least) the means to: – Create and destroy threads – Distribute the computation among threads – Coordinate actions of threads on shared data – (usually) specify which data is shared and which is private to a thread 6 The OpenMP API for Multithreaded Programming 3 SC’05 OpenMP Tutorial How Does OpenMP Enable Us to Exploit Threads? • OpenMP provides thread programming model at a “high level”. – The user does not need to specify all the details • Especially with respect to the assignment of work to threads • Creation of threads • User makes strategic decisions • Compiler figures out details • Alternatives: –MPI – POSIX thread library is lower level – Automatic parallelization is even higher level (user does nothing) • But usually successful on simple codes only 7 Where Does OpenMP Run? Hardware OpenMP Platforms support CPU CPU CPU CPU Shared Memory Available Systems cache cache cache cache Distributed Shared Available Memory Systems (ccNUMA) Shared bus Distributed Memory Available Systems via Software Shared Memory DSM Machines with Chip Available Shared memory architecture MultiThreading 8 The OpenMP API for Multithreaded Programming 4 SC’05 OpenMP Tutorial OpenMP Overview: How do threads interact? • OpenMP is a shared memory model. • Threads communicate by sharing variables. • Unintended sharing of data causes race conditions: • race condition: when the program’s outcome changes as the threads are scheduled differently. • To control race conditions: • Use synchronization to protect data conflicts. • Synchronization is expensive so: • Change how data is accessed to minimize the need for synchronization. 9 Agenda • Parallel computing, threads, and OpenMP • The core elements of OpenMP – Thread creation – Workshare constructs – Managing the data environment – Synchronization – The runtime library and environment variables – Recapitulation • The OpenMP compiler • OpenMP usage: common design patterns • Case studies and examples • Background information and extra details 10 The OpenMP API for Multithreaded Programming 5 The OpenMP API forMultithreaded Programming Prog. Layer System layer User layer • arecompiler oftheconstructsinOpenMP Most • and the OpenMPlibmodule Include file (OpenMP API) OpenMP ParallelComputingSolutionStack Some syntaxdetailstogetusstarted directives. Directives, – For CandC++,thedirect – Fortran,thedirectives arecommentsandtake For Compiler SC’05 OpenMP Tutorial form: one oftheforms: #pragma omp use omp_lib #include <omp.h> •(but works fixedformtoo) for form Free • Fixed form OS/system supportforsharedmemory. OS/system !$OMP *$OMP C$OMP construct [clause[clause] construct [clause[clause] construct [clause[clause] construct [clause[clause]…] construct Application OpenMP: OpenMP library Runtime library End User ives arepragmas withthe … … … ] ] ] Environment variables 12 11 6 SC’05 OpenMP Tutorial OpenMP: Structured blocks (C/C++) • Most OpenMP* constructs apply to structured blocks. • Structured block: a block with one point of entry at the top and one point of exit at the bottom. • The only “branches” allowed are STOP statements in Fortran and exit() in C/C++. #pragma omp parallel if(go_now()) goto more; { #pragma omp parallel int id = omp_get_thread_num(); { more: res[id] = do_big_job(id); int id = omp_get_thread_num(); if(!conv(res[id]) goto more; more: res[id] = do_big_job(id); } if(conv(res[id]) goto done; printf(“ All done \n”); go to more; } done: if(!really_done()) goto more; 13 A structured block Not A structured block OpenMP: Structured blocks (Fortran) – Most OpenMP constructs apply to structured blocks. • Structured block: a block of code with one point of entry at the top and one point of exit at the bottom. • The only “branches” allowed are STOP statements in Fortran and exit() in C/C++. C$OMP PARALLEL C$OMP PARALLEL 10 wrk(id) = garbage(id) 10 wrk(id) = garbage(id) res(id) = wrk(id)**2 30 res(id)=wrk(id)**2 if(.not.conv(res(id)) goto 10 if(conv(res(id))goto 20 C$OMP END PARALLEL go to 10 print *,id C$OMP END PARALLEL if(not_DONE) goto 30 20 print *, id 14 A structured block Not A structured block The OpenMP API for Multithreaded Programming 7 SC’05 OpenMP Tutorial OpenMP: Structured Block Boundaries • In C/C++: a block is a single statement or a group of statements between brackets {} #pragma omp parallel #pragma omp for { for(I=0;I<N;I++){ id = omp_thread_num(); res[I] = big_calc(I); res(id) = lots_of_work(id); A[I] = B[I] + res[I]; } } • In Fortran: a block is a single statement or a group of statements between directive/end-directive pairs. C$OMP PARALLEL DO C$OMP PARALLEL do I=1,N 10 wrk(id) = garbage(id) res(I)=bigComp(I) res(id) = wrk(id)**2 end do if(.not.conv(res(id)) goto 10 C$OMP END PARALLEL DO 15 C$OMP END PARALLEL OpenMP Definitions: “Constructs” vs. “Regions” in OpenMP OpenMP constructs occupy a single compilation unit while a region can span multiple source files. poo.f bar.f call whoami C$OMP PARALLEL subroutine whoami call whoami + external omp_get_thread_num C$OMP END PARALLEL integer iam, omp_get_thread_num iam = omp_get_thread_num() C$OMP CRITICAL A Parallel The Parallel print*,’Hello from ‘, iam construct region is the C$OMP END CRITICAL Orphan constructs text of the return can execute outside a construct plus end parallel region any code called inside the 16 construct The OpenMP API for Multithreaded Programming 8 SC’05 OpenMP Tutorial Agenda • Parallel computing, threads, and OpenMP • The core elements of OpenMP – Thread creation – Workshare constructs – Managing the data environment – Synchronization – The runtime library and environment variables – Recapitulation • The OpenMP compiler • OpenMP usage: common design patterns • Case studies and examples • Background information and extra details 17 The OpenMP* API Parallel Regions • You create threads in OpenMP* with the “omp parallel” pragma. • For example, To create a 4 thread Parallel region: double A[1000]; Runtime function to Each thread omp_set_num_threads(4); request a certain executes a number of threads copy of the #pragma omp parallel code within { the int ID = omp_get_thread_num(); structured pooh(ID,A); Runtime function block } returning a thread ID z Each thread calls pooh(ID,A) for ID = 0 to 3 18 * The name “OpenMP” is the property of the OpenMP Architecture Review Board The OpenMP API for Multithreaded Programming 9 SC’05 OpenMP Tutorial The OpenMP* API Parallel Regions • You create threads in OpenMP* with the “omp parallel” pragma. • For example, To create a 4 thread Parallel region: clause to request a certain double A[1000]; number of threads Each thread executes a copy of the #pragma omp parallel num_threads(4) code within { the int ID = omp_get_thread_num(); structured pooh(ID,A); Runtime function block } returning a thread ID z Each thread calls pooh(ID,A) for ID = 0 to 3 19 * The name “OpenMP” is the property of the OpenMP Architecture Review Board The OpenMP* API Parallel Regions double A[1000]; • Each thread executes omp_set_num_threads(4); the same code #pragma omp parallel redundantly. { int ID = omp_get_thread_num(); double A[1000]; pooh(ID, A); } omp_set_num_threads(4) printf(“all done\n”); A single copy of A pooh(0,A) pooh(1,A) pooh(2,A) pooh(3,A) is shared between all threads. printf(“all done\n”); Threads wait here for all threads to finish before proceeding (i.e. a barrier20) * The