SlideShare a Scribd company logo
Tài liệu: Introduction to Parallel Computing
Blaise Barney, Lawrence Livermore National Laboratory
https://computing.llnl.gov/tutorials/parallel_comp/
Tính toán song song và phân tán
PGS.TS. Trần Văn Lăng
langtv@vast. vn
1
L
ậ
p tr
ì
nh song song v
ớ
i Python
2
1. T
ổ
ng quan
2. S
ự
kh
á
c bi
ệ
t gi
ữ
a Thread v
à
Process
3. Song song d
ữ
li
ệ
u
4. S
ử
dung Thread
5. S
ử
d
ụ
ng Process
6. Đa x
ử
l
ý
trong Khoa h
ọ
c d
ữ
li
ệ
u
T
ổ
ng quan
• L
ậ
p tr
ì
nh song song v
ớ
i Python c
ó
th
ể
ti
ế
p c
ậ
n theo
c
á
c c
á
ch như:
– D
ù
ng thư vi
ệ
n c
ủ
a c
ủ
a Python
• Threading, multiprocessing
– D
ù
ng ScientificPython
• Scientific.BSP
• Scientific.DistributiedComputing
– IPython
• Interactive shell for working with clusters
– Kh
á
c
• pyMPI, mpi4py, pypar
3
• Đ
ể
ki
ể
m tra c
ấ
u h
ì
nh c
ủ
a m
á
y, s
ử
d
ụ
ng g
ó
i platform
(sysinfor.py)
4
• Đ
ể
bi
ế
t s
ố
core c
ủ
a m
á
y, s
ử
dung g
ó
i
multiprocessing
5
• M
ộ
t s
ố
k
ế
t qu
ả
th
ử
nghi
ệ
m
6
• Đ
ể
bi
ế
t t
ê
n v
à
đ
ị
a ch
ỉ
IP c
ủ
a m á
y (hostname.py)
7
• Để đo thời gian thực thi, d
ù
ng h
à
m time() c
ó
trong
g
ó
i time (elapsetime.py)
8
C
ó
th
ể
coi th
ê
m t
ạ
i https://www.tutorialspoint.com/python/python_date_time.htm
Thread v
à
Process
• Process (ti
ế
n tr
ì
nh) l
à
m
ộ
t th
ự
c th
ể
(instance) c
ủ
a
chương tr
ì
nh m
á
y t
í
nh.
• Ti
ế
n tr
ì
nh sinh ra c
á
c Threads (lu
ồ
ng) hay c
ò
n g
ọ
i l
à
sub-processes (ti
ể
u ti
ế
n tr
ì
nh) đ
ể
x
ử
l
ý
c
á
c nhi
ệ
m v
ụ
ph
ụ
. Ch
ẳ
ng h
ạ
n, đ
ọ
c c
á
c ph
í
m đư
ợ
c nh
ấ
n
(keystrokes), hi
ể
n th
ị
k
ý
t
ự
v
ừ
a đ
ọ
c l
ê
n m
à
n h
ì
nh, n
ạ
p
m
ộ
t trang v
ă
n b ả
n t
ừ
đ
ĩ
a v
à
o b
ộ
nh
ớ
sau đ
ó
hi
ể
n th
ị
l
ê
n m
à
n h
ì
nh, ghi t
ậ
p tin v
à
o đ
ĩ
a, ...
• Threads t
ồ
n t
ạ
i (live) b
ê
n trong ti
ế
n tr
ì
nh v
à
chia s
ẻ
c
ù
ng kh
ô
ng gian b
ộ
nh
ớ
c
ủ
a Process.
9
• V
í
d
ụ
, khi m
ở
m
ộ
t
ứ
ng d
ụ
ng so
ạ
n th
ả
o v
ă
n b
ả
n; c
ó
ngh
ĩ
a l
à
ch
ú
ng ta t
ạ
o ra m
ộ
t Process.
• Khi b
ắ
t đ
ầ
u nh
ậ
p, Process sinh ra c
á
c Threads ch
ẳ
ng
h
ạ
n như:
– đ
ọ
c c
á
c ph
í
m b
ấ
m
– hi
ể
n th
ị
v
ă
n b
ả
n
– t
ự
đ
ộ
ng lưu t
ậ
p tin l
ạ
i
– l
à
m n
ổ
i b
ậ
t (highlight) c
á
c l
ỗ
i ch
í
nh t
ả
khi nh
ậ
p
10
• B
ằ
ng c
á
ch sinh ra nhi
ề
u Thread, Chương tr
ì
nh so
ạ
n
th
ả
o v
ă
n b
ả
n t
ậ
n d
ụ
ng th
ờ
i gian nh
à
n r
ỗ
i c
ủ
a CPU
(ch
ờ
đ
ợ
i c
á
c ph
í
m b
ấ
m ho
ặ
c t
ả
i t ậ
p tin v
ề
) qua đ
ó
l
à
m cho c
ô
ng vi
ệ
c c
ó
n
ă
ng su
ấ
t hơn.
11
• Như v
ậ
y v
ề
vi
ệ
c s
ử
dung b
ộ
nh
ớ
: Threads v
à
Processes l
à
kh
á
c nhau:
– Threads d
ù
ng shared-memory, trong khi đ
ó
Processes th
ì
c
ó
th
ể
kh
ô
ng.
– S
ự
đ
ồ
ng b
ộ
h
ó
a v
ề
d
ữ
li
ệ
u l
à
c
ầ
n thi
ế
t đ
ố
i v
ớ
i c
á
c
Threads, nhưng v
ớ
i Processes l
à
c
ó
th
ể
kh
ô
ng c
ầ
n
12
Process
• M
ộ
t Process c
ó
th
ể
c
ó
nhi
ề
u Thread
• Process đư
ợ
c t
ạ
o ra b
ở
i h
ệ
đi
ề
u h
à
nh đ
ể
th
ự
c thi
chương tr
ì
nh
• Hai Process c
ó
th
ể
thi h
à
nh đ
ồ
ng th
ờ
i m
ộ
t đo
ạ
n code
trong chương tr
ì
nh Python
• Khi m
ở
v
à
đ
ó
ng Process t
ố
n nhi
ề
u th
ờ
i gian hơn so
v
ớ
i m
ở
đ
ó
ng Thread
• Trong trư
ờ
ng h
ợ
p kh
ô
ng chia s
ẻ
kh
ô
ng gian b
ộ
nh
ớ
,
th
ì
vi
ệ
c chia s
ẻ
th
ô
ng tin gi
ữ
a c
á
c Process ch
ậ
m hơn
gi
ữ
a c
á
c Thread
13
Threads
• Thread như l
à
nh
ữ
ng ti
ế
n tr
ì
nh nh
ỏ
(mini-
processes) t
ồ
n t
ạ
i b
ê
n trong Process
• Thread chia s
ẻ
kh
ô
ng gian b
ộ
nh
ớ
n
ê
n c
á
c bi
ế
n đư
ợ
c
dung chung trong vi
ệ
c đ
ọ
c ghi
• Hai Threads kh
ô
ng th
ể
th
ự
c thi đ
ồ
ng th
ờ
i c
ù
ng m
ộ
t
đo
ạ
n code trong chương tr
ì
nh Python
14
V
í
d
ụ
v
ề
s
ự
kh
á
c nhau
• H
à
m (myFunc) xu
ấ
t ID c
ủ
a thread đang ho
ạ
t đ
ộ
ng.
• Khi g
ọ
i h
à
m n
à
y nhi
ề
u l
ầ
n, ID n
à
y đư
ợ
c lưu tr
ữ
l
ạ
i
trong m
ộ
t m
ả
ng to
à
n c
ụ
c A.
15
• K
í
ch ho
ạ
t 10 l
ầ
n đ
ể
cho Thead g
ọ
i h
à
m myFunc() đ
ã
t
ạ
o
ở
tr
ê
n.
• Vi
ệ
c k
ế
t th
ú
c m
ộ
t thread đ
ể
chuy
ể
n sang thread
kh
á
c l
à
kh
ô
ng đ
ặ
t ra ngay khi m
ộ
t thread đư
ợ
c start;
ch
í
nh v
ì
v
ậ
y c
á
c thread c
ầ
n đư
ợ
c lưu tr
ữ
v
à
o trong
m
ả
ng th đ
ể
s
ử
d
ụ
ng v
ề
sau.
16
• Sau đ
ó
m
ớ
i l
ầ
n lư
ợ
t đ
ợ
i cho c
á
c thread n
à
y ho
à
n
th
à
nh c
ô
ng vi
ệ
c b
ằ
ng h
à
m join().
• Sau khi xong, k
ế
t qu
ả
c
ó
trong bi
ế
n to
à
n c
ụ
c A đư
ợ
c
xu
ấ
t ra
17
K
ế
t qu
ả
th
ự
c thi chương tr
ì
nh v
ớ
i Thread
18
Nh
ậ
n x
é
t
• Do th
ờ
i gian sleep kh
á
c nhau, n
ê
n c
á
c thread k
ế
t
th
ú
c kh
ô
ng gi
ố
ng nhau, d
ẫ
n đ
ế
n th
ứ
t
ự
c
ô
ng vi
ệ
c
kh
ô
ng theo th
ứ
t
ự
c
ủ
a c
â
u l
ệ
nh l ặ
p for
• Thread theo cơ ch
ế
s
ử
d
ụ
ng b
ộ
nh ớ
chia s
ẻ
, n
ê
n bi
ế
n
A c
ó
hi
ệ
u l
ự
c trong thread (ID...64) ch
í
nh v
à
c
á
c
thread kh
á
c (ID...52, ID...88, ..., ID...60). V
ì
v
ậ
y m
ả
ng
A ban đ
ầ
u r
ỗ
ng, sau khi th
ự
c hi
ệ
n m
ả
ng A g
ồ
m 10
ph
ầ
n t
ử
l
à
c
á
c Thread ID.
19
• Như v
ậ
y, bi
ế
n to
à
n c
ụ
c A đư
ợ
c s
ử
d
ụ
ng chung gi
ữ
a
c
á
c thread v
ớ
i nhau (shared-memory)
• V
ớ
i chương tr
ì
nh như tr
ê
n; nhưng thay v
ì
d
ù
ng
Thread, d
ù
ng Process th
ì
bi
ế
n to
à
n c
ụ
c A n
à
y
kh
ô
ng t
á
c đ
ộ
ng gi
ữ
a c
á
c process
• C
ầ
n import
20
• H
à
m đ
ể
c
á
c process th
ự
c hi
ệ
n
21
• Th
ự
c thi t
ấ
t c
ả
c
á
c process
22
K
ế
t qu
ả
th
ự
c thi chương tr
ì
nh v
ớ
i Process
23
Lưu
ý
• D
ù
ng Process nhưng đ
ể
c
ó
k
ế
t qu
ả
như Thread, c
ầ
n
ph
ả
i lưu gi
á
tr
ị
v
à
o trong m
ộ
t h
à
ng đ
ợ
i b
ằ
ng c
á
ch
khai b
á
o bi
ế
n Q = Queue().
• Sau đ
ó
đ
ẩ
y k
ế
t qu
ả
c
ầ
n lưu v
à
o trong h
à
ng đ
ợ
i n
à
y.
Ch
ẳ
ng h
ạ
n, Q.put( os.getpid() ).
• Cu
ố
i c
ù
ng, đ
ể
xu
ấ
t ra v
à
đưa v
à
o m
ả
ng A qua l
ệ
nh
A.append( Q.get() )
24
• Chương tr
ì
nh vi
ế
t l
ạ
i như sau
25 26
K
ế
t qu
ả
27
Song song d
ữ
li
ệ
u
• multiprocessing l
à
m
ộ
t g
ó
i c
á
c API h
ỗ
tr
ợ
đ
ể
ph
á
t
sinh c
á
c Process; qua đ
ó
gi
ú
p t
ậ
n d
ụ
ng đư
ợ
c nhi
ề
u
b
ộ
x
ử
l
ý
đ
ể
vi
ế
t chương tr
ì
nh.
• Gi
ả
s
ử
c
ó
m
ộ
t c
ô
ng vi
ệ
c (vi
ế
t dư
ớ
i d
ạ
ng m
ộ
t h
à
m)
đư
ợ
c th
ự
c hi
ệ
n tr
ê
n nhi
ề
u d
ữ
li
ệ
u kh
á
c nhau (Data
Parallelism).
28
• V
í
d
ụ
: C
ầ
n t
í
nh c
ă
n b
ậ
c 2 c
ủ
a 3 s
ố
.
• C
á
c c
â
u l
ệ
nh tu
ầ
n t
ự
c
ó
th
ể
vi
ế
t như sau:
29
• Ho
ặ
c như sau v
ớ
i h
à
m map()
30
• Khi c
ầ
n giao cho nhi
ề
u Process t
í
nh, ch
ẳ
ng h
ạ
n v
ớ
i 3
Process:
31
• Trong đ
ó
, đ
ố
i tư
ợ
ng Pool cung c
ấ
p m
ộ
t phương ti
ệ
n
đ
ể
song song h
ó
a vi
ệ
c th
ự
c hi
ệ
n m
ộ
t h
à
m qua nhi
ề
u
gi
á
tr
ị
đ
ầ
u v
à
o, v
à
ph
â
n ph
ố
i d
ữ
li
ệ
u đ
ầ
u v
à
o cho c
á
c
Process.
32
• V
ớ
i h
à
m nhi
ề
u đ
ố
i s
ố
.
• V
í
d
ụ
: Gi
ả
i 3 phương tr
ì
nh b
ậ
c I d
ạ
ng ax+b=0
33
• Lưu
ý
: khi d
ù
ng v
ớ
i đ
ố
i tư
ợ
ng thu
ộ
c l
ớ
p Pool, h
à
m
map() n
à
y kh
ô
ng chuy
ể
n đ
ổ
i nhi
ề
u đ
ố
i s
ố
đư
ợ
c.
• Đ
ể
thu
ậ
n l
ợ
i, c
ó
th
ể
d
ù
ng m
ộ
t l
ớ
p Container, ch
ẳ
ng
h
ạ
n d
ù
ng g
ó
i collections đ
ể
gom c
á
c đ
ố
i s
ố
c
ủ
a h
à
m
th
à
nh m
ộ
t nh
ó
m.
• Ch
ẳ
ng h
ạ
n, h
à
m f(a,b) c
ó
2 đ
ố
i s
ố
đ
ể
gi
ả
i phương
tr
ì
nh b
ậ
c nh
ấ
t như tr
ê
n, c
ó
th
ể
vi
ế
t l
ạ
i th
à
nh m
ộ
t đ
ố
i
s
ố
f(item)
34
35
• Trong đ
ó
, item c
ó
2 th
à
nh ph
ầ
n l
à
a v
à
b
• Khi s
ử
d
ụ
ng, ph
ả
i t
ạ
o ra ki
ể
u đ
ố
i s
ố
n
à
y:
36
• Khi s
ử
d
ụ
ng
37
• C
ó
th
ể
so s
á
nh th
ờ
i
gian th
ự
c hi
ệ
n c
ủ
a
chương tr
ì
nh song
song so v
ớ
i tu
ầ
n t
ự
qua v
í
d
ụ
gi
ả
i phương
tr
ì
nh.
38
S
ử
d
ụ
ng Thread
• D
ù
ng l
ớ
p Thread trong g
ó
i threading.
• Ch
ẳ
ng h
ạ
n, c
ầ
n k
í
ch ho
ạ
t m
ộ
t Thread đ
ể
th
ự
c hi
ệ
n
c
ô
ng vi
ệ
c qua h
à
m c
ó
s
ẵ
n (gi
ả
i phương tr
ì
nh eqI)
39
S
ử
d
ụ
ng Process
• Tương t
ự
như Thread, c
ó
th
ể
d
ù
ng l
ớ
p Process
trong g
ó
i multiprocessing đ
ể
th
ự
c thi h
à
m eqI()
• V
ớ
i k
ế
t qu
ả
40
Threads v
à
Processes
• Gi
ả
s
ử
c
ó
m
ộ
t chương tr
ì
nh ch
ỉ
ch
ờ
cho h
ế
t th
ờ
i gian
(đ
ặ
t t
ê
n l
à
sleeping()), kh
ô
ng th
ự
c hi
ệ
n b
ấ
t k
ỳ
t
í
nh
to
á
n n
à
o như sau:
41
• N
ế
u run chương tr
ì
nh n
à
y tr
ê
n t
ấ
t c
ả
c
á
c Thread c
ủ
a
m
á
y qua v
í
d
ụ
:
42
• Th
ì
th
ờ
i gian th
ự
c thi l
à
th
ờ
i gian c
ủ
a Thread l
â
u
nh
ấ
t:
43
4 lần gọi
Các Threads của Process 6269
• N
ế
u run chương tr
ì
nh n
à
y tr
ê
n t
ấ
t c
ả
c
á
c Process,
m
ỗ
i Process s
ử
dung Thread ch
í
nh:
44
• Trong trư
ờ
ng h
ợ
p n
à
y, th
ờ
i gian th
ự
c thi tr
ê
n c
á
c
Process c
ũ
ng l
à
th
ờ
i gian l
â
u nh
ấ
t c
ủ
a m
ộ
t Process
n
à
o đ
ó
trong c
á
c Process đư
ợ
c k
í
ch ho
ạ
t
45
• Nhưng khi c
ó
m
ộ
t chương tr
ì
nh c
ó
t
í
nh to
á
n (đ
ặ
t t
ê
n
l
à
calculating())
46
• Th
ờ
i gian th
ự
c thi c
ủ
a Process v
à
Thread l
à
kh
á
c
bi
ệ
t:
47
Truy
ề
n v
à
nh
ậ
n d
ữ
li
ệ
u
• Chương tr
ì
nh Python t
ạ
o 2 Process, Master v
à
Slave.
• Process Master g
ử
i m
ộ
t m
ả
ng 10 gi
á
tr
ị
ng
ẫ
u nhi
ê
n
đ
ế
n Process Slave
• Process Slave nh
ậ
n v
à
xu
ấ
t ra m
à
n h
ì
nh
48
• M
ộ
t s
ố
import c
ầ
n thi
ế
t
49
• H
à
m Master() đ
ể
t
ạ
o gi
á
tr
ị
ng
ẫ
u nhi
ê
n v
à
g
ử
i
• H
à
m Slave() đ
ể
nh
ậ
n r
ồ
i xu
ấ
t ra m
à
n h
ì
nh
50
• Chương tr
ì
nh s
ử
d
ụ
ng đ
ố
i tư
ợ
ng k
ế
t n
ố
i đư
ợ
c
sinh ra b
ở
i Pipe
M
ộ
t v
à
i v
í
d
ụ
• V
í
d
ụ
c
ầ
n t
í
nh t
ổ
ng c
ủ
a N s
ố
th ự
c c
ó
gi
á
tr
ị
đư
ợ
c t
ạ
o
ng
ẫ
u nhi
ê
n trong kho
ả
ng [0,1).
import numpy as np
N = 10000000
a = np.random.random(N)
51
• H
à
m t
í
nh t
ổ
ng c
ó
th
ể
vi
ế
t
def psum( ib, ie ):
s = 0.0
for i in range(ib,ie+1):
s += a[i]
return s
52
• Đ
ể
t
í
nh t
ổ
ng tu
ầ
n t
ự
c
ủ
a N s
ố
n
à
y:
t0 = time.time()
psum(0,N-1)
print( "Tuần tự: Thời gian tr
ô
i qua %8.6f gi
â
y" %
(time.time()-t0) )
53
• Trong trư
ờ
ng h
ợ
p c
ầ
n d
ù
ng đ
ố
i tư
ợ
ng Pool c
ó
trong
g
ó
i Multiprocessing, ch
ú
ng ta s
ử
d
ụ
ng h
à
m psum()
nhi
ề
u l
ầ
n, m
ỗ
i l
ầ
n l
à
m
ộ
t ti
ế
n tr
ì
nh t
í
nh t
ổ
ng m
ộ
t
đo
ạ
n nh
ỏ
. Khi đ
ó
c
ầ
n ph
ả
i s
ử
d
ụ
ng h
à
m map() đ
ể
t
ạ
o m
ộ
t d
ã
y l
ặ
p l
ạ
i.
54
• Nhưng do h
à
m psum() c
ó
2 đ
ố
i s
ố
(c
ó
2 tham s
ố
khi
g
ọ
i h
à
m), n
ê
n ph
ả
i vi
ế
t th
ê
m m ộ
t h
à
m đ
ể
chuy
ể
n
vi
ệ
c g
ọ
i h
à
m nhi
ề
u tham s
ố
v
ề
1 tham s
ố
như sau:
def multirun(args):
return psum(*args)
55
• Gi
ả
s
ử
d
ù
ng 4 ti
ế
n tr
ì
nh cho vi
ệ
c t
í
nh to
á
n song song
n
à
y, chương tr
ì
nh vi
ế
t như sau:
from multiprocessing import Pool
t0 = time.time()
l1 = [0, int(N/4), int(N/2), int(3*N/4)]
l2 = [int(N/4)-1, int(N/2)-1, int(3*N/4)-1, N-1]
l3 = zip(l1,l2)
56
p = Pool(4)
result = p.map( multirun, l3 )
print( "Sử dụng Pool: Thời gian tr
ô
i qua %8.6f gi
â
y"
% (time.time()-t0) )
print( "Tổng l
à
%10.6f" % sum(result) )
57
• Lưu
ý
r
ằ
ng,
– Do h
à
m multirun() ch
ỉ
c
ó
1 đ
ố
i s
ố
, n
ê
n ph
ả
i d
ù
ng
h
à
m zip() đ
ể
chuy
ể
n 2 danh s
á
ch v
ề
1 danh s
á
ch.
– Đ
ể
bi
ế
t k
ế
t qu
ả
sau c
ù
ng, c
ó
th
ể
d
ù
ng h
à
m sum()
c
ủ
a g
ó
i Python chu
ẩ
n đ
ể
t
í
nh to
á
n.
• Ch
ú
ng ta c
ó
th
ể
s
ử
d
ụ
ng đ
ố
i tư
ợ
ng Process ho
ặ
c
Thread đ
ể
th
ự
c hi
ệ
n c
ô
ng vi
ệ
c n
à
y. C
á
ch th
ứ
c c
ũ
ng
ho
à
n to
à
n như nhau:
58
import threading as th
t0 = time.time()
t1 = th.Thread(target = psum, args = [0,int(N/4)-1])
t2 = th.Thread(target = psum, args = [int(N/4),int(N/2)-1])
t3 = th.Thread(target = psum, args = [int(N/2),int(3*N/4)-1])
t4 = th.Thread(target = psum, args = [int(3*N/4),N-1])
59
t1.start()
t2.start()
t3.start()
t4.start()
t1.join()
t2.join()
t3.join()
t4.join()
print( "Sử dụng Thread: Thời gian tr
ô
i qua %8.6f gi
â
y"
% (time.time()-t0) )
60
• Tuy nhi
ê
n, đ
ể
t
í
nh đư
ợ
c t
ổ
ng c
ủ
a t
ấ
t c
ả
c
á
c ph
ầ
n t
ừ
,
h
à
m psum() đư
ợ
c hi
ệ
u ch
ỉ
nh như sau:
result = []
def psum( ib, ie ):
s = 0.0
for i in range(ib,ie+1):
s += a[i]
result.append( s )
return s
61
• C
á
ch th
ứ
c gi
ả
i quy
ế
t d
ù
ng Process c
ũ
ng tương t
ự
Thread. Tuy nhi
ê
n, do c
á
c process kh
ô
ng chia s
ẻ
kh
ô
ng gian b
ộ
nh
ớ
, n
ê
n đ
ể
c
ó
k
ế
t qu
ả
l
à
t
ổ
ng c
ủ
a
to
à
n b
ộ
c
á
c ph
ầ
n t
ử
c
ầ
n t
í
nh, ph
ả
i s
ử
d
ụ
ng th
ê
m đ
ố
i
tư
ợ
ng Queue đ
ể
lưu tr
ữ
.
from multiprocessing import Queue
Q = Queue()
def psump( ib, ie ):
s = 0.0
for i in range(ib,ie+1):
s += a[i]
Q.put(s)
return s
62
• Khi đ
ó
, vi
ệ
c t
í
nh t
ổ
ng đư
ợ
c x
ử
l
ý
sau khi c
á
c ti
ế
n
tr
ì
nh t
í
nh to
á
n như sau:
t0 = time.time()
p1 = mp.Process(target = psump, args = [0,int(N/4)-1])
p2 = mp.Process(target = psump, args = [int(N/4),int(N/2)-1])
p3 = mp.Process(target = psump, args = [int(N/2),int(3*N/4)-1])
p4 = mp.Process(target = psump, args = [int(3*N/4),N-1])
p1.start()
p2.start()
p3.start()
p4.start()
63
p1.join()
p2.join()
p3.join()
p4.join()
result = []
while not Q.empty():
result.append( Q.get() )
print( "Sử dụng Process: Thời gian tr
ô
i qua %8.6f gi
â
y"
% (time.time()-t0) )
print( "Tổng l
à
%10.6f" % sum(result) )
64
• K
ế
t qu
ả
c
ả
3 trư
ờ
ng h
ợ
p v
à
t
í
nh to
á
n tu
ầ
n t
ự
v
ớ
i N
l
à
10 tri
ệ
u như sau:
65
• V
í
d
ụ
t
í
nh s
ố
đơn gi
ả
n nh
ấ
t l
à
d
ù
ng h
à
m Arctan(x).
• Ta bi
ế
t
• Suy ra
𝜋
tan
(
𝜋
4 )
= 1
arctan(1) =
𝜋
4
66
• M
à
khai tri
ể
n Taylor c
ủ
a h
à
m arctan() l
à
𝑎
𝑟
𝑐
𝑡
𝑎
𝑛
(
𝑥
) =
𝑥
−
𝑥
3
3
+
𝑥
5
5
−
𝑥
7
7
+ … + (−1)
𝑛
−1
𝑥
2
𝑛
−1
2
𝑛
− 1
+
𝑂
(
𝑥
2
𝑛
−1
)
67
• T
ừ
đ
â
y suy ra
𝜋
4
≈ 1 −
1
3
+
1
5
−
1
7
+ … + (−1)
𝑛
−1 1
2
𝑛
− 1
=
𝑛
∑
𝑖
=1
(−1)
𝑖
−1 1
2
𝑖
− 1
68
• Đ
ể
s
ử
d
ụ
ng l
ạ
i h
à
m psum()
ở
tr
ê
n, c
ó
th
ể
vi
ế
t đơn
gi
ả
n b
ằ
ng c
á
ch t
ạ
o m
ả
ng a, thay v
ì
ng
ẫ
u nhi
ê
n trong
[0,1) th
ì
a là
c
á
c s
ố
h
ạ
ng trong t
ổ
ng
ở
tr
ê
n.
a = []
sign = 1
for i in range(N):
a.append(sign/(2*(i+1)-1))
sign = -sign
69
• V
í
d
ụ
, d
ù
ng đ
ố
i tư
ợ
ng Pool đ
ể
t
í
nh, to
à
n b
ộ
chương tr
ì
nh c
ó
th
ể
vi
ế
t như sau:
import time
from multiprocessing import Pool
def multirun(args):
return psum(*args)
def psum( ib, ie ):
s = 0.0
for i in range(ib,ie+1):
s += a[i]
return s
70
N = 10000000
a = []
sign = 1
for i in range(N):
a.append(sign/(2*(i+1)-1))
sign = -sign
l1 = [0, int(N/4), int(N/2), int(3*N/4)]
l2 = [int(N/4)-1, int(N/2)-1, int(3*N/4)-1, N-1]
l3 = zip(l1,l2)
p = Pool(4)
result = p.map( multirun, l3 )
print( "Số Pi l
à
%54.52f" % (4*sum(result)) )
71
• V
í
d
ụ
d
ữ
li
ệ
u ph
â
n t
á
n
• Trong c
á
c v
í
d
ụ
tr
ê
n, ch
ú
ng ta th
ự
c hi
ệ
n c
á
c thao t
á
c
đ
ể
r
ồ
i c
ù
ng chia s
ẻ
m
ộ
t v
ù
ng b
ộ
nh
ớ
chung. Ch
ẳ
ng
h
ạ
n v
ớ
i Pool ho
ặ
c v
ớ
i Thread, d
ữ
li
ệ
u đư
ợ
c t
í
nh to
á
n
sau đ
ó
t
ậ
p trung v
à
o list c
ó
t
ê
n l
à
result. V
ớ
i Process,
k
ế
t qu
ả
c
ủ
a c
á
c process đư
ợ
c đưa v
à
o h
à
ng đ
ợ
i Q,
sau đ
ó
t
ừ
h
à
ng đ
ợ
i đưa v
à
o result n
à
y đ
ể
t
í
nh t
ổ
ng
tr
ê
n list.
72
• Gi
ả
s
ử
chương tr
ì
nh t
í
nh to
á
n l
à
m nh
ữ
ng c
ô
ng vi
ệ
c
kh
á
c nhau tr
ê
n c
ù
ng m
ộ
t d
ữ
li
ệ
u, nhưng do m
ỗ
i
process lưu tr
ữ
trong v
ù
ng b
ộ
nh
ớ
ri
ê
ng như m
ộ
t h
ệ
th
ố
ng ph
â
n t á
n (Distributed System).
• Ch
ẳ
ng h
ạ
n, process đ
ó
ng vai tr
ò
master ch
ị
u tr
á
ch
nhi
ệ
m t
ạ
o m
ộ
t ma tr
ậ
n l
à
c
á
c gi
á
tr
ị
th
ự
c ng
ẫ
u nhi
ê
n
thu
ộ
c đo
ạ
n [0,1), sau đ
ó
g
ử
i v
ề
cho process đ
ó
ng vai
tr
ò
slave. Process n
à
y ch
ị
u tr
á
ch nhi
ệ
m nh
â
n ma tr
ậ
n
n
à
y v
ớ
i ma tr
ậ
n ngh
ị
ch đ
ả
o r
ồ
i g
ử
i chu
ẩ
n-2 c
ủ
a ma
tr
ậ
n t
í
ch n
à
y v
ề
cho master đ
ể
xu
ấ
t ra m
à
n h
ì
nh.
73
• Chương tr
ì
nh đư
ợ
c vi
ế
t như sau:
import numpy as np
import multiprocessing as mp
N = 10
M = 10
def master( conn ):
ma_a = np.random.random((N,M))
conn.send(ma_a)
norm = conn.recv()
print( "Norm is %20.18f" % norm )
conn.close()
74
def slave( conn ):
sl_b = conn.recv()
norm2 = np.linalg.norm(np.dot(sl_b,np.linalg.inv(sl_b)),2)
conn.send( norm2 )
conn.close()
ma_conn, sl_conn = mp.Pipe()
ma_p = mp.Process( target = master, args = (sl_conn,) )
sl_p = mp.Process( target = slave, args = (ma_conn,) )
ma_p.start()
sl_p.start()
ma_p.join()
sl_p.join()
75
S
ử
d
ụ
ng trong Khoa h
ọ
c d
ữ
li
ệ
u
• C
ó
hai
á
p d
ụ
ng đa x
ử
l
ý
trong Khoa h
ọ
c d
ữ
li
ệ
u:
• X
ử
l
ý
nh
ậ
p xu
ấ
t: Th
ô
ng thư
ờ
ng vi
ệ
c ghi d
ữ
li
ệ
u l
ê
n Data
Warehouses n
à
o đ
ó
thư
ờ
ng m
ấ
t nhi
ề
u th
ờ
i gian hơn l
à
vi
ệ
c đ
ọ
c d
ữ
li
ệ
u đ
ể
đưa v
à
o x
ử
l
ý
. N
ê
n vi
ệ
c ghi đư
ợ
c
th
ự
c hi
ệ
n song song s
ẽ
hi
ệ
u qu
ả
.
• X
â
y d
ự
ng m
ô
h
ì
nh hu
ấ
n luy
ệ
n: kh
ô
ng ph
ả
i t
ấ
t c
ả
c
á
c m
ô
h
ì
nh đư
ợ
c hu
ấ
n luy
ệ
n theo c
á
ch song song, nhưng m
ộ
t
s
ố
m
ô
h
ì
nh c
ó
th
ể
th
ự
c hi
ệ
n theo c
á
ch n
à
y. Ch
ẳ
ng h
ạ
n
Random Forest đư
ợ
c tri
ể
n khai tr
ê
n nhi
ề
u c
â
y quy
ế
t
đ
ị
nh (Decision Tree) đ
ể
l
ấ
y m
ộ
t quy
ế
t đ
ị
nh t
í
ch lu
ỹ
76
• C
ũ
ng lưu
ý
, trong
thư vi
ệ
n sklearn
c
ó
cung c
ấ
p tham
s
ố
n_jobs gi
ú
p
cho vi
ệ
c s
ử
d
ụ
ng
nhi
ề
u task.
• V
í
d
ụ
minh ho ạ
: gi
ả
s
ử
c
ó
c
ô
ng vi
ệ
c dowork()
c
ầ
n gi
ả
i quy
ế
t trong 2
l
ầ
n.
77
• S
ử
d
ụ
ng Multi-Processing
78
79

More Related Content

PDF
Python Beginner Class day-14-thread
PPTX
Process and thread
PPT
Bai04 quan ly tien trinh
PPT
Bai05 dong bo hoa
PDF
Baitap dongbo.bdf
PPTX
Threads - Lập trình hệ thống IT4786
PPTX
TL5.4.1 - #Week10-Chapter5-3.pptx - Hệ ddieuf hành
PPT
3.chap3 sched
Python Beginner Class day-14-thread
Process and thread
Bai04 quan ly tien trinh
Bai05 dong bo hoa
Baitap dongbo.bdf
Threads - Lập trình hệ thống IT4786
TL5.4.1 - #Week10-Chapter5-3.pptx - Hệ ddieuf hành
3.chap3 sched

Similar to Intro Parallel Computing for student11.pdf (20)

PPT
4.chap4 synch
PDF
Bài 10 - Threading - Nền tảng lập trình ứng dụng với C#
PDF
Bài Giảng Quản Lý Tiến Trình Trong Hệ Điều Hành
PDF
Tìm hiểu về process
PDF
Bai tap ly thuyet He dieu hanhBai tap ly thuyet He dieu hanh.pdf
DOCX
Tổng hợp nè
PDF
Chuong 8 -_multi-thread
PPT
Os 2 - process
PPT
Os 3 - synchronization
PDF
12. Linux Quan Ly Tien Trinh
PDF
PDF
Rtos 4 queue vs interrupt
PPT
Ch01
PPT
2.chap2 process
PPTX
#Week03-Chapter3 2023deDE THI CSDL CAP CAO TOÀN QUÓC
PDF
[Duong tran] shared_variable
PDF
#Week03-Chapter3 2023.pdf
PPTX
Chapter1 - Data link Layer (1) - HCMUT - 2023
PPTX
Chuong4_ConcurrencyChuong4_Concurrency.pptx
PDF
De tai he dieu hanh nam 2010 2011
4.chap4 synch
Bài 10 - Threading - Nền tảng lập trình ứng dụng với C#
Bài Giảng Quản Lý Tiến Trình Trong Hệ Điều Hành
Tìm hiểu về process
Bai tap ly thuyet He dieu hanhBai tap ly thuyet He dieu hanh.pdf
Tổng hợp nè
Chuong 8 -_multi-thread
Os 2 - process
Os 3 - synchronization
12. Linux Quan Ly Tien Trinh
Rtos 4 queue vs interrupt
Ch01
2.chap2 process
#Week03-Chapter3 2023deDE THI CSDL CAP CAO TOÀN QUÓC
[Duong tran] shared_variable
#Week03-Chapter3 2023.pdf
Chapter1 - Data link Layer (1) - HCMUT - 2023
Chuong4_ConcurrencyChuong4_Concurrency.pptx
De tai he dieu hanh nam 2010 2011
Ad

Recently uploaded (20)

DOCX
Cao Thuy Linh-San pham cuoi khoa.- bồi dưỡng thường xuyêndocx
PPTX
Direct Marketing- chieu thi truyen thong
PDF
SÁNG KIẾN “NGHIÊN CỨU VÀ ĐỀ XUẤT GIẢI PHÁP TỰ RÈN LUYỆN KỸ NĂNG MỀM CHO HỌC S...
PPTX
Triet hoc con nguoi va triet hoc thac si
PPTX
VNR202 LỊCH SỬ ĐẢNG, MÔN HỌC CẦN THIẾT C
PDF
CHUYÊN ĐỀ DẠY THÊM HÓA HỌC LỚP 12 CẢ NĂM THEO FORM THI MỚI BGD - CÓ ÔN TẬP + ...
PPTX
Chương3,Buổi7,8,9,10(Buổi10 kiểmtraL2).pptx
DOCX
Chủ nghĩa xã hội khoa học - Đề Cương Cuối Kỳ.docx
PDF
TUYỂN TẬP ĐỀ KIỂM TRA HÓA HỌC HỮU CƠ THI THỬ OLYMPIC HÓA HỌC QUỐC TẾ (VÒNG 2)...
PDF
CHUYÊN ĐỀ DẠY THÊM HÓA HỌC LỚP 11 CẢ NĂM THEO FORM THI MỚI BGD - CÓ ÔN TẬP + ...
PDF
bai thao luan triet hoc mac lennin hayyy
PDF
bai giang an toan thong tin ke toan nam 2020
PDF
BÀI HỌC ÔN TẬP CHO THI NỘI DUNG MÔN HOẠCH ĐỊNH
PDF
CHUYÊN ĐỀ DẠY THÊM HÓA HỌC LỚP 11 CẢ NĂM THEO FORM THI MỚI BGD - CÓ ÔN TẬP + ...
PPTX
CHƯƠNG I excel,,,,,,,,,,,,,,,,,,,,,,,,,,
PDF
CHUYÊN ĐỀ DẠY THÊM HÓA HỌC LỚP 10 CẢ NĂM THEO FORM THI MỚI BGD - CÓ ÔN TẬP + ...
PDF
BÀI TẬP TEST FOR UNIT TIẾNG ANH LỚP 8 GLOBAL SUCCESS CẢ NĂM THEO TỪNG ĐƠN VỊ ...
PPT
SINH 8 TUYẾN YÊN TUYẾN GIÁP CÂU TẠO VÀ CHỨC NĂNG
PPTX
Bai 28 Cau tao chat Thuyet dong hoc phan tu chat khi.pptx
PPTX
24. 9cqbq2reu57m5igbsz-signature-40d40b8bd600bcde0d0584523c684ec4933c280de74a...
Cao Thuy Linh-San pham cuoi khoa.- bồi dưỡng thường xuyêndocx
Direct Marketing- chieu thi truyen thong
SÁNG KIẾN “NGHIÊN CỨU VÀ ĐỀ XUẤT GIẢI PHÁP TỰ RÈN LUYỆN KỸ NĂNG MỀM CHO HỌC S...
Triet hoc con nguoi va triet hoc thac si
VNR202 LỊCH SỬ ĐẢNG, MÔN HỌC CẦN THIẾT C
CHUYÊN ĐỀ DẠY THÊM HÓA HỌC LỚP 12 CẢ NĂM THEO FORM THI MỚI BGD - CÓ ÔN TẬP + ...
Chương3,Buổi7,8,9,10(Buổi10 kiểmtraL2).pptx
Chủ nghĩa xã hội khoa học - Đề Cương Cuối Kỳ.docx
TUYỂN TẬP ĐỀ KIỂM TRA HÓA HỌC HỮU CƠ THI THỬ OLYMPIC HÓA HỌC QUỐC TẾ (VÒNG 2)...
CHUYÊN ĐỀ DẠY THÊM HÓA HỌC LỚP 11 CẢ NĂM THEO FORM THI MỚI BGD - CÓ ÔN TẬP + ...
bai thao luan triet hoc mac lennin hayyy
bai giang an toan thong tin ke toan nam 2020
BÀI HỌC ÔN TẬP CHO THI NỘI DUNG MÔN HOẠCH ĐỊNH
CHUYÊN ĐỀ DẠY THÊM HÓA HỌC LỚP 11 CẢ NĂM THEO FORM THI MỚI BGD - CÓ ÔN TẬP + ...
CHƯƠNG I excel,,,,,,,,,,,,,,,,,,,,,,,,,,
CHUYÊN ĐỀ DẠY THÊM HÓA HỌC LỚP 10 CẢ NĂM THEO FORM THI MỚI BGD - CÓ ÔN TẬP + ...
BÀI TẬP TEST FOR UNIT TIẾNG ANH LỚP 8 GLOBAL SUCCESS CẢ NĂM THEO TỪNG ĐƠN VỊ ...
SINH 8 TUYẾN YÊN TUYẾN GIÁP CÂU TẠO VÀ CHỨC NĂNG
Bai 28 Cau tao chat Thuyet dong hoc phan tu chat khi.pptx
24. 9cqbq2reu57m5igbsz-signature-40d40b8bd600bcde0d0584523c684ec4933c280de74a...
Ad

Intro Parallel Computing for student11.pdf

  • 1. Tài liệu: Introduction to Parallel Computing Blaise Barney, Lawrence Livermore National Laboratory https://computing.llnl.gov/tutorials/parallel_comp/ Tính toán song song và phân tán PGS.TS. Trần Văn Lăng langtv@vast. vn 1 L ậ p tr ì nh song song v ớ i Python 2 1. T ổ ng quan 2. S ự kh á c bi ệ t gi ữ a Thread v à Process 3. Song song d ữ li ệ u 4. S ử dung Thread 5. S ử d ụ ng Process 6. Đa x ử l ý trong Khoa h ọ c d ữ li ệ u T ổ ng quan • L ậ p tr ì nh song song v ớ i Python c ó th ể ti ế p c ậ n theo c á c c á ch như: – D ù ng thư vi ệ n c ủ a c ủ a Python • Threading, multiprocessing – D ù ng ScientificPython • Scientific.BSP • Scientific.DistributiedComputing – IPython • Interactive shell for working with clusters – Kh á c • pyMPI, mpi4py, pypar 3 • Đ ể ki ể m tra c ấ u h ì nh c ủ a m á y, s ử d ụ ng g ó i platform (sysinfor.py) 4
  • 2. • Đ ể bi ế t s ố core c ủ a m á y, s ử dung g ó i multiprocessing 5 • M ộ t s ố k ế t qu ả th ử nghi ệ m 6 • Đ ể bi ế t t ê n v à đ ị a ch ỉ IP c ủ a m á y (hostname.py) 7 • Để đo thời gian thực thi, d ù ng h à m time() c ó trong g ó i time (elapsetime.py) 8 C ó th ể coi th ê m t ạ i https://www.tutorialspoint.com/python/python_date_time.htm
  • 3. Thread v à Process • Process (ti ế n tr ì nh) l à m ộ t th ự c th ể (instance) c ủ a chương tr ì nh m á y t í nh. • Ti ế n tr ì nh sinh ra c á c Threads (lu ồ ng) hay c ò n g ọ i l à sub-processes (ti ể u ti ế n tr ì nh) đ ể x ử l ý c á c nhi ệ m v ụ ph ụ . Ch ẳ ng h ạ n, đ ọ c c á c ph í m đư ợ c nh ấ n (keystrokes), hi ể n th ị k ý t ự v ừ a đ ọ c l ê n m à n h ì nh, n ạ p m ộ t trang v ă n b ả n t ừ đ ĩ a v à o b ộ nh ớ sau đ ó hi ể n th ị l ê n m à n h ì nh, ghi t ậ p tin v à o đ ĩ a, ... • Threads t ồ n t ạ i (live) b ê n trong ti ế n tr ì nh v à chia s ẻ c ù ng kh ô ng gian b ộ nh ớ c ủ a Process. 9 • V í d ụ , khi m ở m ộ t ứ ng d ụ ng so ạ n th ả o v ă n b ả n; c ó ngh ĩ a l à ch ú ng ta t ạ o ra m ộ t Process. • Khi b ắ t đ ầ u nh ậ p, Process sinh ra c á c Threads ch ẳ ng h ạ n như: – đ ọ c c á c ph í m b ấ m – hi ể n th ị v ă n b ả n – t ự đ ộ ng lưu t ậ p tin l ạ i – l à m n ổ i b ậ t (highlight) c á c l ỗ i ch í nh t ả khi nh ậ p 10 • B ằ ng c á ch sinh ra nhi ề u Thread, Chương tr ì nh so ạ n th ả o v ă n b ả n t ậ n d ụ ng th ờ i gian nh à n r ỗ i c ủ a CPU (ch ờ đ ợ i c á c ph í m b ấ m ho ặ c t ả i t ậ p tin v ề ) qua đ ó l à m cho c ô ng vi ệ c c ó n ă ng su ấ t hơn. 11 • Như v ậ y v ề vi ệ c s ử dung b ộ nh ớ : Threads v à Processes l à kh á c nhau: – Threads d ù ng shared-memory, trong khi đ ó Processes th ì c ó th ể kh ô ng. – S ự đ ồ ng b ộ h ó a v ề d ữ li ệ u l à c ầ n thi ế t đ ố i v ớ i c á c Threads, nhưng v ớ i Processes l à c ó th ể kh ô ng c ầ n 12
  • 4. Process • M ộ t Process c ó th ể c ó nhi ề u Thread • Process đư ợ c t ạ o ra b ở i h ệ đi ề u h à nh đ ể th ự c thi chương tr ì nh • Hai Process c ó th ể thi h à nh đ ồ ng th ờ i m ộ t đo ạ n code trong chương tr ì nh Python • Khi m ở v à đ ó ng Process t ố n nhi ề u th ờ i gian hơn so v ớ i m ở đ ó ng Thread • Trong trư ờ ng h ợ p kh ô ng chia s ẻ kh ô ng gian b ộ nh ớ , th ì vi ệ c chia s ẻ th ô ng tin gi ữ a c á c Process ch ậ m hơn gi ữ a c á c Thread 13 Threads • Thread như l à nh ữ ng ti ế n tr ì nh nh ỏ (mini- processes) t ồ n t ạ i b ê n trong Process • Thread chia s ẻ kh ô ng gian b ộ nh ớ n ê n c á c bi ế n đư ợ c dung chung trong vi ệ c đ ọ c ghi • Hai Threads kh ô ng th ể th ự c thi đ ồ ng th ờ i c ù ng m ộ t đo ạ n code trong chương tr ì nh Python 14 V í d ụ v ề s ự kh á c nhau • H à m (myFunc) xu ấ t ID c ủ a thread đang ho ạ t đ ộ ng. • Khi g ọ i h à m n à y nhi ề u l ầ n, ID n à y đư ợ c lưu tr ữ l ạ i trong m ộ t m ả ng to à n c ụ c A. 15 • K í ch ho ạ t 10 l ầ n đ ể cho Thead g ọ i h à m myFunc() đ ã t ạ o ở tr ê n. • Vi ệ c k ế t th ú c m ộ t thread đ ể chuy ể n sang thread kh á c l à kh ô ng đ ặ t ra ngay khi m ộ t thread đư ợ c start; ch í nh v ì v ậ y c á c thread c ầ n đư ợ c lưu tr ữ v à o trong m ả ng th đ ể s ử d ụ ng v ề sau. 16
  • 5. • Sau đ ó m ớ i l ầ n lư ợ t đ ợ i cho c á c thread n à y ho à n th à nh c ô ng vi ệ c b ằ ng h à m join(). • Sau khi xong, k ế t qu ả c ó trong bi ế n to à n c ụ c A đư ợ c xu ấ t ra 17 K ế t qu ả th ự c thi chương tr ì nh v ớ i Thread 18 Nh ậ n x é t • Do th ờ i gian sleep kh á c nhau, n ê n c á c thread k ế t th ú c kh ô ng gi ố ng nhau, d ẫ n đ ế n th ứ t ự c ô ng vi ệ c kh ô ng theo th ứ t ự c ủ a c â u l ệ nh l ặ p for • Thread theo cơ ch ế s ử d ụ ng b ộ nh ớ chia s ẻ , n ê n bi ế n A c ó hi ệ u l ự c trong thread (ID...64) ch í nh v à c á c thread kh á c (ID...52, ID...88, ..., ID...60). V ì v ậ y m ả ng A ban đ ầ u r ỗ ng, sau khi th ự c hi ệ n m ả ng A g ồ m 10 ph ầ n t ử l à c á c Thread ID. 19 • Như v ậ y, bi ế n to à n c ụ c A đư ợ c s ử d ụ ng chung gi ữ a c á c thread v ớ i nhau (shared-memory) • V ớ i chương tr ì nh như tr ê n; nhưng thay v ì d ù ng Thread, d ù ng Process th ì bi ế n to à n c ụ c A n à y kh ô ng t á c đ ộ ng gi ữ a c á c process • C ầ n import 20
  • 6. • H à m đ ể c á c process th ự c hi ệ n 21 • Th ự c thi t ấ t c ả c á c process 22 K ế t qu ả th ự c thi chương tr ì nh v ớ i Process 23 Lưu ý • D ù ng Process nhưng đ ể c ó k ế t qu ả như Thread, c ầ n ph ả i lưu gi á tr ị v à o trong m ộ t h à ng đ ợ i b ằ ng c á ch khai b á o bi ế n Q = Queue(). • Sau đ ó đ ẩ y k ế t qu ả c ầ n lưu v à o trong h à ng đ ợ i n à y. Ch ẳ ng h ạ n, Q.put( os.getpid() ). • Cu ố i c ù ng, đ ể xu ấ t ra v à đưa v à o m ả ng A qua l ệ nh A.append( Q.get() ) 24
  • 7. • Chương tr ì nh vi ế t l ạ i như sau 25 26 K ế t qu ả 27 Song song d ữ li ệ u • multiprocessing l à m ộ t g ó i c á c API h ỗ tr ợ đ ể ph á t sinh c á c Process; qua đ ó gi ú p t ậ n d ụ ng đư ợ c nhi ề u b ộ x ử l ý đ ể vi ế t chương tr ì nh. • Gi ả s ử c ó m ộ t c ô ng vi ệ c (vi ế t dư ớ i d ạ ng m ộ t h à m) đư ợ c th ự c hi ệ n tr ê n nhi ề u d ữ li ệ u kh á c nhau (Data Parallelism). 28
  • 8. • V í d ụ : C ầ n t í nh c ă n b ậ c 2 c ủ a 3 s ố . • C á c c â u l ệ nh tu ầ n t ự c ó th ể vi ế t như sau: 29 • Ho ặ c như sau v ớ i h à m map() 30 • Khi c ầ n giao cho nhi ề u Process t í nh, ch ẳ ng h ạ n v ớ i 3 Process: 31 • Trong đ ó , đ ố i tư ợ ng Pool cung c ấ p m ộ t phương ti ệ n đ ể song song h ó a vi ệ c th ự c hi ệ n m ộ t h à m qua nhi ề u gi á tr ị đ ầ u v à o, v à ph â n ph ố i d ữ li ệ u đ ầ u v à o cho c á c Process. 32
  • 9. • V ớ i h à m nhi ề u đ ố i s ố . • V í d ụ : Gi ả i 3 phương tr ì nh b ậ c I d ạ ng ax+b=0 33 • Lưu ý : khi d ù ng v ớ i đ ố i tư ợ ng thu ộ c l ớ p Pool, h à m map() n à y kh ô ng chuy ể n đ ổ i nhi ề u đ ố i s ố đư ợ c. • Đ ể thu ậ n l ợ i, c ó th ể d ù ng m ộ t l ớ p Container, ch ẳ ng h ạ n d ù ng g ó i collections đ ể gom c á c đ ố i s ố c ủ a h à m th à nh m ộ t nh ó m. • Ch ẳ ng h ạ n, h à m f(a,b) c ó 2 đ ố i s ố đ ể gi ả i phương tr ì nh b ậ c nh ấ t như tr ê n, c ó th ể vi ế t l ạ i th à nh m ộ t đ ố i s ố f(item) 34 35 • Trong đ ó , item c ó 2 th à nh ph ầ n l à a v à b • Khi s ử d ụ ng, ph ả i t ạ o ra ki ể u đ ố i s ố n à y: 36
  • 10. • Khi s ử d ụ ng 37 • C ó th ể so s á nh th ờ i gian th ự c hi ệ n c ủ a chương tr ì nh song song so v ớ i tu ầ n t ự qua v í d ụ gi ả i phương tr ì nh. 38 S ử d ụ ng Thread • D ù ng l ớ p Thread trong g ó i threading. • Ch ẳ ng h ạ n, c ầ n k í ch ho ạ t m ộ t Thread đ ể th ự c hi ệ n c ô ng vi ệ c qua h à m c ó s ẵ n (gi ả i phương tr ì nh eqI) 39 S ử d ụ ng Process • Tương t ự như Thread, c ó th ể d ù ng l ớ p Process trong g ó i multiprocessing đ ể th ự c thi h à m eqI() • V ớ i k ế t qu ả 40
  • 11. Threads v à Processes • Gi ả s ử c ó m ộ t chương tr ì nh ch ỉ ch ờ cho h ế t th ờ i gian (đ ặ t t ê n l à sleeping()), kh ô ng th ự c hi ệ n b ấ t k ỳ t í nh to á n n à o như sau: 41 • N ế u run chương tr ì nh n à y tr ê n t ấ t c ả c á c Thread c ủ a m á y qua v í d ụ : 42 • Th ì th ờ i gian th ự c thi l à th ờ i gian c ủ a Thread l â u nh ấ t: 43 4 lần gọi Các Threads của Process 6269 • N ế u run chương tr ì nh n à y tr ê n t ấ t c ả c á c Process, m ỗ i Process s ử dung Thread ch í nh: 44
  • 12. • Trong trư ờ ng h ợ p n à y, th ờ i gian th ự c thi tr ê n c á c Process c ũ ng l à th ờ i gian l â u nh ấ t c ủ a m ộ t Process n à o đ ó trong c á c Process đư ợ c k í ch ho ạ t 45 • Nhưng khi c ó m ộ t chương tr ì nh c ó t í nh to á n (đ ặ t t ê n l à calculating()) 46 • Th ờ i gian th ự c thi c ủ a Process v à Thread l à kh á c bi ệ t: 47 Truy ề n v à nh ậ n d ữ li ệ u • Chương tr ì nh Python t ạ o 2 Process, Master v à Slave. • Process Master g ử i m ộ t m ả ng 10 gi á tr ị ng ẫ u nhi ê n đ ế n Process Slave • Process Slave nh ậ n v à xu ấ t ra m à n h ì nh 48
  • 13. • M ộ t s ố import c ầ n thi ế t 49 • H à m Master() đ ể t ạ o gi á tr ị ng ẫ u nhi ê n v à g ử i • H à m Slave() đ ể nh ậ n r ồ i xu ấ t ra m à n h ì nh 50 • Chương tr ì nh s ử d ụ ng đ ố i tư ợ ng k ế t n ố i đư ợ c sinh ra b ở i Pipe M ộ t v à i v í d ụ • V í d ụ c ầ n t í nh t ổ ng c ủ a N s ố th ự c c ó gi á tr ị đư ợ c t ạ o ng ẫ u nhi ê n trong kho ả ng [0,1). import numpy as np N = 10000000 a = np.random.random(N) 51 • H à m t í nh t ổ ng c ó th ể vi ế t def psum( ib, ie ): s = 0.0 for i in range(ib,ie+1): s += a[i] return s 52
  • 14. • Đ ể t í nh t ổ ng tu ầ n t ự c ủ a N s ố n à y: t0 = time.time() psum(0,N-1) print( "Tuần tự: Thời gian tr ô i qua %8.6f gi â y" % (time.time()-t0) ) 53 • Trong trư ờ ng h ợ p c ầ n d ù ng đ ố i tư ợ ng Pool c ó trong g ó i Multiprocessing, ch ú ng ta s ử d ụ ng h à m psum() nhi ề u l ầ n, m ỗ i l ầ n l à m ộ t ti ế n tr ì nh t í nh t ổ ng m ộ t đo ạ n nh ỏ . Khi đ ó c ầ n ph ả i s ử d ụ ng h à m map() đ ể t ạ o m ộ t d ã y l ặ p l ạ i. 54 • Nhưng do h à m psum() c ó 2 đ ố i s ố (c ó 2 tham s ố khi g ọ i h à m), n ê n ph ả i vi ế t th ê m m ộ t h à m đ ể chuy ể n vi ệ c g ọ i h à m nhi ề u tham s ố v ề 1 tham s ố như sau: def multirun(args): return psum(*args) 55 • Gi ả s ử d ù ng 4 ti ế n tr ì nh cho vi ệ c t í nh to á n song song n à y, chương tr ì nh vi ế t như sau: from multiprocessing import Pool t0 = time.time() l1 = [0, int(N/4), int(N/2), int(3*N/4)] l2 = [int(N/4)-1, int(N/2)-1, int(3*N/4)-1, N-1] l3 = zip(l1,l2) 56
  • 15. p = Pool(4) result = p.map( multirun, l3 ) print( "Sử dụng Pool: Thời gian tr ô i qua %8.6f gi â y" % (time.time()-t0) ) print( "Tổng l à %10.6f" % sum(result) ) 57 • Lưu ý r ằ ng, – Do h à m multirun() ch ỉ c ó 1 đ ố i s ố , n ê n ph ả i d ù ng h à m zip() đ ể chuy ể n 2 danh s á ch v ề 1 danh s á ch. – Đ ể bi ế t k ế t qu ả sau c ù ng, c ó th ể d ù ng h à m sum() c ủ a g ó i Python chu ẩ n đ ể t í nh to á n. • Ch ú ng ta c ó th ể s ử d ụ ng đ ố i tư ợ ng Process ho ặ c Thread đ ể th ự c hi ệ n c ô ng vi ệ c n à y. C á ch th ứ c c ũ ng ho à n to à n như nhau: 58 import threading as th t0 = time.time() t1 = th.Thread(target = psum, args = [0,int(N/4)-1]) t2 = th.Thread(target = psum, args = [int(N/4),int(N/2)-1]) t3 = th.Thread(target = psum, args = [int(N/2),int(3*N/4)-1]) t4 = th.Thread(target = psum, args = [int(3*N/4),N-1]) 59 t1.start() t2.start() t3.start() t4.start() t1.join() t2.join() t3.join() t4.join() print( "Sử dụng Thread: Thời gian tr ô i qua %8.6f gi â y" % (time.time()-t0) ) 60
  • 16. • Tuy nhi ê n, đ ể t í nh đư ợ c t ổ ng c ủ a t ấ t c ả c á c ph ầ n t ừ , h à m psum() đư ợ c hi ệ u ch ỉ nh như sau: result = [] def psum( ib, ie ): s = 0.0 for i in range(ib,ie+1): s += a[i] result.append( s ) return s 61 • C á ch th ứ c gi ả i quy ế t d ù ng Process c ũ ng tương t ự Thread. Tuy nhi ê n, do c á c process kh ô ng chia s ẻ kh ô ng gian b ộ nh ớ , n ê n đ ể c ó k ế t qu ả l à t ổ ng c ủ a to à n b ộ c á c ph ầ n t ử c ầ n t í nh, ph ả i s ử d ụ ng th ê m đ ố i tư ợ ng Queue đ ể lưu tr ữ . from multiprocessing import Queue Q = Queue() def psump( ib, ie ): s = 0.0 for i in range(ib,ie+1): s += a[i] Q.put(s) return s 62 • Khi đ ó , vi ệ c t í nh t ổ ng đư ợ c x ử l ý sau khi c á c ti ế n tr ì nh t í nh to á n như sau: t0 = time.time() p1 = mp.Process(target = psump, args = [0,int(N/4)-1]) p2 = mp.Process(target = psump, args = [int(N/4),int(N/2)-1]) p3 = mp.Process(target = psump, args = [int(N/2),int(3*N/4)-1]) p4 = mp.Process(target = psump, args = [int(3*N/4),N-1]) p1.start() p2.start() p3.start() p4.start() 63 p1.join() p2.join() p3.join() p4.join() result = [] while not Q.empty(): result.append( Q.get() ) print( "Sử dụng Process: Thời gian tr ô i qua %8.6f gi â y" % (time.time()-t0) ) print( "Tổng l à %10.6f" % sum(result) ) 64
  • 17. • K ế t qu ả c ả 3 trư ờ ng h ợ p v à t í nh to á n tu ầ n t ự v ớ i N l à 10 tri ệ u như sau: 65 • V í d ụ t í nh s ố đơn gi ả n nh ấ t l à d ù ng h à m Arctan(x). • Ta bi ế t • Suy ra 𝜋 tan ( 𝜋 4 ) = 1 arctan(1) = 𝜋 4 66 • M à khai tri ể n Taylor c ủ a h à m arctan() l à 𝑎 𝑟 𝑐 𝑡 𝑎 𝑛 ( 𝑥 ) = 𝑥 − 𝑥 3 3 + 𝑥 5 5 − 𝑥 7 7 + … + (−1) 𝑛 −1 𝑥 2 𝑛 −1 2 𝑛 − 1 + 𝑂 ( 𝑥 2 𝑛 −1 ) 67 • T ừ đ â y suy ra 𝜋 4 ≈ 1 − 1 3 + 1 5 − 1 7 + … + (−1) 𝑛 −1 1 2 𝑛 − 1 = 𝑛 ∑ 𝑖 =1 (−1) 𝑖 −1 1 2 𝑖 − 1 68
  • 18. • Đ ể s ử d ụ ng l ạ i h à m psum() ở tr ê n, c ó th ể vi ế t đơn gi ả n b ằ ng c á ch t ạ o m ả ng a, thay v ì ng ẫ u nhi ê n trong [0,1) th ì a là c á c s ố h ạ ng trong t ổ ng ở tr ê n. a = [] sign = 1 for i in range(N): a.append(sign/(2*(i+1)-1)) sign = -sign 69 • V í d ụ , d ù ng đ ố i tư ợ ng Pool đ ể t í nh, to à n b ộ chương tr ì nh c ó th ể vi ế t như sau: import time from multiprocessing import Pool def multirun(args): return psum(*args) def psum( ib, ie ): s = 0.0 for i in range(ib,ie+1): s += a[i] return s 70 N = 10000000 a = [] sign = 1 for i in range(N): a.append(sign/(2*(i+1)-1)) sign = -sign l1 = [0, int(N/4), int(N/2), int(3*N/4)] l2 = [int(N/4)-1, int(N/2)-1, int(3*N/4)-1, N-1] l3 = zip(l1,l2) p = Pool(4) result = p.map( multirun, l3 ) print( "Số Pi l à %54.52f" % (4*sum(result)) ) 71 • V í d ụ d ữ li ệ u ph â n t á n • Trong c á c v í d ụ tr ê n, ch ú ng ta th ự c hi ệ n c á c thao t á c đ ể r ồ i c ù ng chia s ẻ m ộ t v ù ng b ộ nh ớ chung. Ch ẳ ng h ạ n v ớ i Pool ho ặ c v ớ i Thread, d ữ li ệ u đư ợ c t í nh to á n sau đ ó t ậ p trung v à o list c ó t ê n l à result. V ớ i Process, k ế t qu ả c ủ a c á c process đư ợ c đưa v à o h à ng đ ợ i Q, sau đ ó t ừ h à ng đ ợ i đưa v à o result n à y đ ể t í nh t ổ ng tr ê n list. 72
  • 19. • Gi ả s ử chương tr ì nh t í nh to á n l à m nh ữ ng c ô ng vi ệ c kh á c nhau tr ê n c ù ng m ộ t d ữ li ệ u, nhưng do m ỗ i process lưu tr ữ trong v ù ng b ộ nh ớ ri ê ng như m ộ t h ệ th ố ng ph â n t á n (Distributed System). • Ch ẳ ng h ạ n, process đ ó ng vai tr ò master ch ị u tr á ch nhi ệ m t ạ o m ộ t ma tr ậ n l à c á c gi á tr ị th ự c ng ẫ u nhi ê n thu ộ c đo ạ n [0,1), sau đ ó g ử i v ề cho process đ ó ng vai tr ò slave. Process n à y ch ị u tr á ch nhi ệ m nh â n ma tr ậ n n à y v ớ i ma tr ậ n ngh ị ch đ ả o r ồ i g ử i chu ẩ n-2 c ủ a ma tr ậ n t í ch n à y v ề cho master đ ể xu ấ t ra m à n h ì nh. 73 • Chương tr ì nh đư ợ c vi ế t như sau: import numpy as np import multiprocessing as mp N = 10 M = 10 def master( conn ): ma_a = np.random.random((N,M)) conn.send(ma_a) norm = conn.recv() print( "Norm is %20.18f" % norm ) conn.close() 74 def slave( conn ): sl_b = conn.recv() norm2 = np.linalg.norm(np.dot(sl_b,np.linalg.inv(sl_b)),2) conn.send( norm2 ) conn.close() ma_conn, sl_conn = mp.Pipe() ma_p = mp.Process( target = master, args = (sl_conn,) ) sl_p = mp.Process( target = slave, args = (ma_conn,) ) ma_p.start() sl_p.start() ma_p.join() sl_p.join() 75 S ử d ụ ng trong Khoa h ọ c d ữ li ệ u • C ó hai á p d ụ ng đa x ử l ý trong Khoa h ọ c d ữ li ệ u: • X ử l ý nh ậ p xu ấ t: Th ô ng thư ờ ng vi ệ c ghi d ữ li ệ u l ê n Data Warehouses n à o đ ó thư ờ ng m ấ t nhi ề u th ờ i gian hơn l à vi ệ c đ ọ c d ữ li ệ u đ ể đưa v à o x ử l ý . N ê n vi ệ c ghi đư ợ c th ự c hi ệ n song song s ẽ hi ệ u qu ả . • X â y d ự ng m ô h ì nh hu ấ n luy ệ n: kh ô ng ph ả i t ấ t c ả c á c m ô h ì nh đư ợ c hu ấ n luy ệ n theo c á ch song song, nhưng m ộ t s ố m ô h ì nh c ó th ể th ự c hi ệ n theo c á ch n à y. Ch ẳ ng h ạ n Random Forest đư ợ c tri ể n khai tr ê n nhi ề u c â y quy ế t đ ị nh (Decision Tree) đ ể l ấ y m ộ t quy ế t đ ị nh t í ch lu ỹ 76
  • 20. • C ũ ng lưu ý , trong thư vi ệ n sklearn c ó cung c ấ p tham s ố n_jobs gi ú p cho vi ệ c s ử d ụ ng nhi ề u task. • V í d ụ minh ho ạ : gi ả s ử c ó c ô ng vi ệ c dowork() c ầ n gi ả i quy ế t trong 2 l ầ n. 77 • S ử d ụ ng Multi-Processing 78 79