Phân chia một cơng việc tính tốn thành các phần nhỏ hơn và ánh xạ chúng vào các bộ xử lý khác nhau để thực hiện song song là 2 bước cơ bản trong vịêc thiết kế một thuật tĩan song song.
2.4.2.1. Một số phương pháp phân hoạch
Một trong những bước cơ bản mà chúng ta cần làm để giải quyết một vấn
đề theo hướng song song là phân chia những phép tính tốn muốn thực hiện thành mơt tập hợp các tác vụ nhỏ hơn để xử lý đồng thời như trong đồ thị phụ thuộc tác vụ. Trong phần này chúng ta sẽ mơ tả một vài kỹ thuật phân họach phổ biến cho xử lý đồng hành. Các kỹ thuật này khơng phải là tất cả các kỹ thuật phân họach cĩ thể cĩ. Thêm vào đĩ, những phương pháp phân họach ở đây khơng bảo đảm sẽ
dẫn tới những thuật tốn song song tốt nhất cho một vấn đề nào đĩ. Mặc dù cịn một vài thiếu sĩt, nhưng các kỹ thuật phân họach được đề cập trong phần này là
điểm bắt đầu tốt cho nhiều vấn đề và một hay nhiều sự kết hơp của các kỹ thuật này cĩ thểđược dùng để đạt được các phân họach hiệu quả cho rất nhiều lọai vấn
đề.
Các kỹ thuật phân họach phân họach ở đây cĩ thể phân thành các lọai sau
phân họach đệ quy, phân họach dữ liệu, phân họach thăm dị và phân họach suy đĩan. Trong đĩ phân họach đệ quy và phân họach dữ liệu được dùng cho nhiều lọai vấn đề cịn các phương pháp phân họach khác chỉ được sử dụng cho một lọai vấn đề cụ thể nào đĩ.
• Phân họach đệ quy
Phân họach đệ quy là một phương pháp dùng để tạo ra sự đồng hành trong những vấn đề cĩ thểđược giải quyết bằng phương pháp chia-và-trị. Trong kỹ thuật này trước tiên một vấn đề được giải quyết bằng cách phân chia nĩ thành tập hợp các vấn đề con độc lập với nhau. Đến phiên các vấn đề con lại tiếp tục áp dụng cách thức phân họach đệ quy thành các vấn đề con khác nhỏ hơn. Cuối cùng là
http://etrithuc.vn
chúng ta sẽ thực thi đồng hành các vấn đề con độc lập này, kết quả của vấn đề lớn là sự kết hợp kết quả của các vấn đề con nhỏ hơn.
• Phân hoạch dữ liệu
Phân họach theo dữ liệu là một phương pháp phân hoạch hiệu quả và được sử dụng nhiều nhất trong việc xác định tính đồng hành trong các thuật tốn để cĩ thể thao tác trên các cấu trúc dữ liệu lớn. Phương pháp này bao gồm 2 bước. Trong bước 1, dữ liệu trong bước tính tĩan sẽ được phân ra thành từng phần, và trong bước 2, phần dữ liệu này sẽđược chuyển thành các tác vụ. Những thao tác mà các tác vụ thực hiện trên các phần dữ liệu khác nhau thường là tương tự nhau hay
được chọn từ tập hợp các thao tác nhỏ hơn.
Chúng ta sẽ xem xét cụ thể các cách phân chia dữ liệu cĩ thể ở phần bên dưới. Nhìn chung, thì người thiết kế phải tự tìm ra và đánh giá các cách phân chia dữ liệu để quyết định xem cách nào phân họach “tự nhiên” và hiệu quả nhất.
Phân chia dữ liệu xuất
Trong nhiều phần tính tốn, từng phần xuất cĩ thể được xử lý độc lập với các phần khác. Trong nhiều phần tính tốn như vậy, việc phân chia dữ liệu xuất tự động dẫn đến việc phân họach những vấn đề thành các tác vụ, với mỗi tác vụđược kết gán cho cơng việc tính tốn một phần của kết quả xuất.
vd: nhân ma trận
Hãy xem vấn đề nhân 2 ma trận nxn A và B, kết quả trả về là ma trận C. Trước tiên ta phân từng ma trận thành 4 khối hay ma trận con, bằng cách chia các chiều của ma trận theo 1 nửa. 4 ma trận con của ma trận kết quả C, mỗi phần cĩ kích thước n/2 x n/2, cĩ thểđược tính tĩan độc lập với nhau bởi 4 tác vụ.
http://etrithuc.vn
Hình 2-10 : (a) Phân các ma trận nhập và xuất thành các ma trận con (b) Phân hoạch phép nhân ma trận thành 4 tác vụ
Hầu hết các thuật tốn ma trận, bao gồm nhận ma trận với vector và nhân ma trận với ma trận, cĩ thể được cơng thức hĩa thành các thao tác trên khối ma trận. Trong các cơng thức này, từng ma trận được xem như bao gồm các khối hay các ma trận con, các phép tính tốn được thực hiện trên từng phần tử và được thay thế tương ứng bởi các phép tĩan trên các khối ma trận con. Kết quả cĩ được trên từng phần tử hay trên các khối là tương tự nhau. Thuật tốn ma trận khối thường
được dùng để hỗ trợ cho việc phân họach.
Chúng ta phải chú ý là phân họach theo dữ liệu khác với phân họach các phép tính thành các tác vụ. Mặc dù 2 khái niệm này thường cĩ liên hệ với nhau, và cái đầu thường hỗ trợ cho cái sau, một kết quả phân họach dữ liệu đã cho khơng chỉ cĩ một cách để phân chúng thành các tác vụ.
Phân chia dữ liệu nhập
Phân chia theo dữ liệu xuất chỉ cĩ thểđược thực hiện nếu từng kết quả xuất cĩ thể được tính tốn một cách tự nhiên theo chức năng nhập. Trong nhiều thuật tốn, việc phân chia theo dữ liệu xuất là điều khơng thể. Ví dụ như khi tìm giá trị
http://etrithuc.vn
trước. Trong các thuật tốn sắp xếp, từng phần tử riêng biệt của kết quả khơng thế được xác định một cách hiệu quả. Trong những trường hợp như vậy, việc phân chia theo dữ liệu nhập là hồn tồn cĩ thể, và sau đĩ dùng kết quả này để thực hiện đồng thời việc tính tốn. Từng tác vụđược tạo ra cho từng phần dữ liệu nhập và tác vụ này sẽ sử dụng tối đa các phép tính cĩ thể thực hiện trên các dữ liệu cục bộ này. Lưu ý là những giải pháp cho các tác vụ được đúc kết từ dữ liệu nhập cĩ thể khơng giải quyết được một cách trực tiếp vấn đề gốc. Trong những trường hợp như vậy, thì kết quả tính tốn cĩ thể được thực hiện bằng cách “nổi bọt” lên phía trên.Ví dụ như khi tìm tổng của một chuỗi gồm N số dùng p tiến trình (p < N), chúng ta cĩ thể phân chia phần dữ liệu nhập thành p phần con (cĩ kích thước gần bằng nhau). Từng tác vụ thực hiện cộng các số trong từng phần con. Kết quả cuối cùng là cộng của p phần con vừa được tính.
Phân chia cả dữ liệu xuất và nhập
Trong nhiều trường hợp việc phân chia theo cả kết quả xuất và dữ liệu nhập cĩ thể làm tăng khả năng xử lý đồng thời.
Phân chia dữ liệu trung gian
Các thuật tốn thường cĩ dạng xử lý gồm nhiều giai đọan khác nhau, trong
đĩ kết quả xuất của giai đọan này là kết quả nhập của giai đọan theo sau nĩ. Quá trình phân họach cho những thuật tốn như vậy cĩ thể được thực hiện bằng cách phân chia theo dữ liệu nhập hay theo dữ liệu xuất của một giai đọan trung gian. Phân chia theo dữ liệu trung gian đơi khi dẫn tới khả năng xử lý đồng thời cao hơn so với khi thực hiện trên dữ liệu nhập hay xuất. Thơng thường trong giải quyết một vấn đề nào đĩ thì dữ liệu trung gian khơng được phát sinh một cách tường minh và trong khi cấu trúc lại các thuật tĩan ban đầu người ta cĩ thể cần đến dữ
liệu trung gian để tạo ra sự phân họach.
vd: như trong ví dụ nhân ma trận bên trên, ta cĩ thể gia tăng khả năng tính tĩan song song bằng cách đưa ra một bước trung gian mà trong đĩ cĩ 8 tác vụ thực
http://etrithuc.vn
hiện tính tốn các ma trận con tương ứng của chúng rồi lưu kết quả trong một ma trận 3 chiều D. Ma trận con Dk,i,j là kết quả của việc nhân Ai,k và Bk,j.
Hình 2-11 : Nhân hai ma trận A và B với phần trung gian là ma trận D Việc phân chia thành ma trận trung gian D dẫn đến phân hoạch thành 8 tác vụ. Sau bước nhân, ta thực hiện cộng các ma trận kết quả con (chi phí khơng cao) thành ma trận C. Tất cả các ma trận con D*,i,j được cộng lại với nhau để tạo thành Ci,j. 8 tác vụ (đánh số từ 1-8) thực hiện việc nhân các ma trận con của A và B cĩ kích thước n/2 x n/2 với chi phí là O(n3/8). Sau đĩ 4 tác vụ (đánh số từ 9-12) thực hiện cộng các ma trận con trung gian D thành ma trận kết quả C với chi phí là (n2/8).
http://etrithuc.vn
Hình 2-12 : Phân họach bài tốn nhân ma trận theo ma trận trung gian 3- chiều
• Phân hoạch thăm dị
Phân họach thăm dị được dùng để phân họach những vấn đề mà cĩ nội dung tính tốn tương ứng với một khơng gian tìm kiếm của những giải pháp. Trong phân họach thăm dị, chúng ta phân chia khơng gian tìm kiếm thành nhiều
http://etrithuc.vn
phần nhỏ hơn, và thực hiện tìm kiếm trên từng phần đồng thời với nhau, cho đến khi tìm ra giải pháp cần tìm.
Lưu ý là mặc dù phân hoạch thăm dị trơng cĩ vẻ tương tự như phân hoạch dữ liệu (khơng gian tìm kiếm cĩ thể được xem như là dữ liệu được phân chia), về
cơ bản chúng khác nhau ở những điểm sau đây. Những tác vụ cĩ được sau khi phân hoạch dữ liệu được thực hiện hồn tồn và từng tác vụ đều thực hiện các phép tính hữu dụng để tìm ra giải pháp cho vấn đề. Mặt khác, trong phân hoạch thăm dị, những tác vụ mặc dù chưa thực hiện xong nhưng vẫn bị kết thúc nếu đã cĩ một giải pháp được tìm ra từ một tác vụ khác. Vì thế từng phần của khơng gian tìm kiếm khi được thực hiện bởi cơng thức song song cĩ thể khác rất nhiều so với khi được tìm kiếm bởi thuật tốn tuần tự. Cho nên số lượng cơng việc mà cơng thức song song thực hiện cĩ thể nhiều hơn hay ít hơn so với khi thực hiện bằng thuật tốn tuần tự.
http://etrithuc.vn Hình 2-13 : Các bước phát sinh theo phân hoạch thăm dị
http://etrithuc.vn • Phân hoạch suy đốn
Phân hoạch suy đốn được dùng khi một chương trình cĩ thể lấy một trong các nhánh tính tốn cĩ thể, tùy thuộc vào kết quả xuất của những phép tính tốn trước đĩ. Trong trường hợp này, trong khi một tác vụđang thực hiện các phép tính mà kết quả xuất sẽ quyết định bước tính tốn tiếp theo, trong khi các tác vụ khác cĩ thể bắt đầu đồng thời các cơng việc tính tốn của giai đoạn tiếp theo. Ngữ cảnh này trơng giống với ước lượng song song một hay nhiều nhánh của câu lệnh switch trong ngơn ngữ C trước khi tồn tại giá trị vào của câu lệnh. Trong khi một tác vụ thực hiện tính tốn để giải quyết switch, các tác vụ khác thực hiện song song trên các nhánh khác của switch. Khi giá trị đầu vào cuối cùng của switch
được tính ra, thì nhánh cĩ các phép tính tương ứng sẽđược thực hiện trong khi bỏ
qua các nhánh cịn lại. Thời gian cho việc chạy song song sẽ nhỏ hơn khi chạy tuần tự vì thời gian được sử dụng tối ưu để thực hiện song song các phép tính tốn hợp lý cho giai đoạn tiếp theo. Tuy nhiên dạng song song của switch cũng bảo
đảm sẽ cĩ ít nhất một vài phép tính tốn lãng phí. Nhằm làm giảm các phép tính tốn này, một dạng khác nhỏ của phân họach suy đốn cĩ thểđuợc sử dụng, đặc biệt trong những trường hợp mà một trong các kết quả xuất của switch cĩ khả
năng xảy ra hơn so với các trường hợp cịn lại. Trong trường hợp này, chỉ cĩ nhánh ‘khả thi” nhất được một tác vụ thực thi song song cùng với các phép tính tốn trước đĩ. Nhưng nếu kết quả xuất của switch khác với những gì được mong
đợi thì ta sẽ “roll back” lại việc tính tốn và thực thi chính xác nhánh switch cần thực hiện.
Phân hoạch suy đốn và phân hoạch thăm dị khác nhau ở một vài điểm sau. Trong phân hoạch suy đốn đầu vào là khơng biết, cịn trong phân hoạch thăm dị kết quảđầu ra là khơng biết. Trong phân hoạch suy đốn, thuật tốn tuần tự sẽ
chỉ thực hiện nghiêm ngặt một trong các tác vụ ở giai đọan suy đốn, bởi vì khi mà nĩ bắt đầu thực hiện một giai đoạn nào đĩ, nĩ đã biết chính xác phải thực hiện theo nhánh nào. Một chương trình song song khi thực hiện theo phân hoạch suy
http://etrithuc.vn
đốn sẽ phải làm nhiều cơng việc hơn so với chương trình đĩ khi viết theo tuần tự. Mặt khác trong phân hoạch thăm dị, thuật tốn tuần tự tìm ra nhiều hướng đi, do mỗi nhánh đều dẫn tới một giải pháp mà chưa được biết trước. Vì thế, một chương trình song song cĩ thể thực hiện ít hơn, nhiều hơn hay bằng với số lượng cơng việc của thuật tốn tuần tự tùy thuộc vào vị trí của giải pháp trong khơng gian tìm kiếm.
• Kết hợp các phép phân hoạch
Cho đến bây giờ chúng ta đã xem xét một số phương pháp phân hoạch cĩ thể được dùng để tạo ra một số mơ hình song song cho các thuật tốn. Những kỹ
thuật này khơng phải là hồn tồn tuyệt đối mà nguợc lại chúng cĩ thể được sử
dụng kết hợp với nhau. Thơng thường một phép tính được phân thành nhiều bước và đội khi ta phải áp dụng nhiều cách phân hoạch cho các buớc khác nhau. Ví dụ
như khi tìm giá trị nhỏ nhất của một tập hợp số n rất lớn, phương pháp phân hoạch
đệ quy thuần túy cĩ thể làm phát sinh ra nhiều tác vụ hơn là số bộ xử lý đang cĩ. Một cách phân hoạch hiệu quả là chia dữ liệu ban đầu thành P phần bằng nhau và gán vào cho P bộ xử lý. Kết quả cuối cùng cĩ được bằng cách tìm giá trị nhỏ nhất của các kết quả trung gian bằng cách áp dụng phân hoạch đệ quy.
Hình 2-14 : Phân hoạch lai để tìm giá trị nhỏ nhất của mảng
2.4.2.2. Ánh xạ
Một khi bài tốn đã được phân rã thành các tác vụ, thì các tác vụ này sẽ được ánh xạ vào trong các tiến trình xử lý với mục tiêu là hồn thành tất cả trong thời gian ngắn nhất. Đểđạt được thời gian xử lý nhỏ thì chi phí cho thực thi song song các tác vụ phải được giảm đến mức tối thiểu. Với một phân họach đã cho thì
http://etrithuc.vn
cĩ hai yếu tố chính dẫn đến chi phí là : thời gian cho giao tiếp giữa các tiến trình và thời gian khi chúng nhàn rỗi. Một tiến trình cĩ thể nhàn rỗi vì nhiều lý do trước khi tồn bộ các phép tính được hồn tất. Sự phân bố khơng đều cĩ thể làm cho một vài tiến trình hồn thành cơng việc trước những tiến trình khác. Hoặc cũng cĩ thể
do các tác vụ chưa thực hiện được ánh xạ vào các tiến trình đang bận thực hiện một tác vụ khác gây ra thời gian chờ. Vì thế một cách ánh xạ các tác vụđược đánh giá là tốt khi nĩ đạt được hai mục tiêu sau :
• Giảm thiểu thời gian các tiến trình trao đổi với nhau.
• Giảm thiểu tổng thời gian khi các tiến trình này nhàn rỗi trong khi các tiến trình khác phải thực thi nhiều tác vụ.
Hai mục tiêu đĩ thường mâu thuẫn với nhau. Ví dụ, khi bạn muốn giảm đến mức tối thiểu tương tác giữa các tiến trình bằng cách kết gán một tập hợp các tác vụ vào cùng một tiến trình. Trong nhiều trường hợp như vậy, phép kết gán như
vậy sẽ đem lại sự mất cân bằng tải giữa các tiến trình, gây ra thời gian nhàn rỗi cho các tiến trình khác.
Trong phần này chúng ta sẽ xem xét nhiều cách thức để ánh xạ các tác vụ
vào trong các tiến trình với mục tiêu chính là cân bằng tải và giới hạn đến nhỏ nhất thời gian tương tác giữa chúng.
vd: trong ví dụ sau cho ta thấy cách ánh xạ 12 tác vụ vào trong 4 tiến trình, mà trong đĩ 4 tác vụ cuối cùng chỉ cĩ thể được thực hiện khi 8 tác vụ trước đĩ đã