OpenMP ¿1?§Ä:

o¬¬ [email protected], [email protected]

¥I‰Æ“)ÔU †L§ïĤ ‡?OŽ¥%

2009 12  OpenMP ?§ÔSN

1 ¿1OŽ{0

2 OpenMP {0

3 OpenMP Š{

4 OpenMP S3››Cþ£ICV¤

5 OpenMP -

6 OpenMP ê␂¸

7 OpenMP $1¥f§S

8 OpenMP † MPI ·Ü¿1?§

9 OpenMP §S3 Unix/ e?Ȇ$1

10 9Ï^‡óä

11 éXª o¬¬ (“U¤‡Ž¥%) OpenMP ¿1?§Ä: 2009 c 12  2 / 85 ¿1OŽ{0

Ÿo‡æ^¿1OŽº G1§S„ÝJ, ú Œ±\¯„Ý Œ±\Œ5

o¬¬ (“U¤‡Ž¥%) OpenMP ¿1?§Ä: 2009 c 12  3 / 85 ¿1OŽO©a

SµOpenMP õ‡?nìÓ˜S ccNUMA(Cache-Coherent Non-Uniform Memory Access)! SMP(Symmetric MultiProcessing) ©ÙªSµMPI z‡?nìÑkgCS ?nìƒmÏLD4žE†&E Cluster!MPP(Massively Parallel Processing)

o¬¬ (“U¤‡Ž¥%) OpenMP ¿1?§Ä: 2009 c 12  4 / 85 n«OŽ.

o¬¬ (“U¤‡Ž¥%) OpenMP ¿1?§Ä: 2009 c 12  5 / 85 ¿1z©){

?Ö©)µõ?Ö¿u‰1 õU©)µ©)‰1OŽ «©)µ©)‰1êâ

o¬¬ (“U¤‡Ž¥%) OpenMP ¿1?§Ä: 2009 c 12  6 / 85 Ÿo´ OpenMP

