Professional Documents
Culture Documents
Tính toán song song và phân tán 7. Mẫu phân chia (Paradigm)
PGS.TS. Trần Văn Lăng 1. Mô hình cây nhị phân (Binary
langtv@vast.vn
Tree Paradigm)
lang@lhu.edu.vn
2. Chia để trị (Devide and
Conquer)
3. Phân hoạch (Partitioning)
1 2
1
10/15/18
Minh họa
A1
• Với n= 8 = 23,mỗi nhóm có 4 phần tử
– Nhóm 1: A(1), A(3), A(5), A(7)
– Nhóm 2: A(2), A(4), A(6), A(8) A1 A2
• Cần 4 task
• Với dãy gồm 8 phần tử, mô hình như
A1 A2 A3 A4
hình vẽ bên dưới
A1 A2 A3 A4 A5 A6 A7 A8
• Bốn process đồng thời tính các giá trị tổng của nó • Giai đoạn tiếp theo chỉ còn lại 4 phần tử. Các phần
theo yêu cầu tử lưu trong 2 nhóm
• Rồi lưu vào các biến tương ứng – Nhóm 1: A(1), A(3)
– A(1) <— A(1) + A(2) – Nhóm 2: A(2), A(4)
– A(2) <— A(3) + A(4)
– A(3) <— A(5) + A(6)
– A(4) <— A(7) + A(8)
2
10/15/18
Thuật giải
• Khi đó 2 process đồng thời cộng
– A(1) <— A(1) + A(2)
– A(2) <— A(3) + A(4)
• Các kết quả được lưu vào A(1),
A(2)
Độ phức tạp
• Số process ban đầu là p = n/2 • Trong câu lệnh 4, chi phí
thời gian là O(1) cho 1
• Trong mỗi lần thực hiện số task chỉ còn 1/2.
task, nên với log2n bước,
• Nên số task cần thiết là chi phí thời gian O(logn).
P = n/2 = O(n)
3
10/15/18
• Nên hiệu suất Ep(n) (Efficiency) quá nhỏ khi n khá • Với thuật giải tính tổng như trên,
lớn:
• Chúng ta phải khảo sát bài toán sao cho Ep(n) có • Suy ra
giá trị là 1
15 16
4
10/15/18
Minh họa
• Chia mảng A(1:n) thành r = n/logn nhóm, để huy • A(1), A(2), A(3), ..., A(k)
động r task • A(k+1), A(k+2), ..., A(2k)
• Mỗi nhóm có logn phần tử.
..............
• Ở đây vẫn giả thiết n = 2k và n/logn là số nguyên (k
= logn) • A((i-1)k+1), A((i-1)k+2), ..., A(ik)
• Các nhóm được phân bố như sau: ..............
• A((r-1)k+1), A((r-1)k+2), ..., A(rk)
b) Thuật giải
• Mỗi process cộng logn phần tử.
• Lưu kết quả lại trong mảng B(1:r)
• Sử dụng thuật giải song song (như phần 1) để tính
tổng r phần tử của B.
• Thuật giải song song trên B này cần O(logr) thời
gian và O(r) process.
5
10/15/18
Độ phức tạp
• Các câu lệnh 2, 3, 4 cần O(logn) bước thời gian.
• Khi đó, các bước tứ 1 đến 5 dùng song song mất
O(logn) thời gian O(n/logn) process.
6
10/15/18
• Trong mô hình phân hoạch, người ta không quan • Giả sử có 2 mảng A(1:n), B(1;n) đã được sắp xếp
tâm đến quá trình hợp nhất. tăng, cần phải hợp nhất thành 1 mảng C(1:2n)
• Tiến trình phân hoạch bảo đảm sao cho khi phân cũng tăng.
chia xong, việc giải các bài toán con cho kết quả là • Ở đây giả thiết n = 2k, và r = n/logn là số nguyên (k
lời giải của bài toán đặt ra. = logn)
7
10/15/18
• Tiếp theo cần tìm r số nguyên j(1), j(2), ..., j(r) sao • Từ đây, phân B thành r nhóm như sau:
cho – B(1), B(2), ..., B(j(1))
– j(1) là chỉ số lớn nhất mà A(k) > B(j(1)) – B(j(1)+1), B(j(1)+2), ..., B(j(2))
– j(2) là chỉ số lớn nhất mà A(2k) > B(j(2)) ...............................................
................................................... – B(j(i-1)+1), B(j(i-1)+2), ..., B(j(i))
– j(i) là chỉ số lớn nhất mà A(ik) > B(j(i)) ...............................................
................................................... – B(j(r-1)+1), B(j(r-1)+2), ..., B(j(r))
– j(r) là chỉ số lớn nhất mà A(rk) > B(j(r))
8
10/15/18
• Ở bước thứ 2, dùng thuật giải tìm kiếm nhị phân, • Còn khi kích thước này nhỏ hơn hay bằng k, thuật
chi phí O(logn). giải cần chi phí O(logn).
• Bước 3, tùy theo kích thước của B(j(i-1)+1:j(i)), • Như vậy, thuật giản cần O(logn) thời gian,
O(n/logn) process.
• Nếu lớn hơn k, chúng ta dùng thuật giải song song
này để hợp nhất hai phần tương ứng của A và B.
Minh họa
• A = {1,5,15,18,19,21,23,24,27,29,30, • A được phân thành 4 nhóm
31,32,37,42,49} – 1,5,15,18
• B = {2,3,4,13,15,19,20,22,28,29,38, – 19,21,23,24
41,42,43,48,49} – 27,29,30,31
• n = 16 = 24, k =4, r = n/logn = 4 – 32,37,42,49
9
10/15/18
• Khi đó, j = {5,8,10} • Đồng thời hợp nhất các nhóm con của A và B.
• B được phân thành 4 nhóm
– 2,3,4,13,15 Nhóm 1 2 3 4
A 1, 5, 15, 18 19, 21, 23, 24 27,29, 30,31 32,37,
– 19,20,22
42,49
– 28,29 B 2, 3, 4, 13, 15 19,20, 22 28,29 38,41,42, 43,48,49
– 38,41,42,43,48,49
38
40
10
10/15/18
41 42
#include <stdio.h>
• Trong đó #define N 10000000
int main(int argc, const char * argv[]){
double delta, x, sum = 0.0, pi;
delta = 1.0/N;
for ( int i = 0; i < N; i++ ){
x = i*delta;
sum += 4.0/(1.0 + x*x);
}
pi = sum*delta;
printf( "Pi = %20.18f\n", pi );
return 0;
}
43 44
11
10/15/18
#include <stdio.h>
5. Phân tích thuật toán tính số π dùng Phương pháp #include <stdlib.h>
#include <time.h>
Monte Carlo: #define npoints 10000000
int main(int argc, const char * argv[]){
– Đường tròn nội tiếp trong một hình vuông int count = 0;
double x, y, pi;
srand( (unsigned int)time(NULL) );
– Nếu đặt số chấm ngẫu nhiên lên hình vuông for ( int i = 1; i < npoints; i++ ){
x = (double)rand()/RAND_MAX;
– Thì tỷ lệ giữa số chấm nằm trong hình tròn và số chấm y = (double)rand()/RAND_MAX;
if ( x*x + y*y <= 1 )
nằm trong hình vuông là: count += 1;
}
pi = 4.0*count/npoints;
printf( "Pi = %20.18f\n", pi );
return 0;
}
45 46
12