Mega Mflop/s = 10P6P flop/s Giga Gflop/s = 10P9Tera Tflop/s = 10P12Giá cost của một quá trình tính toán trên hệ thống song song được tính như sau : Giá = độ phức tạp tính tốn × số lượng
Trang 2TRƯỜ NG Đ Ạ I H C BÁCH KHOA HÀ NỘI Ọ
Trang 3Chương 1 : ĐẠI CƯƠNG VỀ TÍNH TOÁN SONG SONG 1.1 Một số khái niệm và thuật ngữ
Tính toán song song hay xử lý song song : là quá trình xử lý thông tin trong đó nhấn mạnh việc nhiều đơn vị dữ liệu được xử lý đồng thời bởi một hay nhiều bộ xử lý để giải quyết một bài toán
Siêu máy tính : là những máy tính đa năng thông thường có tốc độ tính toán vô cùng lớn Chúng chia làm hai loại
- Máy tính song song dựa trên bộ vi xử lý : được thiết kế với rất nhiều bộ xử lý
Tăng tốc : tăng tốc của thuật toán song song là tỉ số giữa thời gian thực hiện trong tình huống xấu nhất của thuật toán tuần tự tốt nhất và thời gian thực hiện cũng công việc đó của thuật toán song song
Liên quan đến tốc độ, năm 1967 Amdahl đã nêu ra định lý sau đây :
Trang 4Định lý Amdahl : Gọi f là tỷ lệ thao tác tuần tự trên tổng số thao tác phải làm, trong
đó 0 ≤ ≤ f 1 và S là tốc độ tối đa của một máy tính song song với bộ xử lý khi đó p
ta có
p
ff
S
)1(
1
−+
≤
Hiệu quả (Efficient) của thuật toán song song được tính bằng
Tốc độ / số bộ xử lý tham gia tính toán
Flop : Một đơn vị đo tốc độ của máy tính song song Flop là viết tắt của floating point operating per second : số phép tính toán hạng số thực dấu phẩy động thực hiện được trong một giây
Mega Mflop/s = 10P
6
P flop/s Giga Gflop/s = 10P
1.2 Các mức độ song song
Giả sử có 10 công việc từng đôi một khác nhau thì ta giao cho 10 máy làm, ta có mức song song cao nhất, và chúng ta gọi là mức chương trình song song Mỗi công việc ta lại chia thành các công đoạn (Task) và có thể thực hiện song song, ta gọi mức độ song song này là mức song song chương trình con Mỗi chương trình cũng như chương trình con lại có hàng loạt câu lệnh, ta có mức độ song song câu lệnh, trong câu lệnh lại có hành loạt thao tác (operation) => mức độ song song thao tác
Trang 51.3 Phân loại các kiến trúc song song
Một trong những phân loại hay được nhắc tới là của Flynn – 1972 Michael Flynn phân các kiến trúc máy tính thành bốn loại dựa trên tương tác giữa lệnh và dữ liệu :
- SISD(single instruction stream, single data stream) : Đây chính là kiến trúc tuần tự Von Neuman, trong đó tại mỗi thời điểm chỉ một lệnh được thực
Trang 6- MIMD (multiple instruction stream, multiple data stream) : Cho phép nhiều lệnh khác nhau có thể đồng thời xử lý nhiều dữ liệu khác nhau trong cùng một thời điểm
1.4 Mô hình SIMD
Mô hình kiến trúc này còn được gọi là PRAM (Parallel Random Access Machine – Máy tính song song truy cập ngẫu nhiên) Trong mô hình này, N bộ xử lý cùng chia
xẻ bộ nhớ chung Mô hình PRAM chia thành 4 lớp nhỏ :
- EREW (Exclusive Read, Exclusive Write) : Độc quyền đọc, độc quyền ghi Không cho phép hai bộ xử lý đọc hoặc ghi đồng thời trên cùng một ô nhớ
- CREW (Concurent Read Exclusive Write) : Đọc đồng thời, ghi độc quyền Các bộ xử lý có thể đọc đồng thời, nhưng không được phép ghi đồng thời trên một ô nhớ
- ERCW (Exclusive Read Concurent Write) : Ghi đồng thời, đọc độc quyền Các bộ xử lý có thể ghi đồng thời, nhưng không được phép đọc đồng thời trên một ô nhớ
- CRCW (Concurent Read Concurent Write) : đọc/ghi đồng thời Các bộ xử lý
có thể đồng thời đọc ghi trên một ô nhớ
Việc cho phép nhiều bộ xử lý đọc một ô nhớ không khó Nhưng thiết kế cấu trúc ghi đồng thời thì phức tạp hơn Vấn đề là ở chỗ nếu các giá trị ghi vào là khác nhau thì cuối cùng trong ô nhớ sẽ lưu giá trị nào ? Có ba cách giải quyết :
- ECR (Equallity Conflict Resolution) : Chỉ thực hiện ghi nếu tất cả các bộ xử
lý đều cùng ghi một giá trị như nhau
- PCR (priority Conflict Resolution) : Mỗi bộ xử lý có một chỉ số ưu tiên, và giá trị trên bộ xử lý có số thứ tự ưu tiên cao nhất sẽ được ghi
- ACR (arbitrary Conflict Resolution) : Trong cách giải quyết này sức mạnh của máy tính tăng dần theo thứ tự trên
Mặc dù yếu nhất, nhưng công nghệ chế tạo phổ biến hiện nay lại là các máy EREW, còn các máy CRCW, CREW thì đắt và khó chế tạo Do đó ta phải nghĩ tới việc dùng EREW để mô phỏng các kiến trúc còn lại như trình bày dưới đây
Trang 71.5 Dùng công nghệ EREW mô phỏng các kiến trúc CRCW, CREW
Thao tác này đòi hỏi thời gian thực hiện O(logn)
1.5.2 Mô phỏng ghi đồng thời
Giả sử chúng ta qui định rằng các bộ xử lý chỉ được phép ghi nếu các giá trị cần ghi trùng nhau Như vậy thao tác ghi đồng thời được tiến hành trên máy mô phỏng như sau :
1 Kiểm tra xem n giá trị cần ghi có trùng nhau không
2 Nếu trùng nhau thì tiến hành thao tác ghi Nếu không thì dừng
Thao tác 2 chỉ tốn thời gian cỡ hằng số Thao tác kiểm tra thứ nhất có thể diễn ra như sau, với aR i Rlà giá trị thứ i
Trang 81.6 Họ máy MIMD
Trong mục trên chúng ta đã xem xét họ máy SIMD, hay còn được gọi là PRAM Sau đây chúng ta xem xét một kiến trúc song song khác lớp máy MIMD Lớp này – phân làm 3 loại :
- Hệ đa xử lý với bộ nhớ phân tán
- Hệ đa xử lý dùng chung bộ nhớ
- Hệ đa xử lý với bộ nhớ dùng chung phân tán
1.6.1 Hệ đa xử lý với bộ nhớ phân tán (Multi processor system with
distributed memory)
- Đây chính là hệ song song gồm nhiều máy tính kết nối thành mạng (multicomputer system)
- Các bộ xử lý chỉ được quyền truy nhập vùng nhớ cục bộ của mình
- Liên kết giữa các bộ xử lý được thực hiện theo mô hình chuyển thông báo (message passing)
- Hệ thống có quy mô lớn, có thể lên tới hàng chục ngàn bộ xử lý Khi số bộ
xử lý quá lớn có thể làm cho đường truyền mạng trở nên quá tải
- Kỹ thuật lập trình khá phức tạp, tương ứng với các môi trường lập trình chuyển thông báo như PVM, MPI
- Còn được gọi dưới một tên khác là hệ NORMA (no remote memory access model : mô hình không cho phép truy cập vùng nhớ ở xa) Ta thấy mỗi bộ xử
lý có một vùng nhớ cục bộ riêng của mình (local memory) và chỉ được quyền
Trang 9truy nhập vào đó, và nó là vùng nhớ ở xa (remote memory) đối với các bộ
xử lý khác mà chúng không được quyền truy nhập vào đây
1.6.2 Hệ đa xử lý dùng chung bộ nhớ (Multi processor system with shared
memory)
- Đây là máy tính lớn với nhiều bộ xử lý (multi processor) hoạt động theo cơ chế đa xử lý đối xứng SMP (Symmetric multi processing)
- Các bộ xử lý có thể truy cập toàn bộ vùng nhớ dùng chung
- Liên lạc giữa các bộ xử lý được thực hiện thông qua vùng nhớ dùng chung Giả sử bộ xử lý PR 1 R muốn gửi dữ liệu cho PR 2 R, dữ liệu đó sẽ được ghi vào vùng nhớ dùng chung rồi báo địa chỉ cho PR 2 R PR 2 R sẽ đọc tại địa chỉ đó lấy dữ liệu
về
- Qui mô của hệ thống tương đối nhỏ, chỉ cỡ vài trăm bộ xử lý
- Kỹ thuật lập trình dễ dàng hơn so với mô hình trên
- Còn được gọi dưới một tên khác là UMA (uniform memory access model : quản lý và đánh địa chỉ toàn bộ vùng nhớ dùng chung theo một dạng địa chỉ thống nhất) Ta sẽ thấy hệ NUMA dưới đây tuy cũng quản lý được toàn bộ vùng nhớ dùng chung nhưng không dùng một mà dùng nhiều dạng địa chỉ
1.6.3 Hệ đa xử lý với bộ nhớ dùng chung phân tán
(Multi processor system with distributed shared memory)
Trang 10- Về mặt vật lý, mỗi bộ xử lý đều có một vùng nhớ cục bộ của mình
- Sự truy nhập tới các vùng nhớ khác được thực hiện nhờ các cơ chế truy nhập mạng Nhờ vậy tất cả các vùng nhớ cục bộ đều được gom lại và được đánh địa chỉ như một vùng nhớ logic duy nhất Các bộ xử lý đều có thể truy nhập mọi địa chỉ trong vùng nhớ chung đó
- Còn được gọi dưới một tên khác là hệ NUMA (non uniform memory access model - quản lý và đánh địa chỉ vùng nhớ dùng chung theo nhiều dạng địa chỉ) Ta thấy mỗi bộ xử lý, ngoài vùng nhớ cục bộ (local memory) của mình, còn có thể truy cập các vùng nhớ ở xa (remote memory : là vùng nhớ cục bộ của các bộ xử lý khác) Hai vùng nhớ này được quản lý theo hai chế độ địa chỉ khác nhau
1.7 Mạng liên kết
Như đã thấy trong những mô hình trên, các bộ xử lý được liên kết với nhau thông qua môi trường là mạng liên kết (interconnection network) Ở đây tôi không đi sâu vào phân tích mà chỉ liệt kê một số kiểu mạng liên kết cơ bản :
- Mạng liên kết đầy đủ : Mỗi cặp bộ xử lý bất kì được kết nối với nhau bởi một đường truyền Vùng nhớ chung được chia đều cho các bộ xử lý
- Mạng liên kết tuyến tính : Là mô hình đơn giản nhất, trong đó mỗi bộ xử lý
PR i R có hai láng giềng là PR i-1 R và PR i+1 R, các bộ xử lý đầu và cuối chỉ có một láng giềng Một đường truyền lần lượt chạy xuyên suốt qua các bộ xử lý
Trang 11- Mạng hai chiều : Còn được gọi là mô hình lưới trong đó các bộ xử lý PR ( , ) i j R
được bố trị tại các nút của một mạng lưới đường truyền Đặc trưng quan trọng của mô hình này là các đường nối có độ dài không đổi
- Mạng liên kết hình cây : Các bộ xử lý liên kết với nhau theo một mạng hình cây nhị phân, tỏa ra từ nút gốc Mỗi bộ xử lý nối trực tiếp với các bộ xử lý ở nút mẹ và hai nút con
- Mạng liên kết dịch chuyển đầy đủ (perfect shuffle connection) : Gọi n là số
bộ xử lý, bộ xử lý PR i R được nối với PR j Rtrong đó
/1
2
12/0
2
ninni
nii
j
- Mạng liên kết khối hộp (cube connection): Mỗi bộ xử lý có d láng giềng với
d là số chiều của liên kết
1.8 Ngôn ngữ mô tả thuật toán song song
Trang 121.9 Đánh giá độ phức tạp của thuật toán song song
Trong mục này chúng ta tham khảo các khái niệm liên quan đến độ phức tạp của thuật toán song song để làm cơ sở cho việc đánh giá và thiết kế các thuật toán song song hiệu quả Trong thuật toán tuần tự chúng ta chỉ quan tâm tới độ phức tạp về thời gian và không gian, nhưng trong thuật toán song song thường có thêm một số đại lượng đo lường khác Hơn nữa, độ phức tạp thời gian của thuật toán song song
Trang 13không chỉ đơn giản là việc đếm số câu lệnh cơ bản như trong thuật toán tuần tự mà thay vào đó nó phụ thuộc vào các phép toán cơ bản này có thể được thực hiện trên P (P > 1) bộ xử lý như thế nào Do vậy bên cạnh độ phức tạp thời gian, độ phức tạp về
số bộ xử lý cũng là một đại lượng quan trọng trong phân tích thuật toán song song Thiết kế thuật toán song song hiệu quả bao gồm việc lựa chọn cấu trúc dữ liệu phù hợp, phân bố bộ xử lý hợp lý và cuối cùng là thực hiện thuật toán tối ưu Ba đại lượng này tác động lẫn nhau như một tổ chức tính toán
1.9.1 Song song giới hạn và song song không giới hạn
Tương tự như thuật toán tuần tự, độ phức tạp thời gian của thuật toán song song cũng là một hàm của kích thước dữ liệu đầu vào – n Độ phức tạp thời gian là đại lượng quan trọng nhất của thuật toán song song bởi vì động cơ chính của song song
là nhằm tăng tốc thời gian tính toán
Độ phức tạp thời gian tồi nhất (hay đơn giản là độ phức tạp thời gian) của thuật toán song song giải quyết bài toán PR n R với kích thước đầu vào n là một hàm f n) cho (thời gian lớn nhất từ lúc bắt đầu thực hiện thuật toán trên một hay nhiều bộ xử lý đến lúc kết thúc thuật toán bởi một hay nhiều bộ xử lý với bất kỳ bộ dữ liệu nào Các thuật toán song song được thực hiện trên một tập các bộ xử lý nên nó bao gồm hai hoạt động khác nhau Một hoạt động tính toán (như các phép toán số học hay logic) được thực hiện một cách cục bộ trên một bộ xử lý, hoạt động khác là truyền dữ liệu giữa các bộ xử lý Trong thuật toán song song, một bước cơ bản là một tập các hoạt động cơ bản có thể được thực hiện một cách đồng thời bởi một tập các bộ xử lý độ phức tạp thời gian của một bước cơ bản là hằng số hay O(1) Độ – phức tạp thời gian của thuật toán song song được xác định bởi việc đếm số bước cơ bản và số bước chuyển giao dữ liệu, trong đó thời gian chuyển giao dữ liệu tại mỗi bước phụ thuộc vào mô hình liên kết giữa các bộ xử lý Một số tài liệu còn gọi độ phức tạp thời gian của thuật toán song song là độ sâu
oán
Độ phức tạp thời gian của thuật toán song song phụ thuộc vào mô hình tính t
và số lượng bộ xử lý sử dụng Vì thế, khi đưa ra độ phức tạp thời gian của thuật toán song song cần thiết đưa ra số lượng lớn nhất bộ xử lý cần sử dụng như một hàm của kích thước dữ liệu đầu vào , và gọi là độ phức tạp số bộ xử lý của thuật ntoán Cũng có thể biểu diễn độ phức tạp thời gian như một hàm của số bộ xử lý
Trang 14nhưng thường người ta sử dụng hai hàm riêng biệt Cho ví dụ, một thuật toán tuần
tự tìm giá trị lớn nhất trong một tập phần tử có độ phức tạp là O( ), vì nó đòi hỏi n n n – 1 phép so sánh Trong khi thuật toán song song tầm thường giải quyết bài toán đó
có độ phức tạp thời gian là O(log ) sử dụng O( ) bộ xử lý Tư tưởng của thuật toán n n
là : tìm giá trị lớn nhất trong từng cặp một cách đồng thời, tại mỗi bước số lượng phần tử còn lại để so sánh giảm đi một nửa Lặp đi lặp lại thủ tục này sẽ tìm được giá trị lớn nhất sau logn bước lặp song song Số lượng bộ xử lý lớn nhất được xác định bởi bước so sánh đầu tiên - /2 n
Việc tổng hợp và phân tích một thuật toán song song dưới mô hình có P bộ xử lý ( P là một số nguyên cố định và P > 1) được gọi là mô hình song song có giới hạn Ngược lại, mô hình song song không giới hạn là khi mà chúng ta có và được phép tùy ý sử dụng một số lượng bộ xử lý không giới hạn
Thuật toán song song thực hiện trên mô hình P bộ xử lý được gọi là P-song song Nếu thuật toán P song song giải bài toán kích thước đòi hỏi t( ) bước song - n nsong thì được gọi là P có thể tính trong thời gian Giả sử thuật toán song song A - t
có thể giải quyết bài toán kích thước n với P bộ xử lý Nếu tồn tại đa thức F sao cho
∀n , P F(n) , thì số lượng bộ xử lý được gọi là cận đa thức, ngược lại thì không có ≤cận đa thức
Thuật toán song song giới hạn là thích hợp trong thực tế Tuy nhiên, các thuật toán song song không giới hạn có một sự quan tâm lớn về mặt lý thuyết, vì từ đó chúng ta có các cận cho tính toán song song Và chúng ta không thể thiết kế một thuật toán song song tốt hơn cận này
Trên thực tế số lượng bộ xử lý là có giới hạn, nên thuật toán trên mô hình song song không giới hạn chỉ có thể sử dụng nếu chúng được chuyển thành thuật toán P-song song Có hai phương pháp đưa ra các phép chuyển đổi này : phân tách bài toán hoặc là phân tách thuật toán Ta có thuật toán song song A giải bài toán PR n R kích thước đầu vào trong thời gin an tR 1 R(n) sử dụng pR 1 R(n) bộ xử lý Giờ ta đi thiết kế thuật toán mới B giải bài toán PR n R trong thời gian t2 R R(n) sử dụng pR 2 R(n) bộ xử lý, trong đó
pR 2 R(n) < pR 1 R(n) Cách thứ nhất phân tách bài toán thành các bài toán nhỏ hơn với kích thước m m ( < n), mỗi bài toán được giải bởi thuật toán ban đầu với số lượng bộ xử
lý nhỏ hơn – p2(m) Cách thứ hai là phân tách một thuật toán, mỗi bước của nó
Trang 15được phân tách thành các bước nhỏ hơn theo một cách nào đó sao cho chúng được thực hiện với một số lượng bộ xử lý nhỏ hơn Một số kết quả được đưa ra tại tài liệu []
1.9.2 Cận trên và cận dưới
Trong phân tích thuật toán song song, ta cần xác định các đại lượng như cận trên và cận dưới của thời gian có thể giải quyết bài toán bởi một vài thuật toán được lựa chọn từ lớp các thuật toán đã cho Thuật toán song song nhanh nhất được biết để giải quyết bài toán cho ta cận trên của tính toán đó Nếu một ai đó thiết kế ra một thuật toán nhanh hơn thuật toán nhanh nhất trước đó để giải quyết cùng một bài toán thì chúng ta nói rằng cận trên mới đã được thiết lập cho việc tính toán lời giải của bài toán đó Cận dưới xác định độ phức tạp của bài toán, nghĩa là nó đưa ra lượng thời gian tối thiểu để giải quyết bài toán sử dụng một thuật toán song song tùy ý
Bài toán PR n R kích thước n được gọi là hữu hạn đối với lớp các thuật toán C, nếu tồn tại một thuật toán c C giải quyết P∈ R n R trong thời gian lớn nhất TR n R sao cho TR n R <
∝với n < ; ngược lại P∝ R n R được gọi là bài toán vô hạn đối với C Trên thực tế chúng
ta chỉ xét các bài toán hữu hạn
Sau đây là một ví dụ minh họa cho việc xác định cận dưới để giải quyết bài toán
có n đầu vào, một đầu ra, và chỉ bao hàm các phép toán nhị phân Rõ ràng để giải quyết bài toán thuật toán tuần tự cần 1 phép toán nhị phân Bây giờ ta cần xác n-định có bao nhiêu phép tính có thể thực hiện một cách song song Định nghĩa tập B(P) của cây nhị phân như sau :
(i) Cây chỉ có một nút đơn nằm trong B(P) và khi đó độ sâu của cây là 0 (ii) Cho một cây độ sâu d trong B(P), nếu chúng ta tăng tất cả các lá lên 1 và
thêm vào cả con trái và con phải nhiều nhất P lá với nhãn là 0 thì thu được cây mới nằm trong B(P) và có độ sâu (d+1)
(iii) Tất cả các cây trong B(P) thu được sử dụng (i) và (ii)
Trang 16Mỗi cây trong B(P) diễn tả một xử lý tính toán mà trong đó lá diễn tả toán hạng còn nút trong diễn tả các phép toán nhị phân Cây độ xâu trong B(P) tương ứng d với d bước song song với P bộ xử lý Hình 1.1 chỉ ra một ví dụ cây độ sâu 4 với số lượng lá lớn nhất nằm trong B(3)
Gọi N(P, ) là số lượng lá lớn nhất của cây độ xâu d d trong B(P), và t(P,n) là độ xâu tối thiểu của mọi cây trong B(P) có n lá Chúng ta có các công thức sau :
),
−
×+
min),
−+
(
Rõ ràng cần ít nhất t P, n) bước tính toán để đưa ra kết quả từ đầu vào sử dụng n
P bộ xử lý; vì thế cận dưới của bài toán là t P n( , ) Ví dụ với kích thước bài toán là n
= 12 và số lượng bộ xử lý là P = 3 thì cận dưới của số lượng bước song song là t(3,12) = 2 + 3 = 5 Hình 1.2 minh họa các xử lý tính toán cho cây độ xâu 5 trong B(3)
Trang 17Một cách tương tự Munro và Paterson (1973) đưa ra cận dưới của thời gian tính toán nhưng tổng quát hơn
Định lý 1.1 : Nếu tính toán một số X có đòi hỏi ít nhất phép toán, thì bất kì thuật x toán song song nào sử dụng P bộ xử lý cho việc tính toán X phải chứa đựng ít nhất
t(P, +1) bước x
Chứng minh định lý được nêu ra tại tài liệu []
1.9.3 Chi phí, tăng tốc, và hiệu quả của thuật toán song song
Tăng tốc và hiệu suất : Xét bài toán P, thuật toán tuần tự tốt nhất giải bài toán P có
thời gian tính là TR s R, thuật toán song song trên N bộ xử lý có thời gian tính là TR p R Khi đó :
Tăng tốc = TR s R/TR p
Hiệu suất = TR s R/(NTR p R) Giá trị tăng tốc luôn luôn nhỏ hơn số bộ xử lý và cố gắng đạt tới bằng nên hiệu suất tốt nhất là 1
Hiện tại có rất nhiều cách định nghĩa quan hệ giữa thời gian tính tuần tự và song song Có 5 định nghĩa khác nhau
- Tăng tốc tương đối
Trang 18Tăng tốc tương đối : Thời gian tính tuần tự được xác định như thời gian tính của
thuật toán song song thực hiện trên một máy Khi đó tăng tốc tương đối thu được từ thuật toán A để giải bài toán đầu vào kích thước sử dụng N bộ xử lý sẽ làn
Tăng tốc tương đối(n p, ) =
Tăng tốc thực tế : Thời gian nhanh nhất trong công thức tăng tốc được thay bằng
thời gian của thuật toán thường dùng nhất
Tăng tốc thực tế(n p, ) =
Tăng tốc tuyệt đối : Thời gian nhanh nhất trong công thức tăng tốc được thay bằng
thời gian tính của thuật toán tuần tự nhanh nhất trên máy tính tuần tự nhanh nhất Tăng tốc tuyệt đối(n p, ) =
Tăng tốc tiệm cận thực tế :
S(n) : Độ phức tạp tiệm cận của thuật toán tuần tự tốt nhất
P(n) : Độ phức tạp tiệm cận của thuật toán song song A với đủ số bộ xử lý
Tăng tốc tiệm cận thực tế =
Tăng tốc tiệm cận tương đối : Thay độ phức tạp tiệm cận của thuật toán tuần tự tốt
nhất bằng độ phức tạp tiệm cận của thuật toán song song chạy trên một bộ xử lý 1.9.4 Các kĩ thuật cho việc nâng cao hiệu quả của thuật toán song song
Khi thực hiện bất kì thuật toán song song nào luôn luôn có sự thỏa hiệp giữa thời gian tính toán và số lượng bộ xử lý được sử dụng Theo định lý 1.1, khi giảm số lượng bộ xử lý một thừa số thì sẽ nhân độ phức tạp thời gian một thừa số Vì thế chi phí và hiệu quả của thuật toán vẫn không thay đổi Tuy nhiên, trong một vài trường hợp, ta có thể phân bố lại tính toán trên các bộ xử lý để nâng cao hiệu quả của thuật toán Nâng cao hiệu quả thu được từ việc hoặc giảm số lượng bộ xử lý mà không
Trang 19làm tăng độ phức tạp thời gian hoặc giảm độ phức tạp thời gian mà không tăng số lượng bộ xử lý Sau đây là hai kỹ thuật tổng quát nhất
Giả sử số lượng bộ xử lý là P ≤ n/2 Bây giờ, để tính toán tổng tại cấp thấp nhất đòi hỏi thời gian nhiều nhất là n/2P Cấp tiếp theo đòi hỏi thời gian nhiều nhất là
n/4P , … Vì thế, thời gian đòi hỏi để tính tổng T thỏa mãn
))/((log
)/(log
2/1
4/12/1log
2/1
4/12/1
2/
4/2
/
log log log
PnnO
PnDnC
P
nn
Pn
PnPn
Pn
PnPn
T
n n n
+
=
×+
×
≤
++++
=
++++
++
=
+++
≤
trong đó C và D là các hằng số Vì thế, trong trường hợp này, thuật toán mất thời gian O(logn) nếu P = /log Chi phí của thuật toán này n n là logn n×( /log ) = n và hiệu nquả là 1 Nghĩa là, chúng ta đã giảm số lượng bộ xử lý mà không tăng độ phức tạp thời gian nghĩa là có một sự cải tiến trong chi phí và vì thế làm tăng hiệu quả của thuật toán
1.9.4.2 Giảm độ phức tạp thời gian
Xét lại bài toán tính tổng của dãy gồm số Chia dãy ban đầu ra thành các dãy con n nhỏ hơn với kích thước m và giao mỗi danh sách như thế cho một bộ xử lý tính toán Ta thu được n m/ giá trị sau thời gian O( ) Sau đó sử dụng mô hình cây nhị mphân để tính tổng của n m/ số này mất thời gian O(logn m/ ) Vì thế, độ phức tạp thời gian của toàn bộ thuật toán là T = O(m + log(n m/ )) Với m = log(n m/ ), nghĩa là = n
1.9.5 Độ phức tạp của bài toán
Dưới đây là mô hình phân lớp độ phức tạp của bài toán
Trang 20Từ trước tới nay xử lý song song được sử dụng chính cho việc tăng tốc thời gian thực hiện của bài toán P
Năm 1979, Niclaus Pippenger gợi ý rằng các bài toán P có thể song song một cách hiệu quả gồm các bài toán có thể giải quyết trong một chu kỳ thời gian là log của kích thước bài toán, nghĩa là T(p) = O(logP
k
Pn) với hằng số , sử dụng một số klượng đa thức bộ xử lý p = O(nl) Lớp bài toán này sau đó được đặt tên là lớp NC (Nick’s Class - NC) Lớp NC đã được nghiên cứu một cách rộng rãi và hình thành
lý thuyết độ phức tạp song song
Một hình thức yếu của lớp NC được chỉ ra như sau :
Bất kỳ thứ gì có thể tính được trên máy Turing sử dụng không gian cận đa thức trong thời gian không giới hạn có thể tính được trên một máy song song trong thời gian đa thức sử dụng số lượng không giới hạn số bộ xử lý và ngược lại Bài toán với lý thuyết này không giới hạn tài nguyên tính toán hơn là thời gian Ý nghĩa của NC, và tính phổ biến của nó, xuất phát từ việc thiết lập một cách đồng thời cận thời gian và nguồn tài nguyên
Hiện nay, câu hỏi NC = P là một bài toán mở của lý thuyết độ phức tạp song song Giống như câu hỏi P = NP vẫn chưa có ai biết câu trả lời tới câu hỏi này, nhưng có một sự nghi ngờ lớn là NC P Lý do đằng sau sự nghi ngờ này cũng ≠ tương tự như P NP Một bài toán P đầy đủ là một bài toán sao cho bất kỳ bài toán ≠ -
Trang 21thức bộ xử lý Vì thế, nếu thuật toán thời gian đa thức với số bộ xử lý đa thức tìm thấy cho bất kỳ bài toán P đầy đủ nào, thì tất cả các bài toán trong P có thể song -song một cách hiệu quả và NC = P Một số bài toán này đã được nghiên cứu trong vài năm gần đây
1.10 Một số mẫu thiết kế thuật toán song song
1.10.1 Mẫu cây nhị phân
Xét bài toán tính tổng của N số (nR 1 R, nR 2 R, ……., nR N R), trong đó N là lũy thừa của 2 Giả
sử dữ liệu nằm trên các lá của cây nhị phân có thể được thực hiện tính toán theo cách sau N/2 phần tử xử lý (Processing Elements PE) được giao nhiệm vụ tính - toán tổng các cặp dữ liệu, ví dụ (nR 1 R, nR 2 R), (nR 3 R, nR 4 R), …, (nR N-1 R, nR N R) Kết quả này có thể được thực hiện trong một bước tính toán Tiếp theo, N/4 phần tử xử lý thực hiện cùng công việc trên N/4 cặp dữ liệu, và v v Rõ ràng các tính toán tiến hành từ lá tới gốc và toàn bộ quá trình tính toán sẽ kết thúc khi mà phần tử xử lý tại gốc thực hiện xong tính toán của nó
Thuật toán Sum
Đầu vào : mảng A(1 n), n = 2P
Trang 22i A(i) = A(2i-1) + A(2i)
1.10.2 Phát triển bởi nhân đôi
Phương pháp phát triển bởi nhân đôi có thể được nhìn theo một cách khác Tại mỗi bước, mỗi phần tử xử lý nhân đôi số phần tử tính toán Vì thế “phát triển” thu được bởi nhân đôi số lượng dữ liệu tại mỗi bước Tất nhiên, có các cách khác nhau sử dụng kĩ thuật này, thậm chí đối với các bài toán không kết hợp với cấu trúc cây nhị phân Sau đây là một vài ví dụ
Xét bài toán xếp hạng danh sách (list ranking) : Cho một danh sách liên kết có N phần tử được lưu trong mảng A[1:N], hãy tính toán hạng của mỗi phần tử Hạng của mỗi phần tử trong danh sách là khoảng cách từ nó tới cuối danh sách Vì thế phần tử đầu tiên có hạng là N và phần tử cuối cùng có hạng là 1 Để giải bài toán này ta sử dụng kĩ thuật nhân đôi, chúng ta phân một bộ xử lý tới mỗi phần tử Ban đầu mỗi bộ
-xử lý chỉ biết hàng xóm bên phía phải của nó trong danh sách Tại bước đầu tiên, mỗi bộ xử lý tìm kiếm hàng xóm của hàng xóm của nó Nghĩa là, sau bước đầu tiên mỗi bộ xử lý biết được phần tử có khoảng cách tới nó là 2 Gọi Next(i) là phần tử xa nhất nằm phía phải phần tử thứ …Khởi tạo, next(i) là hàng xóm bên phải của i i ngoại trừ phần tử cuối cùng trong danh sách thì hàng xóm bên phải của nó là Nil Tại mỗi bước pR i Rcập nhật next( ) tới next(next( )) cho đến khi đạt tới cuối danh sách.i iNếu tại bước mỗi bộ xử lý biết phần tử cách nó là k x thì trong bước tiếp theo mỗi
Trang 23bộ xử lý biết phần tử cách nó 2 Vì thế xử lý nhân đôi đảm bảo rằng mỗi bộ xử lý x
sẽ đạt tới cuối danh sách trong nhiều nhất là logN bước và sẽ biết hạng của nó
Thuật toán xếp hạng trong danh sách
Input : A(1:n), link(1:n), head
Output : Rank(1:n)
Begin
1 For i = 1 to n dopar
Rank(i) = 1Next(i) = link(i) EndPar
2 For k = 1 to logn do
2.a For i = 1 to n dopar
if NEXT[i] <> 0 Rank(i) = Rank(i) + Rank(NEXT(i)) NEXT(i) = NEXT(NEXT(i))
endif EndPar End
Phân tích độ phức tạp
B1: O(n) bộ xử lý với thời gian O(1)
B2: Lặp lại O( ) lần, n
2.a O(n) bộ xử lý với thời gian O(1)
=> Thuật toán có độ phức tạp thời gian là O(logn) sử dụng O( ) bộ xử lý trên mô nhình EREW PRAM
Một ví dụ khác là bài toán tìm đường đi trên cây từ gốc tới mọi nút trong cây tổng quát biểu diễn bởi quan hệ cha con, nghĩa là mỗi nút ta biết cha của nó và kí hiệu là -parent(i) Với nút gốc thì parent(r) = r Với quan hệ cha con này thì kết thúc bước r -đầu tiên ta biết được cha (tổ tiên thứ nhất ) và cha của cha (tổ tiên thứ hai) của mọi nút Kết thúc bước thứ hai ta biết tổ tiên thứ nhất, thứ hai, thứ ba và thứ tư của mọi
Trang 24nút Rõ ràng nếu chiều cao của cây là thì chỉ cần h logh bướ c là ta thu được đường
đi trên cây từ gốc tới mọi nút Chương sau sẽ minh họa chi tiết kĩ thuật này
Cuối cùng ta xem xét các bài toán lý thuyết đồ thị ví dụ như tìm cây khung độ sâu tối thiểu, …hay đường đi ngắn nhất giữa mọi cặp nút Các bài toán như thế có thể được giải quyết bởi kỹ thuật nhân đôi cây khung cục bộ Chúng ta bắt đầu với các cây có gốc là một nút của đồ thị và chiều cao là 1 Nghĩa là, với mỗi nút x trong
đồ thị G tương ứng với một cây có gốc là x và chứa đựng tất cả các nút y sao cho ( , xy) là một cạnh trong đồ thị Rõ ràng danh sách kề của mỗi nút diễn tả một cây như thế Bây giờ với mỗi cây chúng ta thực hiện trộn tất cả các cây mà gốc của nó là một trong những nút nằm trong cây đang xét và sau đó xóa các nút xuất hiện nhiều lần trên cây (nếu có) Nếu lặp đi lặp lại thủ tục trộn cây thì sau nhiều nhất logn bước chúng ta sẽ có lời giải mong muốn của bài toán ( là số lượng nút trong G) n Hình sau minh họa cách xác định cây khung có chiều xâu tối thiểu cho đồ thị digraph
Chúng ta bắt đầu với các cây có gốc tại một nút trong G và có chiều cao là 1 (hình b) Sau khi trộn các cây theo cách diễn tả ở trên mà chưa xóa đi các nút xuất hiện lặp chúng ta thu được cây có nhiều cao là 2 hoặc ít hơn trong hình c Bây giờ nếu các nút giống nhau xuất hiện nhiều hơn một lần trên cây thì chúng ta xóa tất cả các nút trừ nút có khoảng cách tới gốc là tối thiểu (điều này để chắc chắn cây xây dựng
Trang 25đảm bảo thuộc tính độ sâu tối thiểu) Các cây phải được xóa đi trong hình c được đánh dấu là X Vì đồ thị G có 6 nút nên cần 3 bước trộn cây như thế Và cuối cùng
ta thu được cây khung tối thiểu có gốc 1 tại hình d
Tiến hành phân chia dữ liệu ta sẽ có thuật toán với độ phức tạp thời gian O(logn) với O(n/logn) bộ xử lý
+ Phân các phần tử của mảng vào n/log nnhóm; mỗi nhóm chứa log phần tửn
+ Phân mỗi nhóm cho một trong n/logn bộ xử lý
+ Thời gian cộng trên mỗi bộ xử lý là O(log ) và lưu kết quả cất vào Bn R i R Sau
đó sử dụng thuật toán trong mục 1 để tính tổng của BR 1 R, BR 2 R, …., BR n /log n R với thời gian O(log(n/log )) O(logn ≡ n) sử dụng O(n/logn) bộ xử lý
Thuật toán tính tổng tối ưu
Đầu vào : mảng A[1:n]
Đầu ra : tổng -> Sum
Begin
1 For i = 1 to n/logn dopar
i Sử dụng thuật toán tuần tự để tính tổng AR (i-1)logn+1 R… Ailogn R R và cất vào biến BR i
2 EndPar
Trang 26Kỹ thuật chia để trị bao gồm hai bước
Bước 1 : Chia bài toán thành các bài toán con và giải quyết một cách đồng thời Bước 2 : Kết hợp để thu được lời giải của bài toán cần giải
Trong kỹ thuật phân chia ta sẽ chú trọng hơn trong bước 1 hay ta chia bài toán thành các bài toán con mà không cần bước 2 Minh họa thuật toán thông qua bài toán trộn mảng
Bài toán trộn : Cho hai mảng A, B được sắp xếp theo thứ tự không giảm Trộn hai mảng và lưu vào mảng C sao cho các phần tử được sắp xếp theo thứ tự không giảm Giả thiết n = 2P
k
P; r = n/log n ; k, r ∈ N Thuật toán tuần tự có độ phức tạp O(n)
Sau đây ta đi thiết kế thuật toán phân chia cho bài toán trộn mảng
Phân chia mảng thành r nhóm = n/log ; mỗi nhóm có log phần tử Bây giờ ta sẽ n n tìm r số nguyên j(1), j(2), … , j r) sao cho (
Trang 27Ta sẽ phân bộ xử lý i (1 ≤ i≤ ) cho nhóm i của A và nhóm của B và nó sẽ thực r i hiện thuật toán trộn
Bước 2 : Độ phức tạp tại bước 2 là O(logn)
Bước 3 : Phụ thuộc mảng con của A, B : mảng A(( -1) +1:i ×k i k× ) gồm k phần tử ; còn số phần tử trong B (j i( -1)× +1: ×k i k) là không biết trước Nếu nó cũng là k thì thời gian của bước 3 là O(log ) Nếu nó lớn hơn thì thực hiện đệ qui chia B trước n k
A sau Nên độ phức tạp tại bước 3 là O(logn)
Tóm lại thuật toán có độ phức tạp thời gian là O(log ) với O(n n/logn) bộ xử lý trên
mô hình EREW PRAM
Trang 28CHƯƠNG 2 : MỘT SỐ THUẬT TOÁN SONG SONG CƠ BẢN
TRÊN ĐỒ THỊ
Lý thuyết đồ thị là một lĩnh vực nghiên cứu đã có từ lâu và có nhiều ứng dụng hiện
đại Những tư tưởng cơ bản của lý thuyết đồ thị được đề xuất vào những năm đầu
của thế kỷ 18 bởi nhà toán học lỗi lạc người Thụy sỹ Leonhard Euler Chính ông là
người đã sử dụng đồ thị để giải bài toán nổi tiếng về các cái cầu ở thành phố
Konigsberg
Đồ thị được sử dụng để giải các bài toán trong nhiều lĩnh vực khác nhau Chẳng
hạn, đồ thị có thể sử dụng để xác định các mạch vòng trong vấn đề giải tích mạch
điện Chúng ta có thể phân biệt các hợp chất hóa học hữu cơ khác nhau với cùng
công thức phân tử nhưng khác nhau về cấu trúc phân tử nhờ đồ thị Chúng ta có thể
xác định hai máy tính trong mạng có thể trao đổi thông tin được với nhau hay
không nhờ mô hình đồ thị của mạng máy tính Đồ thị có trọng số trên các cạnh có
thể sử dụng để giải quyết các bài toán như : Tìm đường đi ngắn nhất giữa hai thành
phố trong một mạng giao thông Chúng ta cũng còn sử dụng đồ thị để giải các bài
toán về lập lịch, thời khóa biểu, và phân bố tần số cho các trạm phát thanh và
truyền hình …
Vì thế thiết kế thuật toán đồ thị đã được nghiên cứu trong một thời gian dài và
đã có các thuật toán tuần tự hiệu quả để giải quyết một số bài toán trong lý thuyết
đồ thị Tuy nhiên khi kích thước đầu vào lớn thì thời gian thực hiện của một số bài
toán trong đồ thị là một vấn đề đáng bàn và khi đó cách tiếp cận hiệu quả là thuật
toán song song Có một số lượng lớn các báo cáo về thuật toán song song trên đồ
thị trong hơn hai mươi năm qua Mục đích của chương này là trình bày một số
thuật toán song song cơ bản trên đồ thị
2.1 Thuật toán trên đồ thị không có trọng số
2.1.1 Thuật toán trên cây
Cây là một trong những khái niệm cơ bản quan trọng nhất trong lý thuyết đồ thị Có
nhiều phép toán hữu ích được thực hiện trên cây Phép toán phổ biến nhất là duyệt
cây, nghĩa là ta thăm mỗi nút trên cây chính xác một lần theo một thứ tự nào đó
Đối với cây nhị phân có 3 phép duyệt phổ biến đó là duyệt theo thứ tự trước, duyệt
theo thứ tự giữa và duyệt theo thứ tự sau Còn với cây có thứ tự tổng quát có hai
phương pháp chính để duyệt, đó là duyệt theo thứ tự trước và duyệt theo thứ tự sau
Trong phép duyệt theo thứ tự trước thì một nút sẽ được thăm trước khi thăm các con
của nó, còn trong thứ tự sau thì nút được thăm sau khi đã thăm tất cả các con của
Trang 29nó Sau khi hoàn tất quá trình duyệt, các nút trên cây được đánh chỉ số (hoặc sắp xếp) để biểu diễn thứ tự nút trong phép duyệt đó Thông thường, phép duyệt theo thứ tự trước và duyệt theo thứ tự sau của một cây được định nghĩa như duyệt cây nhị phân tương ứng theo cách sau
Duyệt theo thứ tự trước
• Xử lý nút gốc
• Duyệt con trái theo thứ tự trước
• Duyệt con phải theo thứ tự trước
Duyệt theo thứ tự sau
• Duyệt con trái theo thứ tự sau
• Duyệt con phải theo thứ tự sau
• Xử lý nút gốc
(Cận dưới của thời gian tính cho phép duyệt trên một cây có n nút là Ω n), vì theo định nghĩa mỗi nút chỉ được thăm một lần Tồn tại thuật toán tuần tự tối ưu cho các bài toán duyệt này (xem Horowitz and Sahni 1977) Có hai cách tiếp cận để thực hiện duyệt trên cây có thứ tự tổng quát Cách thứ nhất là chuyển cây có thứ tự tổng quát sang cây nhị phân tương đương và sau đó áp dụng thuật toán duyệt trên cây nhị phân đó Cách khác là duyệt ngay trên cây có thứ tự tổng quát mà không phải chuyển đổi sang cây nhị phân tương đương Trong mục này chúng ta sẽ tìm hiểu cả hai cách tiếp cận Đầu tiên chúng ta diễn tả thuật toán song song để sinh ra cây nhị phân từ một cây có thứ tự tổng quát Sau đó thực hiện duyệt song song trên cây nhị phân tương đương đó Mô hình tính toán được sử dụng cho tất cả các thuật toán là Crew Pram, trừ một vài trường hợp cụ thể
2.1.1.1 Biến đổi cây tổng quát sang cây nhị phân tương đương
Cây có một nút đặc biệt r – gọi là gốc của cây và được ký hiệu là cây T( ) Giả sử rtất cả các nút trên cây có thứ tự tổng quát được đánh số tùy ý từ 1 tới n Vì cây là trường hợp đặc biệt của đồ thị, nên có thể định nghĩa cây T(r) = <N, E>, trong đó N
là tập nút và |N| = , còn E là tập cạnh và |E| = n n-1
Trang 30Giả sử cây có thứ tự tổng quát được diễn tả bởi quan hệ cha con Nghĩa là, với mỗi nút i ∈ N, nút cha của được định nghĩa là parent(i i) Và nút j là con của nút i được kí hiệu bởi child( ), nghĩa là parent(i j) = i Để thu được một cây nhị phân tương đương chúng ta cần một mối quan hệ giữa các nút sao cho số quan hệ tại mỗi nút nhiều nhất là 2 Đó là quan hệ con cực trái em kề phải Mọi nút có nhiều nhất một -con cực trái và một em kề phải Ví dụ trên hình 2.1, con cực trái của nút 2 là nút 8
và em kề phải là nút 5 Vì con cực trái và em kề phải của mỗi nút phụ thuộc vào cây được vẽ như thế nào, trong cây được vẽ như trên thì con của mỗi nút i ∈ N giả sử được sắp xếp theo thứ tự tăng dần Vì thế, con có chỉ số thấp nhất là con cực trái của nút i Em kề phải nút i là một nút j child(parent(∈ i)) có chỉ số tiếp ngay sau i Sử dụng mối quan hệ đó, cây tổng quát trong hình 2.1 có thể được chuyển thành cây nhị phân tương đương như trong hình 2.2
Không mất tính tổng quát, gọi con cực trái và em kế phải của mọi nút trên cây có thứ tự tổng quát là con trái và con phải trên cây nhị phân tương đương
Trang 31Định nghĩa 2.1: Con trái, con phải, và cha của tập các nút trên cây có thứ tự tổng
quát được định nghĩa như sau :
(i) Leftchild(i) = j; nếu j = min {k | parent(k) = i}
=∅; nếu ngược lại
(ii) righchild(i) =j; Nếu j = min {k | k > i và parent(k) = parent(i)}
=∅; nếu ngược lại
(iii) father(i) = parent(i), Nếu rightchild(i) = ∅
=∅; nếu ngược lại
Chi tiết thuật toán song song sinh ra cây nhị phân tương đương của cây có thứ tự tổng quát được mô tả tại mục 1 trong phần phụ lục Thuật toán xác định các giá trị leftchild, rightchild, và father cho mỗi nút của cây Thuật toán thu được bởi việc song song hóa phương pháp tuần tự tương ứng (Horowitz anh Sahni 1977) với độ phức tạp thời gian là O(log ) sử dụng O( ) bộ xử lý.n n
Trang 322.1.1.2 Duyệt cây nhị phân
Tiếp theo chúng ta xem xét cách thiết kế thuật toán song song cho phép duyệt cây nhị phân theo thứ tự trước Giả sử cây nhị phân được diễn tả bởi mối quan hệ con trái, con phải và cha (father) Nếu chỉ có mối quan hệ con trái và con phải tại mỗi nút thì ta có thể thu được quan hệ cha bằng việc kiểm tra con phải của nút i và thiết lập father( ) bằng parent( ) nếu rightchild( ) là rỗng và thiết lập i i i ∅ nếu ngược lại Để duyệt cây có thứ tự tổng quát, đầu tiên chúng ta áp dụng thuật toán CREW_EQUIVALENT_BINARY để thu được cây nhị phân tương đương được diễn tả bởi con trái, con phải và cha, sau đó áp dụng thuật toán duyệt trên cây nhị
phân này Ý tưởng cơ bản trong phép duyệt cây nhị phân theo thứ tự trước là nếu
tồn tại con trái thì nó sẽ xuất hiện tiếp ngay sau nút i trong danh sách duyệt Ngược lại con phải của i sẽ là nút tiếp theo sau i Nếu nút i không có cả con trái và con phải thì để thu được nút tiếp theo được thăm trong thứ tự trước, ta đi xác định tổ tiên gần nhất của nút i có con phải ( giả sử là nút j ) Và khi đó con phải của nút j đi ngay sau nút i trong thứ tự duyệt Vì thế, nếu một nút có hoặc con trái hoặc con phải
thì công việc rất đơn giản Nhưng, nếu nó không có cả hai thì chúng ta phải đi xác định tổ tiên gần nhất có con phải, và đó là công việc không đơn giản Để tìm tổ tiên gần nhất có con phải chúng ta khai thác mối quan hệ cha của mỗi nút Cụ thể, chúng
ta áp dụng một phép gấp ngược trên quan hệ cha, nghĩa là quan hệ cha được truyền
Trang 33ngược về phía gốc của cây, bằng việc sử dụng kĩ thuật "phát triển bởi nhân đôi" Thuật toán có độ phức tạp thời gian là O(log ) với O( ) bộ xử lý.n n
Chi tiết thuật toán và đánh giá độ phức tạp được mô tả tại mục 2 trong phần phụ lục
2.1.1.3 Duyệt cây có thứ tự tổng quát
Mục trên ta đã tìm hiểu cách tiếp cận duyệt cây có thứ tự tổng quát bằng việc sử dụng thuật toán CREW_EQUIVALENT_BINARY để chuyển cây đó sang cây nhị phân tương đương, và sau đó áp dụng thuật toán duyệt trên cây nhị phân này Sau đây chúng ta sẽ xem xét phương pháp mà không cần chuyển nó sang hình thức cây nhị phân tương đương
Cây có thứ tự tổng quát tương ứng với mảng AP
Trang 34(i) trong thời gian O(logn)
Thuật toán ANCESTOR_ARRAY
Đầu vào : parent(i)
Đầu ra : mảng AP
j
P(i), 1 ≤ i ≤ n, 0 ≤ j ≤ n-1 for i = 1 to n dopar
Rõ ràng vòng lặp for song song đầu tiên chạy trong thời gian O(1) với O( ) bộ n
xử lý Thân của vòng lặp for thứ hai bao gồm hai vòng for song song lồng nhau có
độ phức tạp O(1) với O(nP
Trang 35Định lý 2.1: Trên cây T(r) thứ tự nút i ∈ N trong phép duyệt theo thứ tự trước có
thể được tính toán như sau
−
=
r i ANC u
ilevelu
rankuparentNDES
i
pre
)
1)()
1)(),((
)
(
Trong đó
- NDES(i, j) là số hậu duệ của j con đầu tiên của i ∈ N ( một nút là một
hậu duệ của chính nó)
- rank(i) là vị trí của nút i ∈ N, nghĩa là vị trí của nó trong số tất cả các
anh em của nó (những nút có cùng cha)
- ANC(i) : Là tập tổ tiên của i ∈ N (một nút là tổ liên của chính nó)
Chi tiết thuật toán được trình bày tại mục 3 phần phụ lục Thuật toán có độ phức tạp thời gian là O(log ) sử dụng O(n nP
2
P) bộ xử lý
2.1.1.4 Tổ tiên chung gần nhất (Nearest Common Ancestor - NCA)
Một trong những hàm hữu dụng nhất trên cây là xác định tổ tiên chung gần nhất của một cặp nút bất kỳ NCA có những ứng dụng trong việc giải quyết các bài toán lý thuyết đồ thị khác như tìm tâm và median của cây hay tìm tập chu trình cơ bản của
đồ thị vô hướng
Định nghĩa 2.4: y và z là một cặp nút trong cây T(r) = <N, E>, tập các nút {xR i R | i =
1, 2, …., k} được định nghĩa là tập tổ tiên chung khi và chỉ khi tồn tại các đường đi trên cây từ xR i Rtới y và từ xi R Rtới z, với mỗi = 1, 2, …, k Nghĩa là xi i R Rlà tổ tiên của cả y
và z
Định nghĩa 2.5: Tổ tiên chung x của cặp nút y, z trong cây T(r) được định nghĩa là
tổ tiên chung gần nhất, kí hiệu là NCA(y z, ), khi và chỉ khi trong phép duyệt theo thứ tự trước trên cây T( ) mọi tổ tiên chung r u ≠ của yx và z được thăm trước khi thăm , nghĩa là mọi tổ tiên chung x u {∈ xR i R | i = 1, 2, …., k} - {x} của x là tổ tiên của {x}
Ví dụ xét cây trên hình 2.1, NCA(7,3) = 2, NCA(7,12) = 4 và NCA(7,8) = 8 Ý
tưởng cơ bản của thuật toán song song cho việc tìm kiếm NCA(y,z), ∀y, z ∈ N được
cho như sau Đầu tiên tính toán mảng DEPTH[1:n, 0:L] (như trong thuật toán
CREW_PREORDER-TRAVERSAL) cho cây T(r) Khi đó với mọi cặp nút y, z ∈ N ,
Trang 36NCA(y,z) được tính toán bởi công thức sau :
2.1.1.5 Tâm và median của cây
Tâm và median của cây cung cấp cho chúng ta những thông tin hữu ích về hình học topo của cây Bằng trực giác, nếu nút là tâm của cây, thì có nghĩa là nút x x được xác định một cách trung tâm hơn bất cứ nút nào khác trên cây Trước khi đưa ra một định nghĩa hình thức về tâm và median của cây, ta đưa ra một số kí hiệu
; Khoảng cách giữa hai nút i và j i, j ∈ N trong cây T(r) = <N, E> là số cạnh giữa
i và và được kí hiệu bởi d( , ) ( d( , ) = 0 ∀ j i j i i i ∈ N) Chỉ số ngăn cách s( ) của một inút trên cây là khoảng cách từ tới nút xa i i nhất trên cây T( ) Nghĩa là :r
t
1
),()
j
nkj
kdj
m
d
1 1
1);
,()
,(
được định nghĩa là median của T(r)
Thuật toán xác định tâm và median của cây sử dụng tổ tiên chung gần nhất, NCA(i,
j), ∀ , i j∈ N Chi tiết thuật toán được trình bày tại mục 5 phần phụ lục
Trang 372.1.2 Tìm kiếm trên đồ thị
Bài toán tìm kiếm đồ thị là quan trọng và là cơ sở cho nhiều thuật toán đồ thị khác Các kĩ thuật tìm kiếm đồ thị cơ bản là : Tìm kiếm theo chiều xâu (Depth First Search - DFS), tìm kiếm theo chiều rộng ( Breadth First Search - BFS)
Với DFS, tìm kiếm bắt đầu bằng việc thăm một nút tùy ý trên đồ thị đã cho Một cách tổng quát, nếu là nút được thăm gần đây nhất thì tìm kiếm được tiếp tục bằng u cách lựa chọn cạnh (u v, ) và thăm nếu chưa được thăm trước đó, ngược lại nếu v v v
đã được thăm thì tìm kiếm tiếp tục tại với một cạnh khác Sau khi hoàn thành việc u tìm kiếm trên tất cả các cạnh liên thuộc với , tìm kiếm được tiếp tục tại một nút u w
mà u đã thăm Giữ dấu vết của các cạnh dẫn tới một nút mới trong quá trình tìm kiếm cho ta một cây khung có gốc tại nút bắt đầu và được gọi là cây khung DFS BFS trên một đồ thị cũng bắt đầu thăm một nút tùy ý, gọi là Sau khi thăm r r ta thăm tất cả các nút có khoảng cách tới là 1 Tiếp theo thăm tất cả các nút có r khoảng cách tới là 2 v…v cho tới khi toàn bộ đồ thị được xử lý Vì thế, tìm kiếm r bắt đầu tại nút tiếp tục cho đến khi tất cả các cạnh chưa được thăm liên thuộc với u
u đã được kiểm tra Sau khi hoàn tất kiểm tra tất cả các cạnh liên thuộc u thì tìm kiếm được bắt đầu tại một nút kề cùng cấp nếu có Ngược lại, thì xử lý tại các nút trên bậc tiếp theo Giữ dấu vết các cạnh dẫn tới một nút mới trong quá trình tìm kiếm mang lại một cây khung với gốc là nút bắt đầu , gọi là cây khungr BFS (BFST)
Trang 38Cây khung thu được bởi áp dụng hai kĩ thuật tìm kiếm này trên đồ thị 2.6(a) được chỉ ra trong hình 2.6(b) (c) Có các thuật toán tuần tự chuẩn cho 2 kĩ thuật tìm kiếm -với độ phức tạp O(n e+ ) Dễ dàng nhận được độ phức tạp này, từ định nghĩa bậc của một nút i là deg(i), chúng ta có thể biểu diễn cận dưới của thời gian tính toán như sau
∑
≤
+
=+
=n i
T1
2)1)(deg(
Sau đây chúng ta sẽ tìm hiểu 2 kĩ thuật tìm kiếm trong môi trường song song Các thuật toán phát triển dựa trên mô hình "phát triển bởi nhân đôi" và vì thế có cùng một cấu trúc
2.1.2.1 Tìm kiếm theo chiều sâu (DFS)
Tìm kiếm theo chiều sâu là kĩ thuật phổ biến và có nhiều ứng dụng Nhưng DFS vốn cố hữu tuần tự vì tìm kiếm xảy ra dọc theo một cạnh đơn từ một nút đơn vì thế giới hạn khả năng song song hóa Bài toán DFS đã được nghiên cứu bởi Ecktein và Alton (1977), và Reghbati và Corneil (1978) trên mô hình Crew Pram mà không có nhiều thành công Sau đó Reif đã chứng minh rằng tìm kiếm theo chiều sâu trên đồ thị không thể đạt tới thời gian đa thức, nghĩa là O(logP
c
Pn), với c 1 Nhưng đó là ≥ trường hợp với đồ thị tổng quát, chúng ta sẽ chỉ ra rằng có thể thiết kế một thuật toán song song nhanh cho DFS của đồ thị a chu trình có hướng (DAGs) DAGs là -một lớp đồ thị không có chu trình Sau đây chúng ta diễn tả một thuật toán tìm kiếm theo chiều sâu trên đồ thị DAGs trên mô hình Crew Pram Kĩ thuật sẽ sử dụng là
"phát triển bởi nhân đôi" mà cụ thể là "nhân đôi cây khung cục bộ" một mô hình - hữu ích cho thiết kế thuật toán song song
Cho DGA G = <N, E> Không mất tính tổng quát, giả sử tập đỉnh N là {1, 2, 3
…, n} Nếu ( , j ∈ E thì i được gọi là đỉnh ngay trước trong G Nếu tồn tại một i ) j đường đi có hướng từ tới i j thì ta nói j có thể được đạt tới từ i; hay icó thể đạt tới j
Định nghĩa 2.8 : Cho một DGA G = <N, E>, một cây có gốc tại nút x x ∈ N) chứa (
Trang 39dài nhỏ hơn hoặc bằng 2P
Định nghĩa 2.9 : Cho một cặp nút y và z y ≠ z) trong cây tree T( ( k- x, k) sao cho (y,
z) là một cạnh trong DAG nhưng ( , ) không thuộc T( , ), thì cây -tree T( , ) y z x k k x kđược gọi là bảo đảm thuộc tính DFS nếu thỏa mãn một trong những điều kiện sau (i) Post( y | T(x, k)) > Post(z | T(x, k))
(ii) Đường đi từ x tới y trên T(x, k) bao gồm 2P
Trang 40Cha và thứ tự trước của nút y trên cây k-tree T(x, k) được định nghĩa bởi parent(y | T(x, k)) và pre(y | T( , k)) Giả sử cây đầu vào là T(xx ,0), x= 1, 2, …, n và tồn tại nút
s ∈ N sao cho có một đường đi từ stới mọi nút khác của DAG Thuật toán dựa trên
ý tưởng sau Đầu tiên với mỗi x ∈ N, tất cả các cây T(y,0), y ∈ T(x,0) được trộn với
cây T(x,0) để đưa ra một cây mới T(x,1) Xử lý trộn cây được lặp lại logn lần,
cuối cùng đưa ra cây T(x, logn) cho mỗi x ∈ N để T(s, logn) là một DFST mong muốn của G Tại bất kì giai đoạn k nào, cây T(x,k) thu được từ các cây T(x,k-1) và
các cây T(y,k-1), y ∈ T(x,k 1), 0 < k - ≤logn đảm bảo thuộc tính DFS
Chi tiết thuật toán được trình bày tại mục 6 phần phụ lục Thuật toán có độ phức tạp thời gian là O(logP
2
Pn) sử dụng O(nP 2
P
n/logn)
2.1.2.2 Tìm kiếm theo chiều rộng
Tìm kiếm theo chiều rộng là một kĩ thuật tìm kiếm tốt trong môi trường song song
Ta có thể tìm kiếm trên một đồ thị sử dụng BFS dọc theo tất cả các cạnh của một nút bằng việc thăm tất cả con của nút một cách đồng thời Do đó ta có thể thấy rằng BFS của đồ thị tổng quát có thể được thực hiện trong thời gian log trên mô hình Crew Pram Thuật toán được phát triển bởi cách mô tả thuộc tính BFS theo cách tương tự như đã mô tả đặc tính DFS trong mục trước
Để thuận lợi, giả sử G = <N, E> là một digraph Một đồ thị vô hướng có thể được xem như một digraph tương đương với mỗi cạnh (i j, ) của đồ thị vô hướng được thay bởi hai cạnh có hướng ngược nhau (i j, ) và ( , j i) Chúng ta chỉ cần thay
"DAG" bằng "digraph" trong định nghĩa 2.8 Một bfs được gọi là một cây k- tree khi và chỉ khi bảo đảm được thuộc tính BFS được định nghĩa như sau :
k-bfs-Định nghĩa 2.10: Gọi y và z y ≠ z ( ) là một cặp nút trong cây tree T(x, k x ∈ N k- ), Gọi thứ tự duyệt BFS của z trong T( , x k) được định nghĩa bởi bfs(z | T( , x k)) Giả sử rằng parent(z|T( , )) x k ≠ và bfs(parent(y z|T(x, k))) > bfs(parent(y|T( , kx ))), cây T(x, k) được gọi là bảo đảm thuộc tính BFS nếu không có cạnh (y z, ) ∈ E trong G
Một digraph với n = 6 và cây 2-bfs-tree T(1,2) được chỉ ra trong hình 2.8
Giả sử cây T(x, 0), ∀ x∈ N có giá trị như đầu vào Thuật toán dựa trên một ý tưởng trộn cây tương tự như đã sử dụng cho DFS của DAGs Trong trường hợp này, tại
mọi bước k, 0 < k ≤ logn, của xử lý trộn cây, chúng ta phải đảm bảo rằng thuộc