OpenMP ´ÏL3 “è¥V\˜ OpenMP ?ȍ-!N^ OpenMP ¥¼ê5¢y3SXÚþ¿1$1˜«IO OpenMP Jø‰S¿1§S ˜«{ü(¹^umu¿1 A^.§¦§SQŒ±$13ªÅ§qŒ±$13‡? OŽÅþ§¿äkûЌ£‡5ڌ ˜5 ™‹m OpenMP ?ÈÀ‘?ÈìòÑ OpenMP ?ȍ- † ?ȤG1Œ‰1§S ‹m OpenMP ?ÈÀ‘òé OpenMP ?ȍ-?1?n?Ȥ OpenMP ¿1Œ‰1§S $1ž¿1‚§êŒ±3§SéĞ|^‚¸Cþ Ę |±† MPI ·Ü?§§3!:SÜ$1 OpenMP ¿1§!:ƒm $1 MPI ¿1 OpenMP |± C/C++ Ú Šó OpenMP §SŒ±$13 Unix!Linux Ú Windodws öŠXÚþ

o¬¬ (“U¤‡Ž¥%) OpenMP ¿1?§Ä: 2009 c 12  7 / 85 OpenMP ë†̇úi!ÅÚ< OpenMP Architecture Review Board(ARB) [Ȥ AMD (David Leibs) Cray (James Beyer) Fujitsu (Matthijs van Waveren) HP (Uriel Schafer) IBM (Kelvin Li) Intel (Sanjiv Shah) NEC (Kazuhiro Kusano) The Portland Group, Inc. (Michael Wolfe) SGI (Lori Gilbert) Sun Microsystems (Nawal Copty) Microsoft (-) ARB 9Ϥ ASC/LLNL (Bronis R. de Supinski) cOMPunity (Barbara Chapman) EPCC (Mark Bull) NASA (Henry Jin) RWTH Aachen University (Dieter an Mey) (Õ:µhttp://www.openmp.org o¬¬ (“U¤‡Ž¥%) OpenMP ¿1?§Ä: 2009 c 12  8 / 85 OpenMP uÙ{¤

Version 3.0 Complete Specifications - (May, 2008) Version 2.5 - (May 2005, combined C/C++ and Fortran) C/C++ version 2.0 - (March 2002) C/C++ version 2.0 with change bars reflecting changes from 1.0 - (March 2002) Fortran version 2.0 - (November 2000) Fortran version 2.0 with change bars reflecting changes from 1.1 (November 2000) C/C++ version 1.0 - (October 1998) Fortran version 1.1 - (November 1999 - incorporates April 1999 Interpretations and Errata) Fortran version 1.0 - (October 1997)

o¬¬ (“U¤‡Ž¥%) OpenMP ¿1?§Ä: 2009 c 12  9 / 85 |± OpenMP ?Èì±9éA?Èëê

úi½|„ ?Èì éA?Èëê GNU gcc(4.3.2) -fopenmp Intel C/C++/Fortran(10.1) Linux: -, Win: /Qopenmp Portland Group C/C++/Fortran -mp IBM XL C/C++/Fortran -qsmp=omp HP C/C++/Fortran +Oopenmp 2008 C++ /openmp Sun Microsystems C/C++/Fortran -xopenmp Absoft Pro FortranMP Fortran -openmp Lahey/Fujitsu Fortran95 C/C++/Fortran –openmp –threadstack –threadheap PathScale C/C++/Fortran -apo -mp

o¬¬ (“U¤‡Ž¥%) OpenMP ¿1?§Ä: 2009 c 12  10 / 85 ˜‘¥þ:¦G1“è

ü‡˜‘¥þ:¦µsum = A · B § int main(argc,argv) int argc; char ∗argv[]; { double sum; double a[256], b[256]; int i,n; n = 256; for (i =0; i

o¬¬ (“U¤‡Ž¥%) OpenMP ¿1?§Ä: 2009 c 12  11 / 85 ˜‘¥þ:¦ MPI ¿1“è

§ #include "mpi.h" int main(argc,argv) int argc; char ∗argv[]; { double sum, sum_local; double a[256], b[256]; int i , n, numprocs, myid, my_first, my_last; n = 256; MPI_Init(&argc,&argv); MPI_Comm_size(MPI_COMM_WORLD,&numprocs); MPI_Comm_rank(MPI_COMM_WORLD,&myid); my_first = myid ∗ n/numprocs; my_last = (myid + 1) ∗ n/numprocs; for (i =0; i

§ int main(argc,argv) int argc; char ∗argv[]; { double sum; double a[256], b[256]; int status; int i ,n=256; for (i =0; i

o¬¬ (“U¤‡Ž¥%) OpenMP ¿1?§Ä: 2009 c 12  13 / 85 Ä:

OpenMP ´e¡8ܵ ?ȍ- ¥¼ê ‚¸Cþ

o¬¬ (“U¤‡Ž¥%) OpenMP ¿1?§Ä: 2009 c 12  14 / 85 OpenMP ‚ªµC/C++

C/C++ ¥ OpenMP |^ pragma ý?n-‰ OpenMP -§Š {Uì±e‚ªµ § #pragma omp directive−name [clause[ [,] clause]. . . ] new−line ¦ ¥ z‡-± #pragma omp m©§ -Ù{Ü©Uì C/C++ ?ȍ-IO§¿«©Œ # ƒcڃŒk˜x§ kžÿ7L^˜x5© -¥©i #pragma omp ƒý?n8I3?Ȟò÷O† z‡ OpenMP ‰1-7LA^u–˜‡‘Šé§¿ 7 L´˜‡(¬ z1Uk˜‡ OpenMP - ëê ˜Ãcƒ©§I‡žŒ±­E

o¬¬ (“U¤‡Ž¥%) OpenMP ¿1?§Ä: 2009 c 12  15 / 85 OpenMP ‚ªµFortran

Fortran e OpenMP -Š{Uì±e‚ªµ § sentinel directive −name [clause[[,] clause]. . . ] ¦ ¥ OpenMP -I‡÷v±e^‡µ ¤k OpenMP ?ȍ-7L±I“Îm© ½‚ªÚgd‚ª OpenMP I£ÎØÓ OpenMP -Ø«©Œ OpenMP -ØUSi3ëYŠé¥§ŠéØUSi3-¥ z1Uk˜‡ OpenMP - ëê ˜Ãcƒ©§I‡žŒ±­E éu Fortran§8ؚAÏ`²§ÄK±gd‚ªLã

o¬¬ (“U¤‡Ž¥%) OpenMP ¿1?§Ä: 2009 c 12  16 / 85 OpenMP ‚ªµFortran ½‚ª

½‚ª Fortran  OpenMP -I£Î !$omp!c$omp ½ ∗$omp§I÷ v±e^‡µ

I£Î7I31˜m©§¿ ‰˜‡üc§ƒmØkÙ§iÎ

½‚ª Fortran 1°!˜x!Y1Ú5Ké-1˜I„Å

Щ-17Lk˜‡˜‚½ 0 318§-Y1ž7Lk˜‡š˜‚½ 0 iÎ318

5ºŒ±†-Ә1§318ƒ ! L²5ºm©

XJ-I“΃‹1˜‡i䚘‚iΧ½ö-Y1´˜‡ ! §@od1Ñ § !$omp directive −name [clause[[,] clause]. . . ] new−line c$omp directive−name [clause[[,] clause]. . . ] new−line ∗$omp directive−name [clause[[,] clause]. . . ] new−line ¦ ¥ ±en«L«ª d § c23456789 L«Ò !$omp parallel do shared(a,b,c)

c$omp parallel do c$omp+shared(a,b ,c)

∗$omp paralleldoshared (a,b,c) ¦ ¥

o¬¬ (“U¤‡Ž¥%) OpenMP ¿1?§Ä: 2009 c 12  17 / 85 OpenMP ‚ªµFortran gd‚ª

gd‚ª Fortran  OpenMP -I£Î !$omp§I÷v±e^‡µ I£ÎŒ3?Û ˜m©§ƒciÎ7LU˜x ØUÙ§iÎ 7L‰˜‡üÕüc§ƒmØUkÙ§iÎ gd‚ª Fortran 1°!˜x!Y1Ú5Ké-1˜I„Å Щ-17L3I£Îk˜‡˜‚ I‡Y11§7L &§ÙY1Œ±3I£Îƒk˜‡ &§ & cŒk˜x 5ºŒ±†-Ә1§! L²5ºm© XJ-I“΃‹1˜‡i䚘iΧ½-Y1=´˜‡ !§@od1Ñ ˜‡½õ˜‚½›LÎ^u©C-¥' c§±eœ/˜‚´ŒÀµ end critical!end do!end master!end ordered!end parallel!end sections!end single!end task!end workshare!parallel do!parallel sections!parallel workshare § !$omp directive−name [clause[[,] clause]. . . ] new−line ¦ ¥ § !23456789 L«Ò !$omp parallel do & !$omp shared(a,b,c)

!$omp parallel & !$omp&do shared(a,b,c)

!$omp paralleldo shared(a,b,c) ¦ ¥

o¬¬ (“U¤‡Ž¥%) OpenMP ¿1?§Ä: 2009 c 12  18 / 85 ^‡?È

éu|±ý?n OpenMP ¢y§÷ _OPENMP Š½Â yyyymm ‚ª§Ù¥ yyyy Ú mm ©Od?Èì¦^ OpenMP IO uÙcÚ§Xd÷,d #define Ú #undef (²§@o?È1ò Ã{ý§Ïd¦þ؇gC½Âd÷"

o¬¬ (“U¤‡Ž¥%) OpenMP ¿1?§Ä: 2009 c 12  19 / 85 ^‡?ȵFortran ½‚ª

I“ÎŒ !$!∗$ ½ c$ ƒ˜§¿I‡÷v±e^‡µ IPÎ7Il1˜m©§¿ ´‰˜‡ƒmvk˜xN IPÎO†ü‡˜‚ƒ§Ð©17L318k˜‡˜‚½ ö 0§¿ 31˜1ʃmU˜x½êi IPÎO†ü‡˜‚ƒ§Y17L318k˜‡š˜x½ ö 0 iΧ¿ 31˜1ʃmU˜x XJþã÷v§@o?Ȟd1I£ÎòòO†ü‡˜‚§ÄK ò؉?n

o¬¬ (“U¤‡Ž¥%) OpenMP ¿1?§Ä: 2009 c 12  20 / 85 ^‡?ȵFortran ½‚ª

§ !23456789 L«Ò !$ interval=l∗omp_get_thread_num() / & !$ (omp_get_num_threads() −1) ! e1 !$ duc¡kš˜‚iÎ ØL« OpenMP ^‡?ȧ ´5º Do i =1,100, !$ OMP_get_num_threads() ¦ ¥ ±eü«ª dµ § !23456789 L«Ò !$ 10 iam = omp_get_thread_num() + !$ & index

#i f d e f _OPENMP 10 iam = omp_get_thread_num() + & index #endif ¦ ¥

o¬¬ (“U¤‡Ž¥%) OpenMP ¿1?§Ä: 2009 c 12  21 / 85 ^‡?ȵFortran gd‚ª

I“Ώ !$§¿I÷v±e^‡µ ± !$ ر !$omp m©IP§ c¡vk˜‚± Ù§iÎ IP䉏˜‡ƒmvk˜xN Щ17L3I£Îƒk˜‡˜‚ I‡Y117L &§Y1Œ3I£Îƒk˜‡ &§& cŒk˜x XJþã÷v§@o?Ȟd1I£ÎòòO†ü‡˜‚§ÄK ò؉?n

o¬¬ (“U¤‡Ž¥%) OpenMP ¿1?§Ä: 2009 c 12  22 / 85 ^‡?ȵFortran gd‚ª

§ !$interval=l∗omp_get_thread_num() / & !$(omp_get_num_threads()−1) !e1 !$ duc¡kš˜‚iÎ ØL« OpenMP ^‡?ȧ ´5º Do i=1,100, !$ OMP_get_num_threads() ¦ ¥ ±eü«ª d § c23456789 !$ iam = omp_get_thread_num() + & !$& index

#ifdef _OPENMP iam = omp_get_thread_num() + & index #endif ¦ ¥

o¬¬ (“U¤‡Ž¥%) OpenMP ¿1?§Ä: 2009 c 12  23 / 85 S3››Cþ£ICV¤

S3››Cþ£ICV¤Œ´S˜^u›› OpenMP §S1Cþ§ 'X;‚§ê!‚§Ò &E K¿1¬S3››Cþµ dyn-varµ››K¿1«´Ä#NÄN‚§ê"z?֘‡ ICV B" nest-varµ››K¿1«´Ä#Ni@¿1"z?֘‡ ICV B" nthreads-varµ››K¿1«‚§ê"z?֘‡ ICV B" thread-limit-varµ››§SŒ#N놂§ê"‡?Ö^˜‡ ICV B" max-active-levels-varµ››i@-¹¿1«Œê"‡?Ö^˜‡ ICV B" KÌ‚«öŠS3››Cþµ run-sched-varµ››Ì‚«¢žNÝüÑ"z?֘‡ ICV B" def-sched-varµ››Ì‚«%@¢žNÝüÑ"‡?Ö^˜‡ ICV B" K§S‰1S3››Cþµ stacksize-varµ›› OpenMP ¢y)‚§æÒ£stack¤Œ"‡?Ö^˜‡ ICV B" wait-policy-varµ›› –‚§Ï"1"‡?Ö^˜‡ ICV B"

o¬¬ (“U¤‡Ž¥%) OpenMP ¿1?§Ä: 2009 c 12  24 / 85 UÚ¼S3››CþŠ

S3››Cþ Š^‰Œ CþŠ˜ª ¼Š ЩŠ dyn-var ü‡?Ö OMP_DYNAMIC omp_get_dynamic() ëw5) omp_set_dynamic() nest-var ü‡?Ö OMP_NESTED omp_get_nested() false omp_set_nested() nthreads-var ü‡?Ö OMP_NUM_THREADS omp_get_max_threads() ‰1ž½Â omp_set_num_threads() run-sched-var ü‡?Ö OMP_SCHEDULE omp_get_schedule() ‰1ž½Â omp_set_schedule() def-sched-var Û (none) (none) ‰1ž½Â stacksize-var Û OMP_STACKSIZE (none) ‰1ž½Â wait-policy-var Û OMP_WAIT_POLICY (none) ‰1ž½Â thread-limit-var Û OMP_THREAD_LIMIT omp_get_thread_limit() ‰1ž½Â max-active Û OMP_MAX_ACTIVE_LEVELS omp_get_max_active_ ëw5) -levels-var omp_set_max_active_levels() levels()

5)µ

X OpenMP ‰1|±ÄN‚§§dyn-var ЩŠd‰1ž½Â§ÄK false max-active-levels-var ЩŠ´‰1ž|±¿1?Oê8§[&EëÃþ"

§Sm©$1ž§CþЩŠòDƒ§¿¬3 OpenMP (½ API f§S¥‰1§^r˜ OpenMP ‚¸CþŠ

Ö¿DƒéASܛ›Cþ§ƒ?Û OpenMP ‚¸CþUCÑج2KSܛ›Cþ"OpenMP (ëêØ

¬K?ÛSܛ›Cþ"

o¬¬ (“U¤‡Ž¥%) OpenMP ¿1?§Ä: 2009 c 12  25 / 85 ˆ?ÖS3››Cþ󊐪

ˆ?Ö«äkЩCþ dyn-var!nest-var!nthreads-var Ú run-sched-var gCB"˜‡?Ö(½¿1(3˜‡?Ö¥‰ 1ž§Ù)f?ÖU«ù Cþ"N^ omp_set_num_threads()! omp_set_dynamic()!omp_set_nested() Ú omp_set_schedule() == ¬#†Ùƒ'?Ö«S3››Cþ" ‰1½ schedule(runtime) ̂󊐫ž§¤k|¤”½ parallel «?Ö« run-sched-var 7LkÓŠ§ÄK1ò Ã{ý"

o¬¬ (“U¤‡Ž¥%) OpenMP ¿1?§Ä: 2009 c 12  26 / 85 `k?

(ëê API f§S ‚¸Cþ S3››Cþ (none) omp_set_dynamic() OMP_DYNAMIC dyn-var (none) omp_set_nested() OMP_NESTED nest-var num_threads omp_set_num_threads() OMP_NUM_THREADS nthreads-var schedule omp_set_schedule() OMP_SCHEDULE run-sched-var schedule (none) (none) def-sched-var (none) (none) OMP_STACKSIZE stacksize-var (none) (none) OMP_WAIT_POLICY wait-policy-var (none) (none) OMP_THREAD_LIMIT thread-limit-var (none) omp_set_max_active_levels() OMP_MAX_ACTIVE_LEVELS max-active-levels-var

†>`k?pm>

o¬¬ (“U¤‡Ž¥%) OpenMP ¿1?§Ä: 2009 c 12  27 / 85 ¿1(µparallel Construct

²‘«¥“èò¿1‰1§¿ ¿1´Œ±i@ C/C++µ § #pragma omp parallel [clause[ [, ]clause] ...] new−line structured−block ¦ ¥ Fortranµ § !$omp parallel [clause [[,] clause ]...] structured−block !$omp end parallel ¦ ¥

o¬¬ (“U¤‡Ž¥%) OpenMP ¿1?§Ä: 2009 c 12  28 / 85 ¿1(ã«

§ !$omp parallel write(∗,∗) "Hello" !$omp end parallel ¦ ¥

o¬¬ (“U¤‡Ž¥%) OpenMP ¿1?§Ä: 2009 c 12  29 / 85 ¿1i@ã«

§ !$omp parallel write(∗,∗) "Hello" !$omp parallel write(∗,∗) 'Hi' !$omp end parallel !$omp end parallel ¦ ¥

o¬¬ (“U¤‡Ž¥%) OpenMP ¿1?§Ä: 2009 c 12  30 / 85 óŠ(µWorksharing Constructs

óŠ(¬3‰1d(‚§¥©†ƒƒ'«ˆ‚§ ‰1"‚§¬‰13z‡3‰1?Öœ¹e۹ܩ«"3z ‡óŠ(\?¿ØI?1ÓÚ§3󊐫(å? ؚk nowait ëê§ÄK%@¬?1ÓÚ"XJk nowait§@o‰1 d?žò¬Ñd󊐫ÓÚ§@‰1d(‚§¬† ‰1e¡- ØI –Ù§?§‰1d§ØI‡?1M# £flush¤öŠ"OpenMP ½Â ±eóŠ(µ ̂(µloop structure ©¬(µsections structure ü‰1(µsingle structure óŠ(µworkshare structure ›µ 󊐫7L¤k|S‚§Ñ‰1½Ñ؉1 ˜|Sz‡‚§‰1󊐫ÚÓÚ«^S7L˜—

o¬¬ (“U¤‡Ž¥%) OpenMP ¿1?§Ä: 2009 c 12  31 / 85 ̂(µLoop Constructs

̂(²˜‡½õ‡†ƒƒ'̂S“ò˜|‚§‰1 C/C++µ § #pragma omp for [clause[[,] clause] ... ] new−line for−loops ¦ ¥ Fortranµ § !$omp do [clause [[,] clause] ... ] do−loops [ !$omp end do [nowait] ] ¦ ¥

o¬¬ (“U¤‡Ž¥%) OpenMP ¿1?§Ä: 2009 c 12  32 / 85 ̂(ã«

§ !$omp do,clause · · · do i = 1, 1000 . . . enddo !$omp end do ¦ ¥

o¬¬ (“U¤‡Ž¥%) OpenMP ¿1?§Ä: 2009 c 12  33 / 85 ©¬(µsections Construct

ØÓ‚§‰1ØÓ«S“è C/C++µ § #pragma omp sections [clause[[,] clause] ...] new−line { [#pragma omp section new−line] structured−block [#pragma omp section new−line structured−block ] ... } ¦ ¥ Fortranµ § !$omp sections [clause[[,] clause] ...] [ !$omp section] structured−block [ !$omp section structured−block ] ... !$omp end sections [nowait] ¦ ¥

o¬¬ (“U¤‡Ž¥%) OpenMP ¿1?§Ä: 2009 c 12  34 / 85 ©¬(ã«

§ !$omp sections !$omp section write(∗,∗) "hello" !$omp section write(∗,∗) "hi" !$omp section write(∗,∗) "bye" !$omp end sections ¦ ¥

o¬¬ (“U¤‡Ž¥%) OpenMP ¿1?§Ä: 2009 c 12  35 / 85 ü‰1(µsingle structure

²ƒ'“èUk˜‡‚§£¿Ø7L´̂§¤‰1§˜„k ‚§‰1 C/C++µ § #pragma omp single [clause[[,] clause] ...] new−line structured−block ¦ ¥ Fortranµ § !$omp single [clause [[,] clause] ...] structured−block !$omp end single [end_clause[[,] end_clause] ...] ¦ ¥

o¬¬ (“U¤‡Ž¥%) OpenMP ¿1?§Ä: 2009 c 12  36 / 85 ü‰1(ã«

§ !$omp single clause1 clause2 · · · · · · !$omp end single end_clause ¦ ¥

o¬¬ (“U¤‡Ž¥%) OpenMP ¿1?§Ä: 2009 c 12  37 / 85 óŠ(µworkshare Construct

²ƒ'“詤ØÓü±øØӂ§‰1§ØÓüU ,‡‚§‰1˜g C/C++µØ|±d OpenMP - Fortranµ § !$omp workshare structured−block !$omp end workshare [nowait] ¦ ¥ structured-block I‡÷v±e^‡µ ê|DŠ IþDŠ forall Šé forall ( where Šé where ( atomic ( critical ( parallel ( critical (¥µ\ŠéÉd›§parallel (¥µ\ŠéØÉ d›" o¬¬ (“U¤‡Ž¥%) OpenMP ¿1?§Ä: 2009 c 12  38 / 85 éÜ¿1óŠ(

éÜ¿1(¢Sþ´3¿1(¥i@(˜‡¯$ ª§ù -òӞ²˜‡óŠ(äk¿15§ ØIÙ§Š é,1²"éÜ¿1(#N˜ ¿1(ÚóŠ(Ñ# NA½ëê"X§S¹ké¿1(½óŠ(äkØÓ1 ëê§@oÙ1ò،ýÿ"éÜ¿1(¹±e(µ ¿1̂( ¿1©¬( ¿1óŠ(

o¬¬ (“U¤‡Ž¥%) OpenMP ¿1?§Ä: 2009 c 12  39 / 85 ¿1̂(µParallel Loop Constructs

¿1̂(²˜‡½õ‡ƒ'̂S“ò˜|‚§¿1‰1 C/C++µ § #pragma omp parallel for [clause[[,] clause] ... ] new−line for−loops ¦ ¥ Fortranµ § !$omp parallel do [clause [[,] clause] ... ] do−loops [ !$omp parallel end do [nowait] ] ¦ ¥

o¬¬ (“U¤‡Ž¥%) OpenMP ¿1?§Ä: 2009 c 12  40 / 85 ¿1©¬(µparallel sections Construct

¿1©¬(²†ƒƒ'ØÓ«“èòØӂ§¿1‰1 C/C++µ § #pragma omp parallel sections [clause[[,] clause] ...] new−line { [#pragma omp section new−line] structured−block [#pragma omp section new−line structured−block ] ... } ¦ ¥ Fortranµ § !$omp parallel sections [clause[[,] clause] ...] [ !$omp section] structured−block [ !$omp section structured−block ] ... !$omp end parallel sections [nowait] ¦ ¥

o¬¬ (“U¤‡Ž¥%) OpenMP ¿1?§Ä: 2009 c 12  41 / 85 ¿1óŠ(µparallel workshare Construct

¿1óŠ(²ƒ'“詤ØÓü±øØӂ§¿ 1‰1§ØÓüU,˜‚§‰1˜g C/C++µØ|±d OpenMP - Fortranµ § !$omp parallel workshare structured−block !$omp parallel end workshare [nowait] ¦ ¥ structured-block I‡÷v±e^‡µ ê|DŠ IþDŠ forall Šé forall ( where Šé where ( atomic ( critical ( parallel ( critical (¥µ\ŠéÉd›§parallel (¥µ\ŠéØÉ d›" o¬¬ (“U¤‡Ž¥%) OpenMP ¿1?§Ä: 2009 c 12  42 / 85 ?Ö(µtask Construct

?Ö(½Â˜‡²(?Ö C/C++µ § #pragma omp task [clause[[,] clause] ...] new−line structured−block ¦ ¥ Fortranµ § !$omp task [clause [[,] clause] ...] structured−block !$omp end task ¦ ¥

o¬¬ (“U¤‡Ž¥%) OpenMP ¿1?§Ä: 2009 c 12  43 / 85 Ì(ÚÓÚ(

Ì(ÚÓÚ(̇¹±e( Ì(µmaster construct .(µcritical construct ¶æ(µbarrier construct ?Ö –(µtaskwait construct f(µatomic construct M#(µflush construct kS(µordered construct

o¬¬ (“U¤‡Ž¥%) OpenMP ¿1?§Ä: 2009 c 12  44 / 85 Ì(µmaster construct

Ì(²(¬I‡̂§£Ì‚§¤‰1 C/C++µ § #pragma omp master new−line structured−block ¦ ¥ Fortranµ § !$omp master structured−block !$omp end master ¦ ¥

o¬¬ (“U¤‡Ž¥%) OpenMP ¿1?§Ä: 2009 c 12  45 / 85 Ì(ã« § !$omp master write(∗,∗) "Hello" !$omp end master ¦ ¥

o¬¬ (“U¤‡Ž¥%) OpenMP ¿1?§Ä: 2009 c 12  46 / 85 .(µcritical construct

.(²(¬3ӘžmUk˜‡‚§‰1 C/C++µ § #pragma omp critical [(name)] new−line structured−block ¦ ¥ Fortranµ § !$omp critical [(name)] structured−block !$omp end critical [(name)] ¦ ¥

o¬¬ (“U¤‡Ž¥%) OpenMP ¿1?§Ä: 2009 c 12  47 / 85 .(ã« § !$omp critical write_file write(1,∗) data !$omp end critical write_file ¦ ¥

o¬¬ (“U¤‡Ž¥%) OpenMP ¿1?§Ä: 2009 c 12  48 / 85 ¶æ(µbarrier construct

¶æ(²3d?Iwª¶æ§=I|S¤k‚§Ñ‡$1d â‰1Y“è C/C++µ § #pragma omp barrier new−line ¦ ¥ Fortranµ § !$omp barrier ¦ ¥

o¬¬ (“U¤‡Ž¥%) OpenMP ¿1?§Ä: 2009 c 12  49 / 85 ¶æ(ã«

o¬¬ (“U¤‡Ž¥%) OpenMP ¿1?§Ä: 2009 c 12  50 / 85 ¶æ(~„†ØÞ~ 5¿µbarrier 7L3¤k‚§Ó^S¥ ~„†ØÞ~µ ··· ··· !$omp single ··· !$omp critical ··· !$omp barrier ··· !$omp barrier ··· !$omp end single ··· !$omp end critical ··· ··· ··· !$omp sections ··· !$omp master ··· !$omp section ··· !$omp barrier ··· !$omp barrier ··· !$omp end master ··· !$omp end section ··· !$omp end sections ···

o¬¬ (“U¤‡Ž¥%) OpenMP ¿1?§Ä: 2009 c 12  51 / 85 ?Ö –(µtaskwait construct

?Ö –(²I‡gc?Öm©ÒI –)f?Ö¤ C/C++µ § #pragma omp taskwait newline ¦ ¥ Fortranµ § !$omp taskwait ¦ ¥

o¬¬ (“U¤‡Ž¥%) OpenMP ¿1?§Ä: 2009 c 12  52 / 85 f(µatomic construct

f(^u(²;«é,‘öŠ?1f#§ ئ٠³‰õ‡ÓÚ?1‚§§;Óžõ‡‚§éù Cþ?1# C/C++µ § #pragma omp atomic new−line expression−stmt ¦ ¥ Fortranµ § !$omp atomic statement ¦ ¥ Þ~µ § !$omp do do i = 1, 1000 !$omp atomic + a=a+i enddo !$omp end do ¦ ¥ o¬¬ (“U¤‡Ž¥%) OpenMP ¿1?§Ä: 2009 c 12  53 / 85 M#(µflush construct

M#(²é½Cþ‰1SM#öŠ±y‚§džwù Cþ3S¥Š˜— C/C++µ § #pragma omp flush [(list)] new−line ¦ ¥ Fortranµ § !$omp flush [( list )] ¦ ¥

o¬¬ (“U¤‡Ž¥%) OpenMP ¿1?§Ä: 2009 c 12  54 / 85 kS(µordered construct

kS(²Ì‚(¥(¬‰1Uì̂S“^S§òüSd (¬¥‰1^S§¿#N(¬ƒ “茱¿1‰1 C/C++µ § #pragma omp ordered new−line structured−block ¦ ¥ Fortranµ § !$omp ordered structured−block !$omp end ordered ¦ ¥

o¬¬ (“U¤‡Ž¥%) OpenMP ¿1?§Ä: 2009 c 12  55 / 85 kS(ã« § !$omp do ordered do i = 1, 100 block1 !$omp ordered block2 !$omp end ordered block3 enddo !$omp end do ¦ ¥

o¬¬ (“U¤‡Ž¥%) OpenMP ¿1?§Ä: 2009 c 12  56 / 85 (SÚ^Cþêâá5{K

(¥Ú^Cþêâá5Œýkû½!w«û½½Ûªû ½ƒ˜"µ4(¥ firstprivate!lastprivate ½ reduction ëê( ²Cþ¬—d(¥Cþæ^ÛªÚ^ª§¿„űe5Kµ C/C++µ threadprivate -²Cþ´‚§hk (¥,‡‰ŒS²äkgÄ;±ÏCþ´hk äkæ©;Cþ´ ·ê⤠´ 'é for ̂½ parallel for ̂(¥̂S“Cþ´hk Øäk´C¤ 3~êCþ´ (¥,‡‰ŒS(²·Cþ´ Fortranµ threadprivate -²CþÚ common ¬´‚§hk 'é do ̂½ parallel do ̂(¥̂S“Cþ´hk parallel ½ task (¥^Ŝ̂S“Cþ3µ4d̂ SÜ(¥´hk Ûª do Ú forall ¢Ú´hk Cray U«Ù'é;êâá5 o¬¬ (“U¤‡Ž¥%) OpenMP ¿1?§Ä: 2009 c 12  57 / 85 êâá5{K

Ø 3±eœ/¥§äký½Âêâá5CþNvk3ê⠐á5ëê¥ѧéù ~ ó§3êâá5ëê¥#NÑ ˜ ý½ÂCþ§¿ ò“ù Cþýk½Âêâá5" C/C++µ for ̂½ parallel for ̂(¥̂S“CþŒ±3 private ½ lastprivate ëê¥Ñ Fortranµ do ̂½ parallel do ̂(¥̂S“CþŒ±3 private ½ lastprivate ëê¥Ñ parallel ½ task (¥^Ŝ̂S“CþŒ±3 private! firstprivate!lastprivate!shared!½ reduction ëê¥ѧ¿ 3 µ4(¥ÉÙ§› b½Œê|Œ±3 share ëê¥Ñ

o¬¬ (“U¤‡Ž¥%) OpenMP ¿1?§Ä: 2009 c 12  58 / 85 Ûªêâ{K äkwªû½½Ûªû½êâá5Cþµ äkwªû½êâá5Cþ´3˜‡‰½(¥ Ú^¿ 3d(êâëê¥ÑCþ äkÛªû½êâá5Cþ´3˜‡‰½(¥ Ú^§vkýkû½êâá5§¿ vk3d(ê⠐á5ëê¥ÑCþ Ûªû½êâá55KXeµ 3 parallel ½ task (¥§XJ3 default ëê§@où Cþ êâá5d default ëêû½ 3 parallel (¥§XJvk default ëê§@où Cþ´ éuØ´ task (5`§XJvk default ëê§@où Cþ òldµ4þe©¥U«êâá5 3 task (¥§XJvk default ëê§@o3¤kµ4(¿˜ †Sܵ4 parallel (¥Cþû½ 3 task (¥§XJvk default ëê êâá5vkþã 5Kû½§@oCþ´ firstprivate 

o¬¬ (“U¤‡Ž¥%) OpenMP ¿1?§Ä: 2009 c 12  59 / 85 « š(¥êâá55K C/C++µ 3N^f§S¥(²·Cþ3d«¥´ Øäk´C¤ 3N^f§S¥(²3~êCþ´ ؚ´3 threadprivate -¥Ñy§ÄK«¥3N^f§S¥ Ú^©‡‰Œ½ö¶i˜m‰ŒCþ´ äkæ©;Cþ´ ؚ´3 threadprivate -¥Ñy§ÄK·ê⤠´ «¥N^f§SÏLÚ^D4ªëêU«'é¢Së êêâêâá5 «¥N^f§S¥Ù§Cþ´hk Fortranµ «¥N^f§S¥(²/CþXk save á5§½êâ´ Щz§ ™3 threadprivate -¥ÑyCþ´ «¥N^f§S¥Ú^ common ¬½ module ¥Cþ´ §Øš´3 threadprivate -¥Ñy «¥N^f§S¥åëêXÏLÚ^D4§@oòU«† ƒ'é¢Sëêêâá5 Cray U«Ù'é;êâá5 «¥N^f§S¥Ûª do Ú forall ¢Ú9(²Ù§/C þ´hk o¬¬ (“U¤‡Ž¥%) OpenMP ¿1?§Ä: 2009 c 12  60 / 85 threadprivate -

threadprivate -²Cþ´‚§hk C/C++µ § #pragma omp threadprivate(list) new−line ¦ ¥ Fortranµ § !$omp threadprivate( list ) ¦ ¥

o¬¬ (“U¤‡Ž¥%) OpenMP ¿1?§Ä: 2009 c 12  61 / 85 threadprivate -ã« § real(8), save :: A(100), B integer, save :: C ··· !$omp threadprivate(a, b, c) ¦ ¥

o¬¬ (“U¤‡Ž¥%) OpenMP ¿1?§Ä: 2009 c 12  62 / 85 êâá5ëê defaultµ˜%@ª C/C++µ § default(shared | none) ¦ ¥ Fortranµ § default(private | firstprivate | shared | none) ¦ ¥ sharedµ‚§ privateµ‚§hk firstprivateµ‚§hk§ÙŠm©d(žl©CþU«Š lastprivateµ‚§hk§¿3d«(垍#©CþŠ reductionµ(²éCþ?15öŠ C/C++µ § reduction(operator: list ) ¦ ¥ Fortranµ § reduction({operator | intrinsic_procedure_name}:list) o¬¬ ( “¦U¤‡Ž¥%) OpenMP ¿1?§Ä: 2009 c 12  63 / 85¥ êâE›ëê

copyinµ3‰1 parallel (ž§ò̂§‚§hkCþŠE ›‰¤kÙ§‚§ § copyin( list ) ¦ ¥ copyprivateµJø˜«Å›Œ±òÛª?Öê₸,‡hkC þŠ2‰d parallel (¥Ù§ê₸ § copyprivate( list ) ¦ ¥

o¬¬ (“U¤‡Ž¥%) OpenMP ¿1?§Ä: 2009 c 12  64 / 85 ‚§i@

‚§i@5KXe 󊐫Œvi@µ43óŠ!wª task!critical! ordered ½ master « barrier «Œvi@µ43óŠ!wª task!critical! ordered ½ master « master «Œvki@µ43󊐽wª task « ordered «Œvi@µ43critical ½wª task « ordered «7Li@µ43äk ordered ëê̂«½¿1 ̂«¥ critical «Œvi@£µ4½Ù§¤3äkÓ¶i critical «¥§d›¿Ø¿©U“Ž˜‡k£

o¬¬ (“U¤‡Ž¥%) OpenMP ¿1?§Ä: 2009 c 12  65 / 85 $1¥½Â

C/C++µ 3Þ©‡ omp.h ¥½Â§d©‡½Â µ ¤k OpenMP f§S. omp_lock_t a. omp_nest_lock_t a. omp_sched_t a. Fortranµ Jø F77 Þ©‡ omp_lib.h Ú F90  module ©‡ omp_lib§½  µ ¤k OpenMP f§S integer parameter omp_lock_kind integer parameter omp_nest_lock_kind integer parameter omp_sched_kind integer parameter openmp_version

o¬¬ (“U¤‡Ž¥%) OpenMP ¿1?§Ä: 2009 c 12  66 / 85 ‰1‚¸f§S omp_set_num_threadsµ˜‚§ê omp_get_num_threadsµ¼‚§ê omp_get_max_threadsµ¼Œ?§ê omp_get_thread_numµ¼?§Ò omp_get_num_procsµ¼?nìê omp_in_parallelµä´Ä3 parallel « omp_set_dynamicµ˜´Ä#NÄN‚§ê omp_get_dynamicµ¼´Ä#NÄN‚§ê omp_set_nestedµ˜´Ä#Ni@ omp_get_nestedµ¼´Ä#Ni@ omp_set_scheduleµ˜NÝüÑ omp_get_scheduleµ¼NÝüÑ omp_get_thread_limitµ¼§S#NŒ‚§ê omp_set_max_active_levelsµ˜#NŒi@-¹ê omp_get_max_active_levelsµ¼#NŒi@-¹ê omp_get_levelµ¼ci@ parallel «? omp_get_ancestor_thread_numµ¼I‚§½öc‚§Ò omp_get_team_sizeµ¼,i@?I½c‚§#N|‚§ê omp_get_active_levelµ¼i@¹ parallel «Ò

o¬¬ (“U¤‡Ž¥%) OpenMP ¿1?§Ä: 2009 c 12  67 / 85 £f§S

OpenMP $1¥¹˜X;€^å£f§S§Œ±^uÓÚ "ù £f§SöŠ@ ^ OpenMP £CþL« OpenMP £"OpenMP £ Uù f§S§Ù{ª OpenMP £ªØ(@" OpenMP £Œk uninitialized!unlocked ½ locked G"X˜‡£3 unlocked G§˜‡?֌˜T£ locked G"˜d£?Öò Pkd£§Pkd£?֌˜d£ unlocked G"˜‡?ÖE áu,˜‡?Ö£´Ã{y" OpenMP |±ü«a.£µ{ü£ÚŒi@£"Œi@£ŒӘ‡ ?Ö3E ƒcõg˜¶{ü£3áu?Ö}Á2g˜žÿò ؘ"{ü£Cþ†{ü£ƒ'é§ UD4‰{ü£f§S" Œi@£Cþ†Œi@£ƒ'駿 UD4‰Œi@£f§S" z‡£f§S£GÚ¤köå3df§S¥£ã"XJù åvk‰1§ù f§S1´šA½" OpenMP £f§S£CþÏL±eª?1µ§‚o´Öڍ# £CþcŠ"£f§SV¹#£flush¤L§¶éù £CþŠ Öڍ#7LUìäkf5£atomic¤#öŠ5¢y§¿ØI‡ OpenMP ¹w«#-5y£Cþ3ØÓ?Ö¥˜—5"

o¬¬ (“U¤‡Ž¥%) OpenMP ¿1?§Ä: 2009 c 12  68 / 85 {ü£f§S

omp_init_lockµÐ©z{ü£ omp_destroy_lockµ¤{ü£ omp_set_lockµ˜{ü£ omp_unset_lockµE {ü£ omp_test_lockµÿÁ{ü£§XJ3K˜

o¬¬ (“U¤‡Ž¥%) OpenMP ¿1?§Ä: 2009 c 12  69 / 85 i@£f§S

omp_init_nest_lockµÐ©zi@£ omp_destroy_nest_lockµ¤i@£ omp_set_nest_lockµ˜i@£ omp_unset_nest_lockµE i@£ omp_test_nest_lockµÿÁi@£§XJ3K˜

o¬¬ (“U¤‡Ž¥%) OpenMP ¿1?§Ä: 2009 c 12  70 / 85 omp_init_lock Ú omp_init_nest_lock

©OЩz{ü£Úi@£ C/C++µ § void omp_init_lock(omp_lock_t ∗lock); void omp_init_nest_lock(omp_nest_lock_t ∗lock); ¦ ¥ Fortranµ § subroutine omp_init_lock(svar) integer (kind=omp_lock_kind) svar subroutine omp_init_nest_lock(nvar) integer (kind=omp_nest_lock_kind) nvar ¦ ¥

o¬¬ (“U¤‡Ž¥%) OpenMP ¿1?§Ä: 2009 c 12  71 / 85 omp_destroy_lock Ú omp_destroy_nest_lock

©O¤{ü£Úi@£ C/C++µ § void omp_destroy_lock(omp_lock_t ∗lock); void omp_destroy_nest_lock(omp_nest_lock_t ∗lock); ¦ ¥ Fortranµ § subroutine omp_destroy_lock(svar) integer (kind=omp_lock_kind) svar subroutine omp_destroy_nest_lock(nvar) integer (kind=omp_nest_lock_kind) nvar ¦ ¥

o¬¬ (“U¤‡Ž¥%) OpenMP ¿1?§Ä: 2009 c 12  72 / 85 omp_set_lock Ú omp_set_nest_lock

©O˜{ü£Úi@£ C/C++µ § void omp_set_lock(omp_lock_t ∗lock); void omp_set_nest_lock(omp_nest_lock_t ∗lock); ¦ ¥ Fortranµ § subroutine omp_set_lock(svar) integer (kind=omp_lock_kind) svar subroutine omp_set_nest_lock(nvar) integer (kind=omp_nest_lock_kind) nvar ¦ ¥

o¬¬ (“U¤‡Ž¥%) OpenMP ¿1?§Ä: 2009 c 12  73 / 85 omp_unset_lock Ú omp_unset_nest_lock

©OE {ü£Úi@£ C/C++µ § void omp_unset_lock(omp_lock_t ∗lock); void omp_unset_nest_lock(omp_nest_lock_t ∗lock); ¦ ¥ Fortranµ § subroutine omp_unset_lock(svar) integer (kind=omp_lock_kind) svar subroutine omp_unset_nest_lock(nvar) integer (kind=omp_nest_lock_kind) nvar ¦ ¥

o¬¬ (“U¤‡Ž¥%) OpenMP ¿1?§Ä: 2009 c 12  74 / 85 omp_test_lock Ú omp_test_nest_lock

©OÿÁ{ü£Úi@£§XJ3K˜ C/C++µ § int omp_test_lock(omp_lock_t ∗lock); int omp_test_nest_lock(omp_nest_lock_t ∗lock); ¦ ¥ Fortranµ § logical function omp_test_lock(svar) integer (kind=omp_lock_kind) svar integer function omp_test_nest_lock(nvar) integer (kind=omp_nest_lock_kind) nvar ¦ ¥

o¬¬ (“U¤‡Ž¥%) OpenMP ¿1?§Ä: 2009 c 12  75 / 85 žmf§S

JøOžì omp_get_wtimeµ¼±¦ü cžm C/C++µ § double omp_get_wtime(void); ¦ ¥ Fortranµ § double precision function omp_get_wtime() ¦ ¥ omp_get_wtickµ¼Ožì°Ý C/C++µ § double omp_get_wtick(void); ¦ ¥ Fortranµ § double precision function omp_get_wtick() ¦ ¥

o¬¬ (“U¤‡Ž¥%) OpenMP ¿1?§Ä: 2009 c 12  76 / 85 žmf¼êÞ~ |^žm¼êŒ±OŽ§S¥,ãOŽs¤žm C/C++µ § double start, end; start = omp_get_wtime(); ... work to be timed ... end = omp_get_wtime(); printf ("Work␣took␣%f␣seconds\n", end − start); ¦ ¥ Fortranµ § double precision start, end start = omp_get_wtime() ... work to be timed ... end = omp_get_wtime() print ∗, "Work␣took", end − start, "seconds" ¦ ¥ o¬¬ (“U¤‡Ž¥%) OpenMP ¿1?§Ä: 2009 c 12  77 / 85 ‚¸Cþ |^‚¸CþŒ±›› OpenMP §S$1 OMP_SCHEDULEµ˜ run-sched-var S3››Cþ±››$1 NÝa.Ú¿1¬Œ§Œ static!dynamic!guided ½ auto OMP_NUM_THREADSµ˜ nthreads-var S3››Cþ±˜ ‚§ê OMP_DYNAMICµ˜ dyn-var S3››Cþ±˜´Ä#NÄ N‚§ OMP_NESTEDµ˜ nest-var S3››Cþ±˜´Ä#Ni@ OMP_STACKSIZEµ˜ stacksize-var S3››Cþ±˜æÒ Œ OMP_WAIT_POLICYµ˜ wait-policy-var S3››Cþ± ˜‚§ –üÑ OMP_MAX_ACTIVE_LEVELSµ˜ max-active-levels-var S 3››Cþ±˜#NŒi@-¹¿1« OMP_THREAD_LIMITµ˜ thread-limit-var S3››Cþ± ˜3 OpenMP §S¥#NŒ‚§©ê

o¬¬ (“U¤‡Ž¥%) OpenMP ¿1?§Ä: 2009 c 12  78 / 85 ‚¸Cþ˜{

I‡3§S$1c˜§§S$12˜òØåŠ^§±eA«~ „ shell e˜{µ cshµ setenv OMP_SCHEDULE dynamic sh!bash!kshµ export OMP_SCHEDULE=dynamic DOSµ set OMP_SCHEDULE=dynamic

o¬¬ (“U¤‡Ž¥%) OpenMP ¿1?§Ä: 2009 c 12  79 / 85 OpenMP † MPI ·Ü¿1?§

MPI ¿1?§S܌±2‰1 OpenMP ¿1‚§±éÜ?1¿1O Ž§˜„^u!:S܏S§!:m©ÙªS‡ŽXÚ § program main use omp_lib use mpi implicit none integer, save:: iErr, MyID, NumNodes integer i, j

call mpi_init(ierr) call mpi_comm_rank(mpi_comm_world, MyID ,iErr) call mpi_comm_size(mpi_comm_world, NumNodes, iErr) print∗,'MPI:␣My␣ID:␣', MyID, ',␣Number␣of␣Processes:␣', NumNodes !$omp parallel i=omp_get_num_threads() j=omp_get_thread_num() print∗, 'OMP:␣Thread␣Number:', j, ',␣Number␣of␣Threads:␣', i !$omp end parallel call mpi_finalize(ierr ) end ¦ ¥

o¬¬ (“U¤‡Ž¥%) OpenMP ¿1?§Ä: 2009 c 12  80 / 85 OpenMP §S3 Unix/Linux e?È

3 Unix/Linux ²e~„ GCC!Intel!PGI ?Èì?Ȑª Cµ GCCµgcc -o prog-omp -fopenmp prog-omp.c Intelµicc -o prog-omp -openmp prog-omp.c PGIµpgcc -o prog-omp -mp prog-omp.c C++µ GCCµg++ -o prog-omp -fopenmp prog-omp.cpp Intelµicpc -o prog-omp -openmp prog-omp.cpp PGIµpgCC -o prog-omp -mp prog-omp.cpp Fortranµ GCCµgfortran -o prog-omp -fopenmp prog-omp.f90 Intelµifort -o prog-omp -openmp prog-omp.f90 PGIµpgf90 -o prog-omp -mp prog-omp.f90 ?Èì´l,‡‡m©|± OpenMP §X GCC l 4.3.2 m© é OpenMP † MPI ·Ü?§§S§‡ò?È·-†¤éA MPI ?È·-=Œ

o¬¬ (“U¤‡Ž¥%) OpenMP ¿1?§Ä: 2009 c 12  81 / 85 Unix/Linux e$1

$1µ csh!tcshµ setenv OMP_NUM_THREADS 8 prog-omp >log & bash!ksh!zshµ export OMP_NUM_THREADS=8 prog-omp >log &

é OpenMP † MPI ·Ü?§§S‰1§‡˜ OpenMP ‚ ¸Cþ^ MPI §S$1ª$1=Œ éõ‡ŽXÚæ^Š’NÝXÚ+n^rŠ’§džIÏLŠ’N ÝXÚ5$1Š’§IëwéAŠ’NÝXÚÃþ

o¬¬ (“U¤‡Ž¥%) OpenMP ¿1?§Ä: 2009 c 12  82 / 85 ¿1Ç

1 S = fpar/P + (1 − fpar)

Amdahl ½Æ§Ù¥ P ´¿1Øê§fpar Œ¿1Ü©G1žÓ^ OŽžmz©' b fpar = 80%§@o 16 Ú 32 ؞Œ¿1Ç´õº 16 ص4 32 ص4.4 ¦ŒUõ/¿1z“è§AO´ÑžÜ©

o¬¬ (“U¤‡Ž¥%) OpenMP ¿1?§Ä: 2009 c 12  83 / 85 9Ï^‡óä

§S5U©Ûµ Intel VTuneµ http://software.intel.com/en-us/intel-vtune/ AMD CodeAnalystµ http://developer.amd.com/cpu/CodeAnalyst/ §S è(©Ûµ Understandµ http://www.scitools.com/products/understand/

o¬¬ (“U¤‡Ž¥%) OpenMP ¿1?§Ä: 2009 c 12  84 / 85 éXª

¥I‰Œ‡Ž¥%µ ̐µhttp://scc.ustc.edu.cn >{µ0551-3602248 &‡µ[email protected] “U¤‡Ž¥%µ c̐µhttp://124.16.151.186 ò5¶µhttp://scc.qibebt.cas.cn >{µ0532-80662613 &‡µ[email protected] o¬¬µ ̐µhttp://staff.ustc.edu.cn/~hmli/ >{µ0532-80662613 &‡µ[email protected][email protected] HÑ†ØÚU?¿„"

o¬¬ (“U¤‡Ž¥%) OpenMP ¿1?§Ä: 2009 c 12  85 / 85