Title: ??????%20???????%20????%20Parallel%20Programming:%20Fundamentals%20and%20Implementation
1- ?????????????????Parallel Programming
Fundamentals and Implementation - ? ?
- dair_at_dawning.com.cn
- ??????????
- 2006.4
2????
- ??,????,?????. ?????????,?????. ?????????,
P.3356,P.227237, 2000. - ????.????????????. ?????????,1999.
- Barry Wilkinson and Michael Allen. Parallel
Programming(Techniques and Applications using
Networked Workstations and Parallel Computers).
Prentice Hall, 1999. - ???,?????. ?????????????. ?????????,2000.
- ???,?????. ???????????. ?????????,1999.
- ????. ???????????MPI??????. ?????????, 2001.
3????
- MPI http//ww.mpi-forum.org,
- http//www.mcs.anl.gov/mpi
- Pthreads http//www.oreilly.com
- PVM http//www.epm.ornl.gov/pvm/
- OpemMP http//www.openmp.org
- ????www.google.com
4??????Programming with Shared Memory
5?????????
- ??????
- ??????????????????????,??????????????????.
- ????????????????.
- ??????????????????,????????????????.
- ??????????????????.
- ?????,?????????????????,???????????????,??????????
??????????.
6???????????
- ?????????
- Pthreads(????)
- X3H5(????)
- OpenMP(??????????????,????????.)
- ?????????
- ????????.(Pthreads).
- ??????,OpenMP?.
- ??
- C,Fortran77,Fortran90/95,C
7??????
- ?????(Thread Library)
- Win32 API.
- POSIX threads????.
- X3H5???????
- ????(Compiler Directives)
- OpenMP - portable shared memory parallelism.
8???????????
- ???????????????.
- ?????,?????
- ????????????????????1/30???Sun4/75?????,??????????
?52??,?fork()??????1700??? - ???????????????1/3.
- ???RPC???,???????????
- ???????????
- ????????,???????.
- ??????????????????,?????????
- ?????Web?????????????????????,??????????cache????
?????? - ?????
- ????????????????,??????????????????1995??POSIX????
????,????????????????????Pthreads,?Linux?SUN?IBM
AIX??
9Pthreads????
- POSIX1003.4a???????????. ??????,??????????????POSI
X??.????????????????. - IEEE Portable Operating System Interface, POSIX,
1003.1-1995??POSIX????pthreads.
10????(Pthread??)
- ??pthread_create
- ??pthread_exit
- ??pthread_join
- ??pthread_detach
- ???????pthread_attr_init
- ????pthread_once
11????
- ?????????????,??????????,????????????????
- pthread?????????? ???????.
12?????
- ?? ??
- Mutex_init() ????????
- Mutext_lock() ???????
- Mutex_trylock() ????????
- Mutex_unlock() ??
- Mutex_destroy() ??????
13???????
- ?? ??
- pthread_cond_init() ???????
- pthread_cond_wait() ????????
- pthread_cond_signal() ??????,????????????
- pthread_cond_timedwait() ???????????timeout
- pthread_cond_broadcast() ??????????????
- pthread_cond _destroy() ??????
14Hello World(1)
- include ltpthread.hgt
- include "stdio.h"
- void worker()
- main()
-
- pthread_t thread
- pthread_create(thread,NULL,worker,NULL)
- pthread_join(thread,NULL)
-
- void worker()
-
- printf("Hello World!\n")
???? gcc hello.c lpthread ???? Hello World!
15- pthread_t ??????
- pthread_create(thread,NULL,worker,NULL)
- ??pthread_create()?????????,??????????????
- ??
- ???????
- ??????,???????NULL. ?????????????????????????,???
??,???????. - ????????
- ????????????,??NULL.???????
- ?????
- ??????????
- ???pthear_exit()??
- ?????
- ??????????
- ??????exit()?,????????????.
16- pthread_join(pthread_t wait_for,void status)
- ????????
- ????????????,???wait_for???????
- ????????????????????(????????)
- ???
- 0 ????
- ESRCH ??wait_for???????????????
- EINVAL ??????
- EDEADLK ??????.
- ???????????????????, ????????????,??????ESRCH??.
17Hello World(2)
- include ltpthread.hgt
- include "stdio.h"
- define numthrds 5
- pthread_t tid
- void worker()
- main()
- int i
- tid (pthread_t) calloc(numthrds,sizeof(pthread
_t)) - for(i0iltnumthrdsi) pthread_create(tidi,NU
LL,worker,NULL) - for(i0iltnumthrdsi) pthread_join(tidi,NULL)
-
- void worker()
- int myid
- myid pthread_self() - tid0
- printf("Hello World from thread d!\n",myid)
Hello World from thread 0! Hello World from
thread 1! Hello World from thread 2! Hello World
from thread 3! Hello World from thread 4!
18Hello World(3)
void worker() int myid,num myid
pthread_self() - tid0 printf("d was added
to the sum in thread d\n",myid10,myid)
pthread_mutex_lock(mutex) sum
myid10 pthread_mutex_unlock(mutex) return
- include ltpthread.hgt
- include "stdio.h"
- define numthrds 5
- pthread_t tid
- pthread_mutex_t mutex
- int sum0
- void worker()
- main()
- int i
- tid (pthread_t) calloc(numthrds,sizeof(pthread
_t)) - pthread_mutex_init(mutex,NULL)
- for(i0iltnumthrdsi) pthread_create(tidi,NU
LL,worker,NULL) - for(i0iltnumthrdsi) pthread_join(tidi,NULL)
- printf(The sum is d\n",sum)
19????
- 0 was added to the sum in thread 0
- 10 was added to the sum in thread 1
- 20 was added to the sum in thread 2
- 30 was added to the sum in thread 3
- 40 was added to the sum in thread 4
- The sum is 100
20????????PI??
21- include ltpthread.hgt
- include "stdio.h"
- pthread_mutex_t reduction_mutex
- pthread_t tid
- double pi,w
- int n
- int num_threads
- double f(a)
- double a
-
- return (4.0/(1.0 aa))
-
void PIworker(void arg) int i,myid
double sum,mypi,x /set individual id to start
at 0 / myid pthread_self() - tid0
/integrate function/ sum0.0 for(i myid
1i lt n inum_threads) x w
((double)i - 0.5) sum f(x) mypi
w sum /reduce value/ pthread_mutex_lock(
reduction_mutex) pi mypi
pthread_mutex_unlock(reduction_mutex)
return(0)
22gcc hello.c lpthread a.out 1000 5computed pi
3.1415927369231271
??Openmp
- void main(argc,argv)
- int argc
- char argv
-
- int i
- /check command line /
- if(argc ! 3)
- printf("Usage s Num_intervals
Num_threads\n",argv0) - exit(0)
-
- /get num intervals and num threads from
command line/ - n atoi(argv1)
- num_threads atoi(argv2)
- w 1.0 / (double)n
- pi 0.0
- tid (pthread_t) calloc (num_threads,sizeof(pt
hread_t))
/initilize lock/ if(pthread_mutex_init(reductio
n_mutex,NULL)) fprintf(stderr,"Cannot init
lock\n") exit(1) /create the threads/
for(i 0 iltnum_threads i) if(pthread_create
(tidi,NULL,PIworker,NULL))
fprintf(stderr,"Cannot create thread d\n",i)
exit(1) /join threads/ for(i
0 i lt num_threads i) pthread_join(tidi
,NULL) printf("computed pi .16f\n",pi)
23?????????
- pthread_create()??????????????????????
????????????? vs. ????????????????. - ?????????????
- ???????,????????,?????????????
- ????????,????????,???Pthreads?????
- Pthreads?????????, ????????????,??????????????????
????????????????????????????????????????????????
?????????????????????????OpenMP
24??????
- ?????(Thread Library)
- Win32 API.
- POSIX threads????.
- X3H5???????
- ????(Compiler Directives)
- OpenMP - portable shared memory parallelism.
25www.openmp.org
- An Industry Standard API for Shared Memory
Programming - An API for Writing Multithreaded Applications
- ?????????????
- ??Fortran, C and C??????????
26?X3H5???
- X3H5?ANSI/X3????????,??????PCF(the Parallel
Computing Forum)??????,?????????ANSI??.
PCF??????????,??DO???????????????????,????????????
????. - OpenMP???????????,????????,????????????.
27ANSI X3H5??????
- ????????(ANSI??(1993))
- ??????????????????X3H5,?X3H5?????????????????????.
(???????OpenMP???!) - X3H5??C,Fortran77??Fortran90??.
- X3H5?????????????????
- ???(????Work Sharing)
- ????
- ???
parallel end parallel
psections end psections
pdo end pdo
psingle end psingle
28X3H5????
- program main !?????????
- A !A????????
- parallel !???????
- B !B????????
- psections !?????
- section
- C !??????C
- section
- D !???????D
- end psections !??C?D???
- psingle ?????????
- E !E?????????
- end psingle !??????
- pdo I1,6 !??do????
- F(i) !?????????
- end pdo no wait !???????
- G !???????
- end parallel !??????
- H !?????H
??
P
Q
R
??barrier
B
B
B
C
D
??barrier
E
??barrier
F(12)
F(34)
F(56)
???barrier
G
G
G
??barrier
H
?????????????? ???F(11),F(22),F(36)
29X3H5????????
- ?????????,???????????,??????????.?????parallel?,??
????????????????(???????).???????????????.????????
??????,??end parallel.??????????,??????????. - ?????????????????,??????????,?????????????.
- ?????,?????
- ????parallel, end parallel, end pdo?end
psingle???barrier.????,??no wait - ????????????,??????????
????
fork
...
????
barrier
????
30OpenMP ????
- Fork-Join ????
- ????????????????????.
- ?????????????.
31????OpenMP?
- OpenMP????????
- ????????.
- ?????????.
- ??????????????,?????,??????????,?????OpenMP???.
?OpenMP???????????????
void main() double Res1000 for(int
i0ilt1000i) do_huge_comp(Resi)
void main() double Res1000 pragma omp
parallel for for(int i0ilt1000i)
do_huge_comp(Resi)
????
????
32????????
- OpenMP ?????????.
- ??????????.
- ?????????race condition (????)
- race condition?????,??????????(????????)?????????
,?????????????????????????,???????????????,???????
??? - ????????????
- ?????????????.
33OpenMP??
- ??OpenMP????????pragmas.
- C?C?pragmas???
- pragma omp construct clause clause
- Fortran?,???????????
- COMP CONSTRUCT clause clause
- !OMP CONSTRUCT clause clause(????????)
- OMP CONSTRUCT clause clause
- ???????(??????)
- C23456789
- !OMP PARALLEL DO SHARED(A,B,C)
- COMP PARALLEL DO
- COMPSHARED(A,B,C)
- COMP PARALLELDOSHARED(A,B,C)
- ??OpenMP????????,????OpenMP???????OpenMP???????,??
????.
34Structured blocks(????)
- ??????
- ?????????????????
- ????????????????
- ???Fortran??STOP???c/c??exit()???,???????.
- ??OpenMP???????.
COMP PARALLEL 10 30 if() goto 20 go to
10 COMP END PARALLEL if() goto 30 20 print ,
id
COMP PARALLEL 10 if() goto 10 COMP END
PARALLEL print ,id
??????
???????
35OpenMP??????
- OpenMP?????????
- ???Parallel Regions
- ????Worksharing
- ????Data Environment
- ??Synchronization
- ?????/????
- ?Fortran,C/C?,OpenMP???????.
36Parallel Regions(???)
- ????OpenMP?????,???????????????.
- ???????omp parallel?,??????,????????????????.???
???????,??????ID??,???ID?0. - ?????????????.
- ?????4??????
double A1000 omp_set_num_threads(4) pragma
omp parallel int ID omp_thread_num()
worker(ID,A)
??????????ID ??????A????????????. ID(0,1,2,3).
37????Lecical / dynamic extent??Orphaned ????
bar.f subroutine whoami external
omp_get_thread_num integer iam,
omp_get_thread_num iam omp_get_thread_num() COM
P CRITICAL print,Hello from , iam COMP END
CRITICAL return end
poo.f COMP PARALLEL call whoami COMP END
PARALLEL
Static/lexical extent????????????????.
Dynamic extent???????????(????)?????,????region.
Orphan???????????????,??????????,?????inline??
38???????
double A1000 omp_set_num_threads(4) pragma
omp parallel int ID omp_thread_num()
worker(ID,A)
??????????,????.
Double A1000
opm_set_num_threads(4)
worker(2,A)
worker(1,A)
worker(3,A)
worker(0,A)
?????????(?,??barrier??)
??,?????????SPMD??.
39Hello World(C)
include ltomp.hgt main() int
myid,numthreads pragma omp parallel
myid omp_get_thread_num()
numthreads omp_get_num_threads()
printf("Hello World from thread d of
d!\n",myid,numthreads)
40Hello World(Fortran)
PROGRAM HELLO integer myid,numthreads integer
omp_get_num_threads,omp_get_thread_num !omp
parallel private(numthreads,myid)
numthreads omp_get_num_threads() myid
omp_get_thread_num() print , 'Hello
World from thread' ,myid,'of',numthreads !omp
end parallel stop end
41OpenMP??????
- ????OpenMP??????????????,???OpenMP??????.
- IBM AIX xlc???,????????-qsmp
- xlc file.c qsmp
- xlf_r file.f -qsmp (xlf_r?IBM AIX4.3????????????)
- ??3000OS AIX4.3 -qsmp AIX4.3?? OpenMP????
- Intel C/C???icc, Intel Fortran??????-openmp
- icc file.c openmp
- ifc file.f openmp
- ??4000LOSRedhat Linux 8.0
- PGI C/C???icc, PGI Fortran??????-mp
- pgcc file.c mp
- pgf77 file.f mp
- pgf90 file.f mp
- ??4000AOSSuSE Linux 8.0 / Turbo Linux
42????(?????)
- C
- pragma omp parallel clause clause ...
new-line - structured-block
- Fortran
- !OMP PARALLEL clause, clause...
- block
- !OMP END PARALLEL
- ??clause?????
- if(expr)??expr???????????????
- private(list)?????,???????
- firstprivate(list)?????????????????
- default(shared none)(C)
- DEFAULT(PRIVATE SHARED NONE)(Fortran)
- shared(list)????????????
- copyin(list)??????threadprivate?????
- reduction(operator list)????
43OpenMP??????
- OpenMP?????????
- ???Parallel Regions
- ????Worksharing
- DO(Fortran)/for(C)????????????
- Sections???????
- Single?????????????????(?I/O)
- ????Data Environment
- ??Synchronization
- ?????/????
OpenMP?????
44????DO(Fortran)/for(C)??
- Fortran
- !OMP DO clause, clause...
- do_loop
- !OMP END DO NOWAIT(??)
- C/C
- pragma omp for clause clause ... new-line
- for-loop
COMP PARALLEL COMP DO DO i0,n
pragma omp parallel pragma omp for for
(i0iltni)
?DO/for????????barrier????,?NO WAIT/no wait????.
45??parrallel???for??
for(i0IltNi) ai ai bi
????
pragma omp parallel int id, i, Nthrds,
istart, iend id omp_get_thread_num()
Nthrds omp_get_num_threads() istart id
N / Nthrds iend (id1) N / Nthrds
for(iistartIltiendi) ai ai bi
?????????
pragma omp parallel pragma omp for
schedule(static) for(i0IltNi) ai ai
bi
????????????
??DO???PARALLEL???????,??????????????C??.
46????????????
- ?????????OpenMP??????????
- ??????????????????,?????????????????
- ??????????,??????????????????????????????.
- ???????????,???????????????????
- ??????!omp parallel
- ???????do/for,section,?single??.
47????for??
- pragma omp for clause clause ... new-line
- for-loop
- Clause??????
- private(list)
- firstprivate(list)
- lastprivate(list)
- reduction(operator list)
- ordered
- schedule(kind, chunk_size)
- nowait
???????
48????DO??
- !OMP DO clause, clause...
- do_loop
- !OMP END DO NOWAIT
- PRIVATE(list)
- FIRSTPRIVATE(list)
- LASTPRIVATE(list)
- REDUCTION(operatorintrinsic_procedure_namelist
) - SCHEDULE(type,chunk)
- ORDERED
49DO/for??????
- ????????DO?for??.
- For??????????,??????break????.
- ?Fortran?,????END DO????,???????DO???????.
- ?????????.
- Schedule, ordered,nowait????????.
50schedule
- Schedule?????????????????
- schedule(dynamic,chunk)
- ???????chunk_size?????,??????????,????,??????(????
??????chunk_size).(???) - ?chunk_size?????,???1.
- schedule(static,chunk)
- ??chunk_size???, ??????????????chunk??????,???????
????,???????. - ??chunk_size????,??????????????????????.
- schedule(guided,chunk)
- ?????????????,?????chunk????.
- schedule(runtime)
- ?????chunk??????????OMP_SCHEDULE???.
- chunk????????.
- ??????.
51Schedule???
Work pool
Work
Work
..
..
..
..
..
.
.
.
????
.
.
.
Dynamic??
Static??
Guided??
52????
- ??????????.
- ??
- ???????,????????????.
- ?????????????
- ??????????????????(???????).
- ??
- ??????????????,?????????.
- Guided??????for??
- ??
- ???????????qceiling(n/p)???,??nmax(n-q,pk),????
,??npk??. - ????????????,????????????????????.
53NOWAIT??(Fortran)
??????i???????????
COMP PARALLEL COMP DO do i1,n
a(i) cos(a(i)) enddo COMP END DO COMP
DO do i1,n b(i)a(i)b(i)
enddo COMP END DO COMP END PARALLEL
COMP PARALLEL COMP DO do i1,n
a(i) cos(a(i)) enddo COMP END DO
NOWAIT COMP DO do i1,n
b(i)a(i)b(i) enddo COMP END DO COMP END
PARALLEL
?? BARRIER
No BARRIER
END DO????enddo,???.
54no wait??(C)
pragma omp parallel pragma omp for
for(i1iltni) a(i)
cos(a(i)) pragma omp for
for(i1iltni) b(i)a(i)b(i)
pragma omp parallel pragma omp for no
wait for(i1iltni)
a(i) cos(a(i)) pragma omp for no wait
for(i1iltni)
b(i)a(i)b(i)
No BARRIER
?? BARRIER
????.
55Sections??(?????)
- Sections??????????????????????.(??10???10?????????
?,????.)
pragma omp sections no wait x_calculation()
pragma omp section y_calculation() pragma
omp section z_calculation()
x_calculation(),y_calculation()??z_calculation()??
?????????? ???????.?????????????.
??????omp sections????????barrier????.????
nowait ??????barrier??(???????????). ?for?????,O
penMP???parallel sections.
56Single
- Single?????????????????
- pragma omp single clause clause ... new-line
- structured-block
- Clause is one of the following
- private(list)
- firstprivate(list)
- nowait
57Work sharing????
- Fortran
- DO
- SECTIONS
- SINGLE
- WORKSHARE
58Binding?????????
- for, sections, single, master, and
barrier???????????????????,???????.
pragma omp parallel pragma omp for for
(I0IltNI) NEAT_STUFF(I)
pragma omp parallel for for (I0IltNI) NEAT_
STUFF(I)
59Fortran
!OMP PARALLEL DO clause, clause... do_loop
!OMP END PARALLEL DO
!OMP PARALLEL SECTIONS clause,
clause... !OMP SECTION block !OMP
SECTION block . . . !OMP END PARALLEL SECTIONS
!OMP PARALLEL WORKSHARE clause,
clause... block !OMP END PARALLEL WORKSHARE
60C
pragma omp parallel for clause clause ...
new-line for-loop
pragma omp parallel sections clause clause
... new-line pragma omp section
new-line structured-block pragma omp section
new-line structured-block . .
61OpenMP??????
- OpenMP?????????
- ???Parallel Regions
- ????Worksharing
- ????Data Environment
- ??Synchronization
- ?????/????
62??????
- ????????
- ????????????
- ?????????
- Fortran COMMON ?, SAVE ??, MODULE ??
- C File scope variables, static
- ????????????...
- ???????????????????
- ??????Auto???????.
63????????
subroutine work common /input/ A(10) real
temp(10) integer count save count
program sort common /input/ A(10) integer
index(10) call input COMP PARALLEL call
work(index) COMP END PARALLEL print, index(1)
??A,index?cound???????. temp???????,????????.
64??????
- ???????? threadprivate?????????????????.
- ?????????????????
- shared(?????)
- private
- firstprivate
- lastprivate??????????????????, ????????
- ????????????
- default (private shared none)
65??????
- ??????OpenMP??????????.
- ?????
- ???????
- Copyin
- Firstprivate
- ??????
- Reduction
- Lastprivate
- OpenMP??????????????????????????????.
- OpenMP???????
- ?????????
- ?threadprivate ?????????
- ?private, firstprivate,lastprivate, or reduction
??????? - ??????.
66Threadprivate?????????
- parameter (N1000)
- real A(N,N)
- COMP THREADPRIVATE(/buf/)
- common/buf/lft(N),rht(N)
- COMP PARALLEL
- call init
- call scale
- call order
- COMP END PARALLEL
buf ????????
subroutine scale parameter
(N1000) COMP THREADPRIVATE(/buf/)
common/buf/lft(N),rht(N) do i1, N
lft(i) const A(i,iam) end do
return end
subroutine order parameter
(N1000) COMP THREADPRIVATE(/buf/)
common/buf/lft(N),rht(N) do i1, N
A(i,iam) lft(index) end do
return end
67Private
- private(list)??list??????????????.
- ?????????(???????)
- ????????,???????
main() int i 10000 pragma omp
parallel private(i) i -10000
printf("d\n",i) ?? 10000
main() int i 10000 pragma omp
parallel i -10000
printf("d\n",i) ?? -10000
68- Private???????????????,?????????????,????????????,
????????????. - ????????,??????????????????????????????????,?????
????????????????????????. - ?????????????????
- ???????????(?????????)
69?
3 804398705 2 804398705 2 804398706 2 804398707 0
804398705 0 804398706 0 804398707 1 804398705 1 80
4398706 1 804398707 sum 10
main() int i,sum0,myid pragma
omp parallel for \
private(i,sum)
for(i0ilt10i) myid
omp_get_thread_num()
printf("d\n",myid) sum sum
1 printf("d\n",sum)
printf("sum
d\n",sum)
??sum ????.
70Firstprivate
- Firstprivate? private?????.
- ????????????????????.
1 2 3 1 1 2 3 1 2 3
main() int i,sum0,myid pragma
omp parallel for firstprivate(i,sum)
for(i0ilt10i) sum sum 1
printf("d\n",sum)
printf("sum d\n",sum)
71Lastprivate
- Lastprivate??????????????????.
pragma omp parallel pragma omp for
lastprivate(i) for (i0 iltn-1 i) ai
bi bi1 aib0
for (i1iltn-1i) a(i) b(i1) a(i) b(0)
???? in-1
72Default
- ????default(shared)(???????)
- ????default(private)
- ????????????????,?????
- ????????????private(list)
- default(none) ????????????????
- Fortran??default(private).
- C/C ?default(private),??default(shared)
?default(none).
73DEFAULT?(Fortran)
itotal 1000 COMP PARALLEL PRIVATE(np, each) np
omp_get_num_threads() each itotal/np COMP
END PARALLEL
itotal 1000 COMP PARALLEL DEFAULT(PRIVATE)
SHARED(itotal) np omp_get_num_threads() each
itotal/np COMP END PARALLEL
74reduction
- ????(?????????????????????)
- reduction (op list).
- List?????????????????.
- ???????
- Operator Initialization
- 0
- 1
- 1
- 0
- ??????????
pragma omp parallel for private(i) shared(x, y,
n) reduction( a, b) for (i0 iltn i) a
a xi b b yi
75??PI??
- ?????????????PI????(????????).
- ??OpenMP?????????.???????????,???????(????????????
???for??) - ??????????????SPMD????.
- ????????????.
- ??.
76????
include "stdio.h" main(int argc,char argv)
n atoi(argv1) w 1.0 /
(double) n sum 0.0
for(i0iltni) x w ((double)i -
0.5) sum sum 4.0/(1.0xx)
pi w sum printf("Computed pi
.16f\n",pi)
77???Parallel????????
- include "stdio.h"
- main(int argc, char argv)
-
- n atoi(argv1)
- w 1.0 / (double) n
- sum 0.0
- pragma omp parallel private(x)
shared(w) reduction(sum) -
- myid omp_get_thread_num()
- numthreads omp_get_num_threads()
- for(imyidiltninumthreads)
- x w ((double)i -
0.5) - sum sum
4.0/(1.0xx) -
-
- .
????????
78??for????????
- include "stdio.h"
- main(int argc, char argv)
-
-
- n atoi(argv1)
- w 1.0 / (double) n
- sum 0.0
- pragma omp for reduction(sum)
- for(i0iltni)
- x w ((double)i -
0.5) - sum sum
4.0/(1.0xx) -
- pi w sum
- printf("Computed pi
.16f\n",pi) -
?Pthreads??
79OpenMP??????
- OpenMP?????????
- ???Parallel Regions
- ????Worksharing
- ????Data Environment
- ??Synchronization
- ?????/????
80OpenMP??
- ??????
- ????I/O
- OpenMP????????
- atomic
- critical section
- barrier
- flush
- ordered
- single
- master
???????????????,?????????????????.
81critical section
- ??????????????.
- pragma omp critical (name) new-line
- structured-block
COMP PARALLEL DO PRIVATE(B) COMP
SHARED(RES) DO 100 I1,NITERS B DOIT(I) COMP
CRITICAL CALL CONSUME (B, RES) COMP END
CRITICAL 100 CONTINUE
82atomic
- Atomic???????,???????????.
- pragma omp atomic new-line
- expression-stmt
- ??expression-stmt???????
- x binop expr (bino??? - / ltlt
gtgt ) - x
- x
- x--
- --x
- ??????????(?????????X???)
- COMP PARALLEL PRIVATE(B)
- B DOIT(I)
- COMP ATOMIC
- X X B
- COMP END PARALLEL
83pragma omp parallel for \ shared(x, y, index,
n) for (i0 iltn i) pragma omp
atomic xindexi work1(i) yi
work2(i)
pragma omp parallel for \ shared(x, y, index,
n) for (i0 iltn i) pragma omp
critical xindexi work1(i) yi
work2(i)
????
???
84??????????
- ?????????????,OpenMP????????????????????????????.
- ??????????????.
- ????????????
- ??????????????,?????????.
- ???????????,
- ???????????,????????????
85barrier
- Barrier ???????????????????Barrier??.
pragma omp parallel shared (A, B, C)
private(id) idomp_get_thread_num() Aid
big_calc1(id) pragma omp barrier pragma omp
for for(i0iltNi) Cibig_calc3(I,A) prag
ma omp for nowait for(i0iltNi) Bibig_cal
c2(C, i) Aid big_calc3(id)
for?????barrier??
for?????barrier??
parallel????barrier??
86ordered
- Ordered????????????????????????????????.
- ?????,????????ordered,?????????????
- ???????????????
- void worker(int k)
- pragma omp ordered
- printf(d ,k)
-
- main()
- int i
- pragma omp parallel for schedule(dynamic)
- for(i0ilt5i)
- worker(i)
-
- ????
- 0 1 2 3 4
87master
- Master???????????????????. ????????.??????barrier?
?.
pragma omp parallel private (tmp) do_many_thin
gs() pragma omp master exchange_boundaries()
pragma barrier do_many_other_things()
88single
- Single??????????????????????(???????).
- ?single???????barrier????.
pragma omp parallel pragma omp
single printf("Beginning work1.\n") work1()
pragma omp single printf("Finishing
work1.\n") pragma omp single
nowait printf("Finished work1 and beginning
work2.\n") work2()
????single????
??
??
???
89flush
- pragma omp flush (list) new-line
- !OMP FLUSH (list)
- Flush??????????.??????????,??????????????????????.
- ?????????????????,????????.
90Flush(Fortran)
- ??flush
- BARRIER
- CRITICAL and END CRITICAL
- END DO
- END SECTIONS
- END SINGLE
- END WORKSHARE
- ORDERED and END ORDERED
- PARALLEL and END PARALLEL
- PARALLEL DO and END PARALLEL DO
- PARALLEL SECTIONS and END PARALLEL SECTIONS
- PARALLEL WORKSHARE and END PARALLEL WORKSHARE
- ???????flush
- DO
- MASTER and END MASTER
- SECTIONS
- SINGLE
- WORKSHARE
91Flush(C)
- ??flush
- barrier
- Critical?????
- Ordered?????
- Parallel???
- For???
- Sections???
- Single???
- ???flush
- no wait
92????
- end parallel
- end do (?nowait??)
- end sections (?nowait??)
- end critical
- end single (?nowait??)
93Nesting???????
- ??parallel?????????????parallel?.????????????,????
??????????????,??,?????????????. - ??parallel??for, sections, ? single?????????.
- ??critical?????????.
- for, sections, ? single ?????critical, ordered, ?
master ??????. - barrier ??????? for, ordered, sections, single,
master, ? critical ??????. - master ????? for, sections, ? single ??????.
- ordered ????? critical??????.
94OpenMP??????
- OpenMP?????????
- ???Parallel Regions
- ????Worksharing
- ????Data Environment
- ??Synchronization
- ?????/????
95OpenMP??
- ???
- omp_init_lock(), omp_set_lock(),
omp_unset_lock(), omp_test_lock(),
omp_destroy_lock() - ???????
- ????????
- omp_set_num_threads(), omp_get_num_threads(),
omp_get_thread_num(), omp_get_max_threads() - ?/????????
- omp_set_nested(), omp_set_dynamic(),
omp_get_nested(), omp_get_dynamic() - ????????????
- omp_in_parallel()
- ??????????
- omp_get_num_procs()
96?????
- ??????????????
- ?????omp_lock_t,????????????? omp_init_lock().
- ????????????????????,???????,????????.
- ?????,??????? omp_set_lock(),?????????omp_unset_l
ock(). - ??????????,????????omp_test_lock()??????,?????????
?. - ???????,?omp_destroy_lock()??.
97- include ltomp.hgt
- int main()
-
- omp_lock_t lck
- int id
- omp_init_lock(lck)
- pragma omp parallel shared(lck) private(id)
-
- id omp_get_thread_num()
- omp_set_lock(lck)
- printf("My thread id is d.\n", id)
- omp_unset_lock(lck)
- while (! omp_test_lock(lck))
- skip(id) / we do not yet have the lock, so we
must do something else / -
- work(id) / we now have the lock and can do
the work / - omp_unset_lock(lck)
-
- omp_destroy_lock(lck)
98???????
omp_lock_t lck omp_init_lock(lck) pragma omp
parallel private (tmp) id omp_get_thread_num(
) tmp do_lots_of_work(id) omp_set_lock(lck)
printf(d d, id, tmp) omp_unset_lock(lck)
99- ??????,?????????(???????????????).
include ltomp.hgt void main() omp_set_dynamic(0
) omp_set_num_threads(4) pragma omp
parallel int idomp_get_thread_num() do_l
ots_of_stuff(id)
100?????
- omp_set_dynamic(0)
- omp_set_num_threads(16)
- pragma omp parallel shared(x, npoints)
private(iam, ipoints) -
- if (omp_get_num_threads() ! 16) abort()
- iam omp_get_thread_num()
- ipoints npoints/16
- do_by_16(x, iam, ipoints)
101?????
- int numthreads
- numthreads omp_get_num_threads()
- printf(d\n,numthreads)
- pragma omp parallel private(i)
-
- numthreads omp_get_num_threads()
- printf(d\n,numthreads)
-
- ??
- 1
- 4
- 4
- 4
- 4
102????
- ????????
- OMP_SCHEDULE SCHEDULE, CHUNK_SIZE
- ???????
- OMP_NUM_THREADS INT_LITERAL
- ????????????????(???????)?
- OMP_DYNAMIC TRUE FALSE
- ???? (??)
- ????????????,?????????????.
- ??,???????omp_set_num_threads()??????,????????????
?????????. - ????
- ???????????????.
- ????????????????????????(????????????,?I/O???)
- OMP_NESTED TRUE FALSE(???FALSE)
103??
- ???
- parallel
- ????
- for
- sections
- Single
- parallel for
- parallel sections
- ??
- master
- critical
- barrier
- atomic
- flush
- ordered
- ???
- parallel
- ????
- DO
- SECTIONS
- SINGLE
- WORKSHARE
- PARALLEL DO
- PARALLEL SECTIONS
- PARALLEL WORKSHARE
- ??
- MASTER
- CRITICAL
- BARRIER
- ATOMIC
- FLUSH
- ORDERED
104- ????????
- omp_set_num_threads
- omp_get_num_threads
- omp_get_max_threads
- omp_get_thread_num
- omp_get_num_procs
- omp_in_parallel
- omp_set_dynamic
- omp_get_dynamic
- omp_set_nested
- omp_get_nested
- OMP_SET_NUM_THREADS
- OMP_GET_NUM_THREADS
- OMP_GET_MAX_THREADS
- OMP_GET_THREAD_NUM
- OMP_GET_NUM_PROCS
- OMP_IN_PARALLEL
- OMP_SET_DYNAMIC
- OMP_GET_DYNAMIC
- OMP_SET_NESTED
- OMP_GET_NESTED
- OMP_GET_WTIME
- OMP_GET_WTICK
105- ?????
- omp_init_lock
- omp_init_nest_lock
- omp_destroy_lock
- omp_destroy_nest_lock
- omp_set_lock
- omp_set_nest_lock
- omp_unset_lock
- omp_unset_nest_lock
- omp_test_lock
- omp_test_nest_lock
OMP_INIT_LOCK OMP_INIT_NEST_LOCK OMP_DESTROY_LOCK
OMP_DESTROY_NEST_LOCK OMP_SET_LOCK OMP_SET_NEST_LO
CK OMP_UNSET_LOCK OMP_UNSET_NEST_LOCK OMP_TEST_LO
CK OMP_TEST_NEST_LOCK
106????(C?Fortran??) OMP_SCHEDULE OMP_NUM_THREADS
OMP_DYNAMIC OMP_NESTED
107OpenMP????
- ??C,C?Fortran
- ????????????????,???????????????
- ???????????????
- ??????????????????,??????????????.
- Orphan???????,??OpenMP???????????????????????
108??!