Việc song song hóa bài toán tìm xâu con chung dài nhất đã được nghiên cứu rất nhiều trong thời gian gần đây với các phương pháp dựa trên Bit của Myers [9], phương pháp dựa trên phần tử trội của Korkin [7]. Trong phần này, một phương pháp song song mới được áp dụng dựa trên những nhận xét như sau:
- Các phần tử trội ở mức cao hơn đều được tính dựa vào các phần tử trội ở mức thấp hơn.
- Các phần tử ở các vùng không trội hơn nhau có thể được tính toán một cách đồng thời.
Bảng 2.4. Ví dụ về việc tìm các phần tử trội độc lập trên hai vùng khác nhau.
H E A G A W G H E E A 1 1 W H 1 E 2 3 A E
Giả sử chúng ta đã tìm kiếm được các phần tử trội trong một khối đầu tiên 3x3 của ma trận phương án tìm xâu con chung dài nhất của hai xâu trong bảng 2.4. Như
vậy công việc tìm kiếm phần tử trội sẽ được tiến hành ở khối thứ 1 nếu đi theo chiều ngang hoặc ở khối thứ 2 nếu đi theo chiều dọc. Hai khối 1 và 2 là không trội hơn nhau. Cả hai khối này chỉ trội hơn khối đầu tiên đã được tính các phần tử trội. Như vậy hai khối 1, 2 hoàn toàn có thể được tính toán một cách độc lập trên các bộ xử lý khác nhau. Khối thứ 3 trôi hơn cả ba khối còn lại, do đó để tìm các phần tử trội của khối này bắt buộc phải biết các phần tử trội ở các khối trước đó.
Như vậy, nếu có k bộ xử lý, chúng ta hoàn toàn có thể chia vùng tìm kiếm ra thành các ô chữ nhật, rồi từ đó xác định các ô không trội hơn nhau thì sẽ hoàn toàn tính toán được số phần tử trội của mỗi ô này một cách độc lập.
Ví dụ với việc tìm xâu con chung dài nhất của hai chuỗi với 4 bộ xử lý, khi đó không gian tìm kiếm sẽ được chia thành 4x4 = 16 ô được đánh số theo thứ tự thực hiện, các ô không trội hơn nhau và có thể được tính toán một cách đồng thời sẽ có cùng số thứ tự thực hiện như trong bảng 2.4.
Bảng 2.4. Chia ô vùng tìm kiếm và xác định các vùng tìm kiếm đồng thời.
0 1 2 3
1 2 3 4
2 3 4 5
3 4 5 6
Từ bảng 2.4, việc tìm kiếm phần tử trội trên ô 0 được thực hiện trước tiên. Sau đó hai ô cùng số thứ tự 1 trội hơn so với ô 0 nên do đó hai ô này sẽ được thực hiện trên hai bộ xử lý khác nhau. Sau khi có được các phần tử trội từ hai ô này, các phần tử trội sẽ được gộp lại để chuẩn bị cho bước thực hiện sau. Vì các ô có cùng số thứ tự thực hiện là không trội hơn nhau (độc lập với nhau), nên do đó các phần tử trội của các khối này cũng không trội hơn nhau, do đó mà các phần tử trội sau khi gộp lại không bị xung đột, mâu thuẫn. Với 4 bộ xử lý, thuật toán sẽ được thực hiện với 7 bước tuần tự (từ bước 0 đến bước 6). Thuật toán sẽ sử dụng số bộ xử lý tương ứng với số ô độc lập và đạt đến cực đại là 4 bộ xử lý tại bước 3. Sau đó số bộ xử lý thực
hiện sẽ giảm dần xuống 1 tại bước 6. Như vậy số bước thực hiện đối với hai xâu và số bộ xử lý bằng 4 là 7 bước.
Như vậy, giả sử có k bộ xử lý, không gian tìm kiếm trên mỗi trục sẽ được chia thành k phần, do đó số bước thực hiện tuần tự sẽ phải đi bám dần trên các trục này để đến được ô cuối cùng. Giả sử có d xâu ký tự, khi đó số bước thực hiện tuần tự sẽ là: dk11 bước.
Hình 2.1 Tuần tự các khối tìm kiếm với ba chuỗi và bốn bộ xử lý
Ví dụ với ba xâu ký tự và 4 bộ xử lý, không gian tìm kiếm sẽ là một hình hộp chữ nhật. Số bước tuần tự sẽ là 3 x (4 - 1) + 1 = 10 như trong hình 2.1.
Việc xác định các khối độc lập trong cùng một bước tuần tự để có thể song song hóa được thực hiện như sau:
Giả thiết có k bộ xử lý, d xâu ký tự. Ta chia trên mỗi trục thành k phần bằng nhau và đánh số từ 0 đến k1. Gọi Ax1,x2,...,xd, 0xik1, i1,...,d là ô tương ứng với các vùng tìm kiếm. Tại điểm xuất phát đầu tiên, chỉ có duy nhất một khối là
0,0,...,00
A được thực hiện. Ở bước tuần tự thứ 2, khi giá trị tuần tự trong các ô là 1, khi đó tức là các ô này đều phụ thuộc vào A0,0,...,0. Các ô này có dạng như sau:
i0,..,1,.,0
phần tọa độ trong B đều bằng 1 hay đều bằng với số thứ tự thực hiện các bước tuần tự. Do đó, giả sử bước thực hiện tuần tự đang ở bước thứ m, khi đó các khối thực hiện tại bước này sẽ có dạng Mx1,x2,...,xd với x m
d i i 1 và d i k xi 1, 0,1,...,
0 . Rõ ràng đây là bài toán phân tích số m ra thành tổng của
d số tự nhiên nhỏ hơn k và các hoán vị của chúng.
Để chứng minh việc phân chia này là đúng đắn, chúng ta có thể nhận thấy như sau: với d xâu ký tự và k bộ xử lý, số bước tuần tự bắt buộc ít nhất phải là
d k1 1 bước.
Giả sử ta đang thực hiện tại bước thứ m. Khi đó Mx1,x2,...,xd với x m
d
i i
1
là các khối độc lập có thể tiến hành song song hóa. Các phân hoạch của phép phân tích số m thành tổng của d số nhỏ hơn m là hoàn toàn khác nhau. Hơn nữa với mỗi cách phân hoạch như vậy, ta lấy hoán vị của các phần tử trong M sẽ tạo thành các khối hoàn toàn phân biệt. Như vậy trong cùng một bước chia, các khối sẽ không bị trùng lặp. Ngoài ra, hai khối ở hai bước thực hiện sẽ phải khác nhau do tổng các thành phần trong khối đã khác nhau.
Hình 2.2 Tọa độ các ô tại các bước tuần tự của hai xâu và bốn bộ xử lý
Trở lại với ví dụ hai xâu và bốn bộ xử lý, với điểm xuất phát của khối tuần tự ở bước 0 là (0,0). Khi chuyển sang bước 1, vị trí xuất phát của hai khối bước này là
(0,1) và (1,0). Cứ tiếp tục như vậy, ở bước 2 sẽ có 3 khối độc lập là (2,0), (1,1) và (0,2); ở bước 3 sẽ là (3,0), (2,1), (1,2), (0,3); ở bước 4 sẽ là (3,1), (2,2), (1,3); ở bước 5 sẽ là (3,2) và (2,3) và ở bước 6 là (3,3).
Tuy rằng bài toán phân tích số và hoán vị là bài toán NP-Hard, tuy nhiên do số xâu ký tự cùng so sánh là không lớn (<10), số bộ xử lý có giới hạn nên chi phí tính toán các ô cùng một bước tuần tự là không đáng kể.
Hình 2.3 Tọa độ các ô tại các bước tuần tự của hai xâu và bốn bộ xử lý.
Trong ví dụ hình 2.3, khi thực hiện tính toán ở bước thực hiện 0 (được bao trong hình vuông đậm) sẽ tìm được một phần tử trội (các điểm được khoanh tròn). Đến bước thực hiện 1, dựa vào một phần tử trội tại bước 0, hai khối tại bước 1 sẽ thực hiện tìm kiếm các phần tử trội. Kết quả trả về được ba phần tử trội, sẽ được ghép lại với phần tử trội tại bước 0 cho các bước thực hiện 2, 3 và 4.
Giả thiết trong k bộ xử lý có một bộ xử lý là chủ (master) và các bộ còn lại là khách (slave). Gọi b là bước thực hiện và MAXB (MAXBdk11) là số bước tuần tự thực hiện. Một mảng hai chiều key sẽ lưu lại vị trí các ô độc lập trong một bước của từng bộ xử lý. Mỗi bộ xử lý sẽ được gán một số hiệu id để phân biệt với các bộ xử lý khác và sẽ nhận được key tương ứng với số hiệu id của mình. Trong một vòng lặp, số thứ tự lặp được xác định bằng biến b, bộ xử lý chủ sẽ gửi công việc là một số khối độc lập cho từng bộ xử lý để tìm các phần tử trội. Các bộ xử lý sau khi tìm được các phần tử trội, sẽ gửi lại các phần tử này cho bộ xử lý chủ để tổng hợp lại để chuyển sang bước lặp b1.
Thuật toán song song được thể hiện như sau: Input d xâu ký tự độ dài n
Output Tập các phần tử trội và xâu con chung dài nhất của d xâu ký tự
MASTER SLAVER
1: b0 b0
2: D D
3: While(bMAXB) While(bMAXB) 4: key=getKey(b)
5: Gửi key[i] cho bộ xử lý i Nhận key[id]
6: If(b0 and bMAXB1) If(b0 and bMAXB1)
7: Gửi ˆb1 D cho các bộ xử lý Nhận ˆb1 D 8: Gán b D D D ˆ 9: endIf 10: b id
Dˆ = FindDominant(key[id]) b id
Dˆ = FindDominant(key[id])
11: If(b0 and bdk1) 12: For i = 1 to k 13: Nhận b i Dˆ Gửi b id Dˆ cho bộ xử lý chủ 14: Gán b i b b D D Dˆ ˆ ˆ 15: endFor 16: endIf endIf 17: b b 18: endWhile endWhile
Trong đó:
- D là tập các phần tử trội.
- key[id] là một mảng đánh dấu các khối độc lập mà bộ xử lý id cần phải thực hiện trong một bước lặp.
- Hàm getKey(b) dùng để lấy các khối độc lập gán cho các bộ xử lý ở bước xử lý tuần tự b.
- Hàm FindDominant(key[id]) là hàm tìm kiếm các phần tử trội với vùng tìm kiếm là khối key[id] và b
id
Dˆ là tập các phần tử trội trong vùng tìm kiếm này.
Giải thuật song song phải mất một bước đầu tiên và cuối thực hiện tuần tự một khối công việc. Gọi i
B là số khối độc lập ở bước thực hiện thứ i
(0idk1). Gọi hB i k với là phép chia lấy phần nguyên làm tròn lên. Khi đó số khối thực hiện tuần tự sẽ là :
1 0 k d i i k B B
Gọi t là thời gian thực hiện một khối, khi đó thời gian tính toán của thuật toán sẽ là Bt. So với thuật toán tuần tự, số khối phải tính toán tuần tự của thuật toán song song luôn ít hơn. Xét với số chiều bằng 2, thời gian thực hiện của thuật toán song song là 2k1 so với k2 của thuật toán tuần tự. Như vậy, khi k càng tăng, thời gian xử lý của thuật toán song song sẽ tốt hơn thuật toán tuần tự khá nhiều. Khi số xâu ký tự tăng lên, đồng nghĩa với việc xuất hiện rất nhiều các ô độc lập cho phép tiến hành chạy song song. Khi đó thuật toán sẽ hiệu quả hơn trong việc tính toán các phần tử trội, giúp giảm thời gian tính toán.