20 ĐỀ DỰ ĐOÁN - PHÁT TRIỂN ĐỀ MINH HỌA BGD KỲ THI TỐT NGHIỆP THPT NĂM 2024 MÔ...
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