OpenMP OpenMP OpenMP OpenMP OpenMP MPI OpenMP
OpenMP 2006-10-9 2
OpenMP ( ) OpenMP RedHat Linux Intel C OpenMP 2006-10-9 3
OpenMP OpenMP OpenMP OpenMP 2006-10-9 4
RedHat Linux Intel C root intel8.1 chmod +x *.sh install.sh /opt/intel_cc_80/lib/lib* /lib PATH /opt/intel_cc_80/bin/ /opt/intel_cc_80/bin/icc icc 2006-10-9 5
OpenMP F O R K J O I N F O R K J O I N FORK parallel JOIN parallel 2006-10-9 6
( ) ( ) 2006-10-9 7
#include <omp.h> int main(int argc, char *argv[]){ int nthreads, ithread; #pragma omp parallel private(nthreads, ithread) { ithread = omp_get_thread_num(); nthreads = omp_get_num_threads(); #pragma omp critical printf( The %d-th thread of %d threads.\n, ithread, nthreads); } return(0); } 2006-10-9 8
OpenMP OpenMP parallel parallel parallel OpenMP threadprivate 2006-10-9 9
OpenMP C #pragma omp directive-name [clause ][clause ]... new-line Fortran sentinel directive_name [clause, ][clause, ]... sentinel C$OMP *$OMP!$OMP 2006-10-9 10
OpenMP C #ifdef_openmp iam=omp_get_thread_num()+index; #endif Fortran C$ iam=omp_get_thread_num()+index 2006-10-9 11
parallel #pragma omp parallel [clause ][clause ] parallel clause if num_threads (2.0 ) private firstprivate shared default copyin reduction 2006-10-9 12
parallel if( ) num_threads( ) private( ) shared( ) firstprivate( ) private copyin( ) firstprivate threadprivate 2006-10-9 13
parallel ( ) default(shared none) private firstprivate default default(shared) shared ( threadprivate ) default(shared) default(none) ( threadprivate for parallel for ) parallel default 2006-10-9 14
parallel ( ) reduction(op ) op op + * & ^ && op x = x op expr x <binop> = expr x = expr op x ( - ) x++ x-- ++x --x binop + & ^ reduction 2006-10-9 15
private firstprivate reduction shared 2006-10-9 16
parallel for sections single 2006-10-9 17
for #pragma omp for [clause ][clause ] /* for */ clause private firstprivate lastprivate reduction schedule nowait ordered 2006-10-9 18
for clause lastprivate lastprivate firstprivate ordered for ordered nowait for parallel for 2006-10-9 19
for clause ( ) nowait #pragma omp parallel shared(m,n,a,b) { } #pragma omp for schedule(static) nowait for (k = 0; k<n; k++) a[k] = a[k] + 1; #pragma omp for schedule(static) for (k = 0; k<m; k++) b[k] = b[k] * 2; 2006-10-9 20
for clause ( ) schedule(static dynamic guided runtime[, chunk_size]) Schedule(static[, chunk_size]) Schedule(dynamic[, chunk_size]) static Schedule(guided[, chunk_size]) chunk_size Schedule(runtime) OMP_SCHEDULE schedule schedule(runtime) OMP_SCHEDULE OpenMP 2006-10-9 21
for for for break for for for schedule ordered nowait chunk_size 2006-10-9 22
sections #pragma omp sections [clause ][clause ] { [#pragma omp section /* */ ] [#pragma omp section /* */ ] } 2006-10-9 23
sections ( ) Sections clause private firstprivate lastprivate reduction nowait nowait sections nowait section sections 2006-10-9 24
sections ( ) #pragma omp parallel { #pragma omp sections { #pragma omp section { T0(); } #pragma omp section { T1(); } } } 2006-10-9 25
single single #pragma omp single [clause ][clause ] /* */ clause private firstprivate nowait nowait single 2006-10-9 26
Parallel parallel for #pragma omp parallel for [clause ][clause ] /* for */ clause parallel for nowait 2006-10-9 27
Parallel ( ) parallel sections #pragma omp parallel sections [clause ][clause ] { } [#pragma omp section /* */ ] [#pragma omp section /* */ ] 2006-10-9 28
OpenMP barrier master critical atomic flush ordered 2006-10-9 29
barrier #pragma omp barrier if(x==0) #pragma omp barrier if(x==0){ #pragma omp barrier } 2006-10-9 30
master #pragma omp master /* */ single 2006-10-9 31
critical #pragma omp critical [(name)] /* */ (name) 2006-10-9 32
critical ( ) #pragma omp parallel sections { #pragma omp parallel section {/* producer thread */ } task = produce_task(); #pragma omp critical (queue) { } insert_into_queue(task); #pragma omp parallel section {/* consumer thread */ #pragma omp critical (queue) { task = extract_queue(task); } consume_task(task); } } 2006-10-9 33
atomic #pragma omp atomic /* */ x binop = expr ++x x++ --x x-- binop atomic critical atomic x expr 2006-10-9 34
flush #pragma omp flush [( )] barrier flush 2006-10-9 35
flush ( ) flush barrier critial ordered parallel for sections single 2006-10-9 36
ordered ordered #pragma omp ordered /* */ for parallel for ordered 2006-10-9 37
ordered ( ) ordered for parallel for ordered 2006-10-9 38
threadprivate #pragma omp threadprivate ( ) parallel parallel threadprivate if copyin schedule default threadprivate parallel copyin 2006-10-9 39
parallel OMP_NESTED FALSE parallel for sections single critical critical ordered master for sections single 2006-10-9 40
( ) for sections single ordered master critical barrier for sections single master critical ordered 2006-10-9 41
OpenMP omp.h 2006-10-9 42
void omp_set_num_threads(int num_threads) int omp_get_num_threads(void) int omp_get_max_threads(void) int omp_get_thread_num(void) int omp_get_num_procs(void) 2006-10-9 43
( ) int omp_in_parallel(void) void omp_set_dynamic(int dynamic_threads) int omp_get_dynamic(void) void omp_set_nested(int nested) int omp_get_nested(void) 2006-10-9 44
void omp_init_lock(omp_lock_t *lock) void omp_init_nest_lock(omp_nest_lock_t *lock) void omp_destroy_lock(omp_lock_t *lock) void omp_destroy_nest_lock(omp_nest_lock_t *lock) void omp_set_lock(omp_lock_t *lock) void omp_set_nest_lock(omp_nest_lock_t *lock) 2006-10-9 45
( ) void omp_unset_lock(omp_lock_t *lock) void omp_unset_nest_lock(omp_nest_lock_t *lock int omp_test_lock(omp_lock_t *lock) int omp_test_nest_lock(omp_nest_lock_t *lock) 2006-10-9 46
OpenMP OMP_SCHEDULE OMP_NUM_THREADS OMP_NESTED OMP_DYNAMIC 2006-10-9 47
OMP_SCHEDULE schedule(runtime) for parallel for setenv OMP_SCHEDULE \ static dynamic guide[, chunk_size] 1 setenv OMP_SCHEDULE static 2 setenv OMP_SCHEDULE guided,4 2006-10-9 48
OMP_NUM_THREADS setenv OMP_NUM_THREADS num_threads OMP_NUM_THREADS omp_set_num_threads parallel parallel for num_threads OMP_DYNAMIC TRUE omp_set_dynamic 2006-10-9 49
OMP_NESTED setenv OMP_NESTED TRUE FALSE parallel parallel for parallel sections 2006-10-9 50
OMP_DYNAMIC setenv OMP_DYNAMIC TRUE FALSE 2006-10-9 51
MPI OpenMP OpenMP MPI 2006-10-9 52
OpenMP OpenMP OpenMP 2006-10-9 53
( ) OpenMP OpenMP 2006-10-9 54
MPI MPI 2006-10-9 55
OpenMP MPI SMP SMP MPI OpenMP 2006-10-9 56