Trong phần này chúng ta sẽ chỉ mơ tả một máy tính song song lý tưởng là PRAM. Đây là một cách mở rộng tự nhiên của mơ hình tính tốn tuần tự (Random Access Machine hay là RAM) bao gồm p bộ xử lý và một vùng nhớ tồn cục cĩ kích thước khơng giới hạn và được truy cập từ tất cá các bộ xử lý. Tất cả chúng đều cĩ sử dụng cùng chung một khơng gian địa chỉ. Các bộ xử lý cĩ thể cùng chia sẽ một đồng hồ chung nhưng cũng cĩ thể thực thi các chỉ thị khác nhau trên cùng một chu kỳ. Mơ hình này được biết đến là parallel random access machine (PRAM). Tùy thuộc vào cách thức truy cập bộ nhớ, PRAM được phân thành 4 loại sau.
1. Tồn quyền đọc - Tồn quyền ghi (exclusive-read, exclusive write)
EREW. Trong loại này, truy cập vào vùng nhớ là tồn quyền. Khơng cĩ thao tác đọc ghi nào được cho phép. Đây là mơ hình PRAM khơng chắc chắn nhất, chỉ hỗ trợ truy cập đồng thời vào bộ nhớ một cách tối thiểu.
2. Đồng thời đọc – Tồn quyền ghi (concurrent read, exclusive write)
4. Đồng thời đọc – Đồng thời ghi (concurrent read, concurrent write) CRCW. Trong loại này, cho phép nhiều thao tác đọc ghi đồng thời trên cùng vùng nhớ chung. Đây là mơ hình PRAM cĩ nhiều ưu điểm nhất.
Việc cĩ nhiều thao tác đọc cùng một lúc khơng làm ảnh hưởng đến tính nhất quán của chương trình. Tuy nhiên khi cĩ nhiều thao tác ghi đồng thời thì lại cĩ ảnh hưởng lớn, vì thế cĩ nhiều cách thức được đặt ra để giải quyết vấn đềđĩ:
• Chung (common), thao tác ghi cùng lúc chỉđược thực hiện nếu tất cả các bộ xử lý đều muốn ghi một giá trị như nhau.
• Tùy ý (arbitrary), chỉ cho phép một bộ xử lý bất kỳđược ghi.
• Ưu tiên (priority), tất cả các bộ xử lý được tổ chức theo một danh sách ưu tiên được xác định trước, và bộ xử lý cĩ quyền cao nhất sẽ cĩ quyền ghi.
• Tổng hợp (sum), trong đĩ giá trị tổng của các giá trị cần ghi sẽđược ghi.
2.3. Một số mơ hình lập trình song song thơng dụng 2.3.1. Mơ hình chia sẽ khơng gian bộ nhớ
Lập trình song song tường minh thường yêu cầu chỉ ra cụ thể các tác vụ song song cùng với các tương tác giữa chúng. Những tương tác này cĩ thể ở trong dạng đồng bộ giữa các tiến trình đồng thời hay là sự giao tiếp giữa các kết quả trung gian. Trong kiến trúc chia sẽ khơng gian bộ nhớ, giao tiếp giữa các tiến trình được chỉ ra là ngụ ý vì tất cả các bộ xử lý đều cĩ quyền truy cập vào một vài (hay tất cả) các bộ nhớ. Do đĩ, mơ hình lập trình cho các máy tính chia sẽ khơng gian địa chỉ tập trung chủ yếu vào các cách thức để thực thi đồng thời, đồng bộ hĩa và những cách để làm giảm sự quá tải do tương tác.
Các mơ hình lập trình chia sẽ khơng gian địa cĩ thể khác nhau về cách thức chia sẽ dữ liệu, mơ hình đồng thời, và hỗ trợ đồng bộ hĩa. Các mơ hình giả sử rằng tất cả các dữ liệu của tiến trình đều mặc định là khơng được truy
như shmat và shmget). Mặc dù đây là một yếu tố quan trọng nhằm bảo mật trong các hệ thống đa người dùng, tuy nhiên khí chúng cùng nhau hợp tác để giải quyết cùng một vấn đề thì điều này là khơng cịn cần thiết. Các chi phí do bảo vệ dữ liệu gia tăng chỉ làm cho các tiến trình ít thích hợp hơn cho lập trình song song. Ngược lại, các tiến trình và tiểu trình giả sử tồn bộ bộ nhớ là tồn cục, và chúng sẽ thực hiện trao đổi thơng tin với nhau một cách tường minh thơng qua đọc và ghi lên biến chia sẽ.
Hình 2-6 : Mơ hình chía sẽ khơng gian bộ nhớ
Vì các tiến trình đều cĩ quyền đọc và ghi lên vùng nhớ chung vào cùng một thời điểm nên ta cần phải cĩ một cơ chếđồng bộ hĩa để bảo đảm tính đúng đắn khi thao tác trên dữ liệu.
2.3.2. Mơ hình truyền thơng điệp
Cĩ rất nhiều ngơn ngữ lập trình và các thư viện được xây dựng nên để dành cho lập trình song song. Những điều này khác nhau ở cách nhìn của chúng về khơng gian địa chỉ dành cho người lập trình, mức đồng bộ trong các chỉ thị song song và sựđa dạng của các chương trình. Mơ hình lập trình truyền thơng điệp là một trong các mơ hình cổ nhất và được sử dụng rộng rãi nhất trong các mơ hình dùng cho lập trình trên các máy tính song song. Lý do chính cho việc này là vì nĩ yêu cầu tối thiểu về phần cứng bên dưới.
Hình 2-7 : Mơ hình truyền thơng điệp
Cĩ 2 tính chất quan trọng tạo nên bản chất của mơ hình truyền thơng điệp là: thứ nhất là nĩ giả sử khơng gian địa chỉđược phân chia và thứ hai là nĩ chỉ hỗ trợ song song hĩa tường minh.
Cấu trúc của những chương trình truyền thơng điệp
Các chương trình truyền thơng điệp thường được viết bằng cách sử dụng mơ hình bất đồng bộ hay ít đồng bộ. Trong mơ hình bất đồng bộ, tất cả các tác vụ song song được thực thi một cách bất đồng bộ. Điều này cho phép ta cĩ thể triển khai bất cứ thuật tốn song song nào. Tuy nhiên những chương trình như vậy thường gặp khĩ khăn hơn để suy ra và bên cạnh đĩ cách thể hiện của nĩ cũng khĩ mà đốn trước do những điều kiện về thực thi. Ngược lại những chương trình ít đồng bộ cĩ thể kết hợp tốt cả hai thái cực này. Trong những chương trình như vậy, các tác vụ và những tập hợp con các tác vụ được đồng bộ hĩa để thực hiện những tương tác. Tuy nhiên giữa những tương tác này, các tác vụđược thực thi hồn tồn bất đồng bộ. Bởi vì những tương tác xảy ra một cách đồng bộ, nên việc suy ra chương trình như vậy cũng khá dễ dàng. Nhiều thuật tốn song song phổ biến cũng được thực hiện một cách tự nhiên bằng cách sử dụng những chương trình ít đồng bộ hơn.
Trong dạng phổ biến nhất của mình, mơ hình truyền thơng điệp hỗ trợ thực thi cho các chương trình khác nhau trên từng bộ xử lý. Điều này cung cấp tính mềm dẻo tối đa trong lập trình song song, nhưng điều này cũng làm cho cơng việc viết các chương trình song song khơng thể mở rộng một cách hiệu
viết bằng cách sử dụng phương pháp single program multiple data (SPMD). Trong những chương trình SPMD, các tiến trình khác nhau thực thi đoạn code tương tự nhau ngọai trừ một số nhỏ các tiến trình (là những tiến trình “gốc”). Điều này khơng cĩ nghĩa là những tiến trình làm việc theo lock-step. Các chương trình SPMD cĩ thể là ít đồng bộ hay là hồn tồn bất đồng bộ.
2.4. Cách thức xây dựng một chương trình song song và phân bố phân bố
Phát triển thuật tốn là một phần quan trọng trong việc giải quyết vấn đề khi sử dụng máy tính. Một thuật tốn tuần tự về cơ bản là một phương pháp thực hiện hay là một chuỗi tuần tự những bước cơ bản để giải quyết một vấn đề được đặt ra bằng cách sử dụng máy tính tuần tự. Tương tự, một thuật tĩan song song là một phương pháp giải quyết vấn đề dựa trên việc sử dụng nhiều bộ xử lý. Tuy nhiên, để chỉ ra được một thuật tĩan song song khơng đơn giản như là chỉ ra từng bước cụ thể. Mà là ở một mức độ nào đĩ, một thuật tĩan song song phải được thêm vào tính đồng thời và người thiết kế ra thuật tốn cũng phải chỉ ra tập hơp những bước cĩ thể xử lý đồng thời. Điều này nhằm tận dụng được khả năng tính tốn của các máy tính song song. Trong thực tế việc thiết kế ra một thuật tĩan song song là khá phức tạp, nĩ cĩ thể bao gồm một vài hay tất cả những điều sau:
• Chỉ ra những phần của cơng việc cĩ thểđược thực thi đồng thời. • Ánh xạ các phần của cơng việc vào nhiều bộ xử lý chạy song song. • Phân tán dữ liệu nhập, xuất và trung gian cùng với chương trình. • Quản lý truy cập vào dữ liệu chung giữa các bộ xử lý.
• Đồng bộ hĩa các bộ xử lý khi thực thi các chương trình song song
2.4.1. Các thuật ngữ căn bản
kiện tiên quyết để rút ngắn thời gian giải quyết tồn bộ vấn đề. Các tác vụ cĩ thể khơng cùng kích thước.
Đồ thị phụ thuộc : là một thể hiện sự phụ thuộc giữa các tác vụ và trật tự thực hiện giữa chúng. Một đồ thị phụ thuộc là một đồ thị cĩ hướng trong đĩ mỗi nút của cây là một tác vụ và cạnh cĩ hướng thể hiện sự phụ thuộc giữa chúng. Một tác vụ chỉ được thực hiện khi các tác vụ trước nĩ (cĩ cạnh nối) được thực hiện. Trong đồ thị phụ thuộc tập hợp cạnh cĩ thể rỗng.
Hình 2-8 : Đồ thị phụ thuộc tác vụ
Granularity : số lượng và kích thước của các tác vụ sau bước phân họach được gọi là granularity của bước phân họach. Bước phân họach một vấn đề lớn thành một số lượng lớn các vấn đề nhỏđược gọi là fine-grained và thành một số lượng nhỏ các vấn đề lớn đựơc gọi là coarse-grained.
Đồ thị tương tác : là mơ hình thể hiện sự tương tác giữa các tác vụ. Các nút trong đồ thị tương tác thế hiện các tác vụ cịn các cạnh nối thể hiện tưong tác giữa chúng. Các cung trong đồ thị tương tác thường là cung vơ hướng. Tập hợp cạnh thuờng là tập hợp cha của tập hợp cạnh của đồ thị phụ thuộc
Hình 2-9 :Đồ thi tương tác trong bài tốn nhân ma trận với vector
2.4.2. Thiết kế thuật tốn song song
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
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à 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ụ.
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
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.