Thuật toán song song tìm cây khung bé nhất

Một phần của tài liệu GIÁO TRÌNH: TÍNH TOÁN SONG SONG potx (Trang 104 - 112)

Bài toán tìm cây khung bé nhất được phát biểu như sau: cho một đồ thị liên thông, vô hướng, có

dưới đây ta sẽ thảo luận về hai thuật toán song song dựa trên giải thuật tuần tự của Sollin (1977)

và của Kruskal (1956) để giải bài toán này.

a.Thuật toán Sollin

Trước hết, ta hãy khảo sát phiên bản giải thuật Sollin tuần tự. Trong giải thuật này, ta bắt đầu với

một rừng gồm n đỉnh tách biệt nhau. Mỗi đỉnh được xem như một cây. Trong mỗi vòng lặp, thuật

toán tìm ra một cạnh để nối hai cây với nhau, không thể có hai cây nào được nối bằng nhiều hơn

một cạnh. Đồng thời, cũng phải bảo đảm chúng không thể tạo thành các chu trình. Tiến trình này tiếp tục cho đến khi chỉ còn một cây (tất cả các đỉnh đã được kết nối). Vì số lượng cây sẽ được

giảm đi ít nhất 2 lần trong mỗi lần lặp, nên thuật toán Sollin yêu cầu nhiều nhất [logn] lần lặp để

tìm ra được cây khung nhỏ nhất. Mỗi lần lặp yêu cầu nhiều nhất O(n2) phép so sánh để tìm ra

được cạnh bé nhất qua mỗi đỉnh. Vì vậy, thuật toán tuần tự có độ phức tạp O(n2logn).

Dưới đây là giả mã của phiên bản tuần tự của thuật toán:

MINIMUM-COST SPANNING TREE() Parameter n {số đỉnh}

Global closest[], {khoảng cách của cây gần nhất}

edge[], {cạnh nối cây với cây gần nhất}

i,

T, {cây khung nhỏ nhất}

u,w {điểm cuối của cạnh đang xem xét}

weigh[] {chứa trọng số của cạnh}

1 Begin

2 For i=1 to n do

3 Đỉnh i được khởi tạo trong tập i

4 Endfor

5 T = ø

6 While |T| < n-1 do

7 For mỗi cây i do

8 closest[i] = ∞

9 Endfor

10 For mỗi cạnh (v,w) do

11 If FIND(v) ≠ FIND(w) then

12 If weight(v,w) < closest(FIND(v)) then

13 closest(FIND(v)) = weight(v,w)

14 edge(FIND(v)) = (v,w)

15 Endif

16 Endif

17 Endfor

18 For mỗi cây i do

20 If FIND(v) ≠ FIND(w) then 21 T = T  {(v,w)} 22 UNION(v,w) 23 Endif 24 Endfor 25 Endwhile 26 End

Phiên bản tuần tự của thuật toán tìm cây khung nhỏ nhất của Sollin

Một minh họa của thuật toán được thể hiện ở hình dưới đây:

Hình 2.36. Một ví dụ minh họa thuật toán Sollin.

Chú ý rằng thuật toán này sử dụng các tập hợp (set) để lưu các đỉnh trong cây. Hàm FIND(v) nhận đầu vào là một đỉnh v, trả lại tên của tập chứa v. Thủ tục UNION nhận vào hai tham số là

hai đỉnh, thực hiện phép hợp gai tập hợp chứa v và w; nói cách khác, UNION thực hiện phép kết

nối hai cây chứa đỉnh v và w.

Làm thế nào để song song hóa giải thuật tuần tự trên?. Thông thường, ta có thể song song hóa

vòng lặp ngoài cùng. Tuy nhiên, trong trường hợp này thì vòng lặp ngoài cùng while bị phụ

thuộc ràng buộc dữ liệu giữa các lần lặp. Mỗi cây đang tồn tại tại vòng lặp thứ i phải được kết

hợp với cây lân cận trước khi lần lặp thứ i+1 được bắt đầu. Vì vậy, xử lý song song phải được

thực hiện bên trong vòng lặp while. Các dòng lệnh từ 7 đến 9 có thể được song song hóa bằng

cách tiền lập lịch (prescheduling). Mỗi bộ xử lý chịu trách nhiệm tạo ra 1/p cây. Vòng lặp for từ

dòng 10 đến 17 cũng có thể được song song theo cách trên. Đây là cách hiệu quả nhất bởi có thể

gán mỗi bộ xử lý với các đỉnh đang được chia sẻ, sau đó cho phép chúng thử tất cả các cạnh từ

Việc song song hóa từ dòng 18 đến 24 phức tạp hơn. Giả sử rằng một bộ vi xử đang kết nối cây A

với cây B, trong khi bộ vi xử lý khác kết nối cây B với cây A. Biến edge(A) chứa cạnh (vA, wA) với độ dài k. Biến edge(B) cũng chưa cạnh (vB, wB) với độ dài k. Nếu cả hai bộ xử lý thực hiện

dòng 20 trước khi thực hiện phép toán UNION ở dòng 22 thì cả hai cạnh sẽ được thêm vào cây T và kết quả là sẽ sinh ra lỗi. Do vậy, nếu các dòng 18 đến 24 được song song hóa thì các cây FIND(v) và FIND(w) phải được khóa trước dòng 20 và phải được mở khóa (unlocked) trước sau

dòng 23 vì ta chỉ có phép một bộ xử lý được thực hiện tại một thời điểm trong trường hợp mở

rộng cây khung.

Định lý:phiên bản song song hóa giải thuaatk Sollin miêu tả ở trên có độ phức tạp

O(log(n(n2/p+n/p+n+p)).

Chứng minh:

Một chuỗi n thao tác UNION và FIND sẽ có độ phức tạp là O(nlog*n) và thời gian dành cho một thao tác như vậy là O(log*n); vì vậy, độ phức tạp này được xem như hằng số.

Thực hiện song song vòng lặp for từ dòng 7 đến 9 có độ phức tạp O(n/p + p), vòng lặp 10 đến 17 có độ phwvs tạp O(n2/p + p), và vòng lặp từ dòng 18 đến 24 có độ phức tạp O((n/p)p + p). Thừa

số p trong lần lặp cuối cùng vì trong trường hợp xấu nhất, một bộ xử lý chờ để khóa một cây A có

thể phải đợi bộ xử lý khác khóa và mở khóa cây A. Vì vòng lặp while ngoài cùng cần O(logn)

thời gian nên phiên bản song song của thuật toán Sollin là O((n2/p+n/p+n+p)logn).

Độ phức tạp này đạt giá trị nhỏ nhất khi p=O( n).

b. Thuật toán Kruskal

Thuật toán Kruskal bắt đầu với một đồ thị gồm một rừng các đỉnh riêng biệt. Các cạnh sẽ được

duyệt theo thứ tự tăng dần của trọng số, và mỗi cạnh kết nối với hai cây không giao nhau sẽ được

bổ sung vào cây khung nhỏ nhất (nói cách khác, tất cả các cạnh mà không tạo ra chu trình trong

đồ thị sẽ được thử để chọn). Thuật toán dừng khi chỉ gồm một cây là một cây khung nhỏ nhất.

Hình dưới đây là một ví dụ minh họa cho thuật toán Kruskal:

Hình 2.37. Một ví dụ minh họa cho thuật toán Kruskal.

Yoo (1983) đã phát biểu rằng: một máy tính đa xử lý UMA với [logm] bộ xử lý có thể loại bỏ một

phần tử từ một heap m phần tử với thời gian là hằng số.

Mô tả thuật toán:

Hình 2.38. Thuật toán xử lý xen kẽ của Yoo

Thuật toán xử lý xen kẽ (pipelined algorithm) của Yoo được minh họa ở hình trên. Một mảng được dùng để triển khai heap với gốc của heap được lưu lại trong phần tử đầu tiên và con trái và phải của nút i được lưu trong phần tử thứ 2i và 2i+1. Heap là một cây nhị phân hoàn chỉnh với p

mức, p là số bộ vi xử lý. Các nút là được gán giá trị ∞ nếu cần. Trong khi thực hiện, một nút được

gọi là đầy đủ (full) nếu no chứa một giá trị nào đó (kể cả ∞). Một nút là rỗng nếu giá trị của nó đã

được chuyển đến cha của nó và nó chưa nhận được giá trị thay thế từ con của nó. Mảng flag chỉ

ra mức nào có nút rỗng; flag(i)=empty nếu ở mức i có nút rỗng; ngược lại flag(i)=full.

Nếu flag(i)=empty thì empty_node(i) sẽ chỉ ra nút nào rỗng. Với mỗi 2 ≤ i ≤ p, bộ xử lý i được

gán công việc là làm cho tất cả các nút thứ i-1 trở thành full. Nếu flag(i-1) = empty và flag(i) =full, thì bộ xử lý thứ i sẽ gán các giá trị thích hợp (lấy từ mức i) cho các nút ở mức i-1. Khi đó

flag(i-1)= full, và flag(i) =empty. Khi một nút là trở thành empty, thì nó sẽ được gán giá trị ∞.

Cuối cùng, các giá trị ∞ được gán vào cây. Bộ xử lý 1 sẽ làm rỗng nút 1 bất kỳ khi nào nó trở

thành full và dừng thủ tục khi nút 1 có giá trị ∞.

Giả mã của thuật toán được mô tả dưới đây:

HEAP CONSTRUCTION (SISD) Parameter d {độ sâu của heap}

Global k,v,w {các phần tử của heap}

Key[1..(2d+1-1)] {heap} l {số mức}

1 Begin

2 For l=d downto 1 do

3 For nút không phải là nút lá ở mức l do

4 K=key(v) 5 Repeat

6 w = con của v với khóa nhỏ hơn

7 If k>key[w] then

8 Key[v]=key[w]

10 Else 11 Exit loop 12 Endif 13 Until v là nút lá 14 Key[v]=k 15 Endfor 16 Endfor 17 End

Vòng lặp trong các dòng 3 đến 15 có thể được song song hóa bởi cách thức tiền lập lịch; mỗi bộ

vi xử lý tạo ra các nút không phải là nút lá chia sẻ trong heap ở mức l. Một cách tốt hơn là cho

phép xây dựng heap với hai con được tạo 1 lần để giải quyết đồng thời tính đồng bộ khi các mức được xử lý đồng thời.

2.7 Kết chương

PRAM là một mô hình được mở rộng từ mô hình xử lý tuần tự RAM. Một thuật toán PRAM cho

phép thực hiện đồng thời nhiều bước trên tập dữ liệu lớn với số lượng bộ vi xử lý tham gia thực

hiện chương trình không bị hạn chế. Các mô hình của PRAM có thể có các cơ chế cho phép nhiều

bộ xử lý đọc hoặc ghi đồng thời một ô nhớ trong bộ nhớ toàn cục.

Các thuật toán song song nhân hai ma trận được thiết kế cho các kiến trúc song song khác nhau. Gentleman đã chỉ ra rằng nhân hai ma trận kích thước n x n trên máy tính SIMD với các bộ xử lý được tổ chức theo mạng hình lưới hai chiều có độ phức tạp O(n), và đó là tối ưu. Dekel cũng đề

xuất một giải thuật rất hiệu quả cho phép n3=23q bộ xử lý trên một máy SIMD với các bộ xử lý được tổ chức theo hình siêu khối để nhân hai ma trận với độ phức tạp O(logn).

Ba giải thuật sắp xếp song song mà ta đã tìm hiểu đều rất hiệu quả. Trong đó, giải thuật sắp xếp

hoán chuyển chẵn lẻ trên máy tính mà các bộ vi xử lý được tổ chức theo mạng hình lưới một

chiều rất đơn giản nhưng tối ưu với độ phức tạp O(n). Thuật toán sắp xếp trộn Bitonic được thực

hiện một cách đệ quy rất hiệu quả trên máy tính mà các bộ xử lý được tổ chức theo mạng hoán vị- di chuyển hoặc siêu khối với độ phức tạp O(log2n). Giải thuật quicksort song song và siêu

quicksort được thiết kế cho máy tính MIMD theo chiến lược chia để trị tuy không đạt được giảm độ phức tạp tính toán; nhưng trên thực tế thì tốc độ thực hiện thuật toán rất hiệu quả nhờ các tiến

trình thực hiện độc lập được xử lý song song.

Không dễ dàng để tăng tốc độ đối với các thuật toán tìm kiếm trên danh bạ. Thứ nhất, thuật toán

tuần tự có độ phức tạp là logn và thứ hai là các tiến trình thực hiện các thao tác thường bị phụ

thuộc lẫn nhau. Tuy nhiên, trong chương này đã mô tả thuật toán song song thực hiện các thao

tác tìm kiếm, chèn và xóa trên máy tính đa bộ xử lý UMA. Các thuật toán đi kèm với các tiến

trình với từng thao tác riêng lẻ được thể hiện. Việc khóa (lock) các tiến trình được sử dụng để

khóa các tiến trình đan xen nhau tránh xung đột (contention) khi cần thiết. Thuật toán Ellis cho

phép tìm kiếm và chèn vào cây AVL yêu cầu tiến trình thực hiện thao tác chèn phải khóa phần

cây con mà có gốc là nút đang được quay (để bảo đảm tính cân bằng của cây. Thuật toán Manber và Ladner đòi hỏi không khóa nhiều hơn một nút trên cây đối với các thao tác: tìm kiếm, chèn, xóa và cập nhật. Các thuật toán song song yêu cầu độ phức thạp về thời gian không quá O(logn).

Hai thuật toán song song trên đồ thị nhằm giải quyết bài toán tìm đường đi ngắn nhất và cây khung nhỏ nhất được song song hóa từ các phiên bản tuần tự. Thuật toán Moore giải bài toán tìm

đường đi ngắn nhất được song song hóa thành một giải thuật thực hiện trên máy tính đa xử lý

UMA và dùng mảng liên kết để loại trừ các xung đột giữa các tiến trình. Mảng liên kết này có thể được thay thế bởi một hàng đợi hiệu quả hơn. Phiên bản song song của thuật toán Kruskal tìm cây khung nhỏ nhất cũng được thực hiện trên máy tính đa xử lý UMA. Thuật toán này hiệu quả đối

với máy tính có ít bộ vi xử lý nhờ việc sử dụng kỹ thuật pipeline kết hợp với việc thao tác trên một heap.

2.8 Câu hỏi và bài tập2.8.1 Câu hỏi 2.8.1 Câu hỏi

1. Trình bày về mô hình PRAM. Trong mô hình PRAM, một bộ xử lý có thể thực hiện được các

thao tác gì?.

2. Nêu các cơ chế của mô hình PRAM giải quyết các vấn đề nhiều bộ xử lý đọc/ghi cùng một ô

nhớ trong bộ nhớ toàn cục?.

3. Cho một ví dụ minh họa giải thuật trộn hai mảng đã sắp xếp thành một mảng được sắp xếp được trình bày ở phần 2.1.3.

4. Trình bày thuật toán nhân hai ma trận trên máy SIMD với các bộ xử lý được tổ chức theo mạng

hình lưới hai chiều.

5. Trình bày thuật toán nhân hai ma trận trên máy SIMD với các bộ xử lý được tổ chức theo

mạng siêu khối.

6. Nêu ý nghĩa của thủ tục BIT.COMPLEMENT?. Cho ví dụ minh họa?.

7. Trình bày thuật toán nhân hai ma trận trên máy đa bộ xử lý UMA?.

8. Trình bày thuật toán nhân hai ma trận hướng khối trên hệ thống đa máy tính.

9. Trình bày về giải thuật sắp xếp song song hoán chuyển chẵn lẻ: ý tưởng, thủ tục giả mã, độ

phức tạp.

10. Trình bày về giải thuật sắp xếp trộn Bitonic?.

11. Chứng minh rằng: giải thuật sắp xếp Bitonic có độ phức tạp O(log2n). (gợi ý:

T(n)=T(n/2)+O(logn)).

12. Trình bày giải thuật sắp xếp Quicksort song song.

13. Trình bày giải thuật sắp xếp siêu Quicksort.

14. Hãy chỉ ra rằng: giải thuật Quicksort song song có độ phức tạp O(nlogn).

15. Trình bày giải thuật song song Ellis trên máy tính đa bộ xử lý UMA?.

16. Liệt kê và nêu ý nghĩa các thao tác cơ bản của thuật toán Manber và Ladner?.

17. Sự khác nhau giữa tìm kiếm yếu và tìm kiếm mạnh trong thuật toán Manber và Ladner? 18. Trình bày thuật toán song song tìm đường đi ngắn nhất trên máy tính đa bộ xử lý UMA?

19. Trình bày thuật toán song song Sollin trên máy tính đa bộ xử lý UMA?

20. Hãy chỉ ra rằng thuật toán song song Sollin trên máy tính đa bộ xử lý UMA có độ phức tạp

2.8.2 Bài tập

1. Hãy trình bày một thuật toán PRAM giải bài toán tính tổng của n số tự nhiên đầu tiên. 2. Hãy trình bày một thuật toán PRAM giải bài toán tính tích phân sau:

I = 1 

0

) ) (cos(x x dx

3. Hãy trình bày một thuật toán PRAM giải bài toán tìm tất cả các số nguyên tố nhỏ hơn số nguyên n cho trước.

4. Hãy mô tả từng bước của thuật toán nhân hai ma trận trên máy SIMD với các bộ xử lý được tổ

chức theo mạng hình lưới hai chiều với đầu vào là hai ma trận sau:

A= ( 2 3 4 1 1 0 1 1 2 1 4 1 1 0 3 4) và B= ( 1 0 0 1 2 1 0 0 0 1 1 2 1 0 3 0)

5. Hãy mô tả từng bước của thuật toán nhân hai ma trận trên máy SIMD với các bộ xử lý được tổ

chức theo mạng hình siêu khối với đầu vào là hai ma trận A và B ở bài 4. 6. Mô tả từng bước thực hiện thuật toán hoán chuyển chẵn lẻ với đầu vào: {3 4 1 2 9 0 5 2 6}

7. Mô tả từng bước thực hiện thuật toán sắp xếp trộn Bitonic với đầu vào: {1 2 3 4 9 7 5 2 0}

8. Mô tả từng bước thực hiện thuật toán sắp xếp Quicksort song song với đầu vào: {3 4 1 2 9 0 5 2 6}

9. Mô tả từng bước thực hiện thuật toán sắp xếp siêu Quicksort với đầu vào: {3 4 1 2 9 0 5 2 6}

CHƯƠNG 3 : CÁC VẤN ĐỀ CỦA HỆ THỐNG TÍNH TOÁN

Một phần của tài liệu GIÁO TRÌNH: TÍNH TOÁN SONG SONG potx (Trang 104 - 112)

Tải bản đầy đủ (PDF)

(112 trang)