Thực thi cấu trúc khung hàng đợi công việc

Một phần của tài liệu Các cấu trúc khung cho lập trình đa lõi (Trang 34 - 47)

5 Kết luận và hướng phát triển

2.2 Thực thi cấu trúc khung hàng đợi công việc

• Truy cập cấu trúc dữ liệu

• Chỉ lệnh cục bộ, không bao gồm hàng đợi hay dữ liệu

Người dùng có thể giả sử rằng, các chỉ lệnh chiếm một lượng thời gian bằng nhau và do đó các bộ vi xử lý xử lý một cách đồng thời, nhưng các toán hạng tiến hành là độc lập.

Điểm quan trọng cần nhấn mạnh là người dùng có thể không cần giả sử về số lượng bộ vi xử lý để thực thi cấu trúc khung này. Dựa vào số lượng bộ vi xử lý thực sự có, các tác vụ có thể có hoặc không được kích hoạt đồng thời. Vì thế, các thể hiện tác vụ sinh ra có thể được thêm vào hàng đợi ở các vị trí khác nhau. Điều này cũng ảnh hưởng đến thứ tự thực thi của các tác vụ.

Cấu trúc dữ liệu chia sẻ cũng có liên quan ở đây. Vì người dùng nói chung là không thể chắc chắn về số lượng tác vụ được thực thi đồng thời, không giải thiết nào được đặt ra về tính đồng thời giữa các chỉ lệnh bên trong các tác vụ khác nhau. Đối với các số lượng bộ vi xử lý khác nhau, một chỉ lệnh nào đó từ một tác vụ có thể có hoặc không được thực thi trước khi một số chỉ lệnh của tác vụ khác. Sự đảm bảo duy nhất chỉ là tất cả các chỉ lệnh từ một tác vụ sẽ được thực thi trước các tác vụ con cháu của nó (vì việc thêm các bộ mô tả mới cho một hàng đợi công việc là hoạt động cuối cùng của một tác vụ). Do đó, người dùng có thể không cần phải giả thiết về thứ tự của hai truy cập độc lập đến cùng một vị trí chia sẻ. Điều này dẫn đến xung đột trong truy cập là không có ý nghĩa ở mức trừu tượng của người dùng, vì

nó không bao giờ xảy ra nếu như đã hiểu rõ về sự thực thi.

Tổng kết, để mô tả giải pháp hàng đợi công việc cho một bài toán, người dùng phải cung cấp 4 mục sau

• Đặc tả “kiểu” của cấu trúc dữ liệu dùng để mô tả giải pháp

• “Biến” của kiểu dữ liệu này với nội dung mô tả thể hiện khởi tạo của bài toán

• Thủ tục “Tác vụ” đã tham số hóa mô tả các phép toán chỉnh sửa cấu trúc dữ liệu, trong đó các tham số đặc tả các phần của cấu trúc dữ liệu. Kết quả sau khi các phép toán tiến hành, thủ tục có thể sẽ chọn để tạo ra nhiều thể hiện tác vụ mới được thực thi tiếp theo, bằng cách thêm các tham số của nó vào hàng đợi công việc. Thủ tục có thể giữ lại các biến cục bộ. Các biến này không thể truy cập bởi các thể hiện tác vụ khác.

• Tập khởi tạo các tham số mô tả các thể hiện của tác vụ nói chung, cùng với một nguyên lý cho hàng đợi (được chọn từ một tác các lựa chọn ) để điều khiển hàng đợi

Nghiên cứu các lý thuyết tính toán trên giải thuật nhằm áp dụng xây dựng cấu trúc khung

Trong chương 2 của luận văn đã đề cập đến mô hình lập trình song song theo cấu trúc khung. Hướng tiếp cận này là tốt để lập trình viên có thể lập trình ra các chương trình song song mà không cần quan tâm đến hệ thống song song phía dưới. Lập trình viên sẽ tập trung hơn vào việc mô tả giải thuật của bài toán và tìm các cấu trúc khung phù hợp. Chính điều này làm cho lập trình song song gần gũi hơn với các lập trình viên đã từng làm việc với các chương trình tuần tự. Tuy nhiên, để tạo ra được giải thuật tối ưu dựa trên các cấu trúc khung, cần phải có những lý thuyết chắc chắn cho việc suy diễn trên các giải thuật để đưa ra một giải thuật hiệu quả, và đúng đắn. Chương này sẽ đi sâu tìm hiểu về lý thuyết tính toán trên giải thuật. Chương này cũng đề cập đến các cấu trúc khung cho hai kiểu dữ liệu cơ bản là Danh sách và Ma trận.

3.1 Tổng quan về khái niệm Tính toán trên giải thuật

Phát triển phần mềm có độ tin cậy cao là một tác vụ phức tạp. Trước hết, bài toán đưa ra cần được chuyển đổi thành một đặc tả hình thức. Đặc tả hình thức được chia thành các phần có thể quản lý được, phần mềm được xây dựng từ các phần này. Sau khi kết hợp các phần sẽ đưa ra sản phẩm cuối cùng. Sản phẩm được kiểm thử để xem có đáp ứng yêu cầu hay không. Trái tim của tiến trình phát triển này nằm ở pha mà các phần được kết hợp để tạo nên phần mềm, trong đó sẽ sử dụng đến các chương trình như: cộng số, sắp xếp danh sách, phân tích đầu vào.

Hai vấn đề nổi bật trong thiết kế và thực thi phần mềm là tính đúng đắn và hiệu quả. Cho trước một đặc tả của một bài toán, cần phải cấu trúc lên một chương trình hiệu quả thỏa mãn các yêu cầu liệt kê trong đặc tả. Rõ ràng các chương trình đúng đắn thường không có được tính hiệu quả cao và các chương trình vừa đúng đắn vừa hiệu quả là không dễ phát triển.

Hướng tiếp cận rõ ràng để cấu trúc lên các chương trình đúng đắn và hiệu quả là Lập trình chuyển đổi. Đặc tả được mô tả bằng một ngôn ngữ hình thức thì đặc tả đó coi như là đúng, tuy nhiên không chắc là một chương trình hiệu quả. Về định nghĩa, một chương trình là cách đối xử giữa đầu vào và đầu ra. Nếu một chương trình là tất định thì ý nghĩa của nó chính là một hàm; nếu chương trình là không tất định thì nó là một quan hệ. Với các bước chuyển đổi bảo toàn (trong trường hợp là hàm) và các bước chuyển đổi làm mịn (trong trường hợp là quan hệ), chương trình sẽ được chuyển đổi thành một chương trình hiệu quả và đúng đắn. Vì mỗi bước chuyển đổi sẽ bảo toàn hoặc làm mịn ý nghĩa của chương trình, nên chương trình là đúng đắn, vấn đề còn lại chỉ là tính hiệu quả. Do đó, vấn đề đúng đắn và hiệu quả là độc lập trong Lập trình chuyển đổi. Phương pháp luận trong Lập trình chuyển đổi cần có ít nhất hai thuộc tính. Trước tiên, để tiến hành các tính toán, nó phải mô tả được cả đặc tả và giải thuật trong cùng một ngôn ngữ sử dụng;

thứ hai, để các tính toán có thể hiểu được thì các ký hiệu dùng cho giải thuật phải ngắn gọn.

Ngày nay, các nghiên cứu trong Lập trình chuyển đổi được đề cập đến rất nhiều và phong phú trong các hội nghị chuyên môn về ngôn ngữ lập trình, kỹ nghệ phần mềm. Trong luận án này sẽ đề cập đến lược đồ Lập trình chuyển đổi là lược đồ “Tính toán trên giải thuật”, các tên tiếng Anh được tham chiếu đến là “Contructive algorithmic”, “the Bird-Meertens Formalism” và “Squiggol” [7], [1]

“Tính toán trên giải thuật là một phép tính để cấu trúc chương trình bằng cách sử dụng các phép biến đổi phương trình từ các đặc tả của nó”.

Phép tính là nói đến tập các khái niệm và ký hiệu, cùng với nội dung gồm các định lý nói lên mối quan hệ giữa các khái niệm. Tương tự với phép tính vi phân trong toán học. Một phép tính liên quan đến một lớp bài toán trong một lĩnh vực nào đó.

Cấu trúc chương trình từ các đặc tả về cơ bản là hướng tiếp cận “Lập trình chuyển đổi” để lập trình lên các cấu trúc. Điều này được Darlington (1981) mô tả như sau

Dùng hướng tiếp cận chuyển đổi để lập trình chương trình là không cố gắng tạo trực tiếp ra chương trình đúng, dễ hiểu và hiệu quả, thay vào đó, ban đầu ta tập trung để đưa ra chương trình rõ ràng và dễ hiểu nhất có thể, bỏ qua các câu hỏi liên quan đến tính hiệu quả. Tiếp đến sẽ dần chuyển đổi chương trình sang phiên bản hiệu quả hơn bằng một phương pháp đảm bảo bảo toàn ý nghĩa của chương trình.

Cụ thể hơn, khái niệm chương trình bao gồm các cấu trúc không thực thi. Trong trường hợp này, người lập trình ban đầu tập trung bào việc đưa

ra chương trình bỏ qua vấn đề về khả năng thực thi (đó chính là một đặc tả). Chương trình này sau đó phải được chuyển đổi dần thành phiên bản có thể thực thi được nhưng vẫn tương đương với phiên bản cũ.

Biến đổi phương trình nghĩa là biến đổi tương đương các phương trình, xuất phát từ đặc tả gốc rồi mở rộng dần để dẫn đến phiên bản hiệu quả hơn. Đây là tính chất phân biệt hướng tiếp cận này với các hướng tiếp cận chuyển đổi khác.

Quá trình Biến đổi chương trình có thể được mô tả như sau Đặc tả gốc

= {Điều chỉnh cho bước đầu tiên}

Phiên bản trung gian

= {Điều chỉnh cho bước tiếp theo}

.. .

= {Điều chỉnh cho bước cuối cùng}

Phiên bản hiệu quả hơn

Một điểm quan trọng nữa trong Tính toán trên giải thuật đó là phải tìm ra các luật để sử dụng trong Biến đổi phương trình. Việc tìm ra một luật mới là hết sức khó khăn, cần có thời gian nghiên cứu lâu dài, do vậy luận văn sẽ không đi sâu vào vấn đề này.

3.2 Phương pháp mới thiết kế các cấu trúckhung song song khung song song

Tính toán trên giải thuật là một lý thuyết được soạn ra để phát triển một cách có hệ thống các luật mà dựa trên đó các chương trình hiệu quả được suy diễn ra từ các đặc tả. Nó đã được chứng minh là rất hữu ích để phát triển các chương trình tuần tự hiệu quả [7], [1].

Điểm quan trọng của Tính toán trên giải thuật là với mỗi một cấu trúc tính toán sử dụng trong chương trình cần phải tạo ra từ một cấu trúc dữ liệu mà cấu trúc tính toán đó áp dụng. Đây chính là ý tưởng để đưa ra phương pháp thiết kế cấu trúc khung song song.

Trong Tính toán trên giải thuật, các cấu trúc dữ liệu được định nghĩa một cách có cấu trúc. Ví dụ, danh sách các số nguyên được định nghĩa bởi

IntList=Nil

|Cons Int IntList

Biểu thức trên nói rằng một danh sách có thể là rỗng, thể hiện bằng Nil, hoặc một danh sách có thể biểu diễn bằng Cons a x là danh sách xây dựng dựa trên một số nguyên và một danh sách ngắn hơn sử dụng hàm khởi tạo Cons. Do đó Cons 1 (Cons 2 (Cons 3 Nil)) tạo nên danh sách với 3 phần tử 1, 2, và 3.

Mỗi cấu trúc dữ liệu đại số được cặp với một mẫu tính toán cơ bản gọi là homomorphism. Ví dụ, một homomorphism h trên danh sách số nguyên là mẫu tính toán sau

h (Nil)=e

h (Cons a x)=a⊕h (x)

Trong đó, e là hằng số, ⊕ là toán hạng hai ngôi. Chọn cặp e và ⊕ khác nhau sẽ dẫn đến tính toán khác nhau của hàm h(x), homomorphism trên danh sách số nguyên biểu diễn bởi homIntList(e,⊕,x). Trong ngữ cảnh rõ ràng, ta có thể bỏ qua hệ số dưới. Ví dụ, phép tính để tính tổng các phần tử của danh sách x được mô tả bởi hom(0,⊕,x)

Homomorphism đóng vai trò quan trọng trong phát triển chương trình [1]. Dưới đây sẽ đưa ra một số đặc trưng hữu ích để xây dựng cấu trúc khung song song.

• Homomorphism mặc dù là đơn giản, nhưng rất mạnh để mô tả bất kỳ tính toán nào trên cấu trúc dữ liệu mà nó định nghĩa, có thể dưới hình

thức một homomorphism đơn hoặc dưới dạng homomorphism hợp (sự kết hợp giữa một homomorphism và một phép chiếu. Đặc trưng này rất có giá trị khi thiết kế các cấu trúc song song.

• Homomorphism có nhiều các luật đại số hữu ích, lợi ích của nó là để loại trừ chi phí cho việc truyền dữ liệu giữa các cấu trúc khung hoặc để cấu trúc lên các luật mới nhằm tối ưu hóa chương trình dựa trên homomorphism. Do vậy các homomorphism có thể coi như các cấu trúc khung song song đủ hiệu quả.

• Homomorphism có thể sử dụng như nền tảng để xây dựng nên các tính toán thực hành như Quy hoạch động. Vì vậy, với các homomorphism, ta có thể thêm các mẫu tính toán hữu ích trên giải thuật.

Các đặc trưng của homomorphism chỉ ra rằng các homomorphism có thể dùng là cấu trúc cơ bản để xây dựng lên các cấu trúc khung. Nhưng một khó khăn lớn là phải đưa ra cách hình thức hóa các cấu trúc dữ liệu song song theo cách đại số. Phần tiếp theo của Luận văn sẽ đưa ra các thiết kế cho các kiểu dữ liệu song song Danh sách và Ma trận.

3.3 Cấu trúc khung song song cho kiểu dữliệu Danh sách liệu Danh sách

3.3.1 Định nghĩa đại số cho kiểu dữ liệu danh sáchTheo lý thuyết Tính toán trên giải thuật, kiểu dữ liệu danh sách được định Theo lý thuyết Tính toán trên giải thuật, kiểu dữ liệu danh sách được định nghĩa theo hướng có cấu trúc và song song hóa như sau:

data DList α = Empty

| Singleton α

Một danh sách (thuộc kiểuDList α) có thể là một danh sách rỗng, một danh sách đơn nhất chỉ bao gồm một phần tử (thuộc kiểu α) hoặc là ghép nối của hai danh sách khác (thuộc cùng kiểu DList α) bằng phép++. Phép ghép nối ++ có tính chất kết hợp và Empty là đơn vị của phép này.

Khả năng song song trong cấu trúc của danh sách nằm ở tính kết hợp của phép ++, từ đó có thể đưa ra nhiều cách để cấu trúc nên một danh sách, như vậy sẽ không cần một thứ tự rõ ràng trong quá trình cấu trúc lên danh sách. Để đơn giản, quy ước [] là Empty, [a] làSingletonα, và biểu thức[1]++ [2]++ [3]

biểu thị một danh sách với ba phần tử, thường được viết tắt là [1,2,3]

3.3.2 Homomorphism cho danh sách song song

Homomorphism của danh sách (hoặc gọi tắt là homomorphism nếu ngữ cảnh đã rõ ràng) là những hàm trên danh sách song song tiến hành thông qua việc kết nối danh sách. Chính xác hơn, hàm h thỏa mãn ba đẳng thức sau được gọi là một homomorphism của danh sách:

h([]) =i⊕

h([a]) =f(a)

h([x++y]) =h([x]) ++h([y])

trong đó, f và ⊕ là các hàm đã biết, và ⊕ có tính chất kết hợp với đơn vị là i⊕. Quy ước ký hiệu homL(f,⊕, x) cho h(x). Lấy ví dụ, hàm sum(x), tính tổng tất cả các phần tử trong danh sách x, có thể được định nghĩa như là một homomorphism homL(id,+, x).

Homomorphism cho danh sách phản ánh cấu trúc tính toán đệ quy và có thể hoạt động như cấu trúc khung hiệu quả nhất cho cấu trúc danh sách song song. Bằng trực giác có thể thấy đối với hàm h ở trên thì giá trị của h

ở những danh sách lớn hơn phụ thuộc vào những cách riêng (sử dụng toán tử nhị phân ⊕) trên các giá trị của h áp dụng vào hai phần của danh sách. Việc tính toán của h(x)và h(y) là độc lập với nhau, do đó có thể song song

hóa. Đẳng thức đơn giản này có thể được xem như là thể hiện của phép chia để trị trong lập trình song song.

3.3.3 Các cấu trúc khung trên danh sách

Homomorphism của danh sách về tổng quát là một cấu trúc khung song song tốt, các homomorphism cụ thể của danh sách có thể cài đặt rất hiệu quả. Có 3 cấu trúc khung song song cơ bản đó là: map,reduce,scan.

Maplà một phép toán trong đó nó áp dụng một hàm cho trước trên từng phần tử trong danh sách. Thông thường, Map được mô tả như sau:

mapL(f,[x1, x2, . . . xn]) = [f(x1), f(x2). . . f(xn)]

Reduce là phép toán dùng để kết hợp các phần tử của danh sách thành một giá trị đơn bằng cách lặp đi lặp lại việc áp dụng một vài toán tử nhị phân có tính chất kết hợp. Với toán tử nhị phân kết hợp ⊕, ta có:

reduceL(⊕,[x1, x2, . . . xn]) =x1⊕x2⊕. . .⊕xn

Scanlà phép toán gần giống vớireduce, tuy nhiên nó tích lũy các giá trị trung gian trong quá trình tính toán. Với toán tử nhị phân ⊕, ta có:

scanL(⊕,[x1, x2, . . . xn]) = [x1, x1⊕x2, . . . , x1 ⊕x2 ⊕. . .⊕xn]

Map,reduce vàscan là các phép toán có khả năng song song hóa rất tốt trên các hệ thống máy tính song song. Nếuf và⊕ có thời gian tính toán làO(1), thì mapL(f, x) có thể được cài đặt với O(1) thời gian song song, tương tự với reduceL(⊕, x) và scanL(⊕, x) có thể được cài đặt với O(logn). Cần phải chú ý rằng 3 cấu trúc khung song song cơ bản trên không chỉ là các trường hợp đặc biệt của homomorphism mà bản thân homomorphism còn là sự cấu

Một phần của tài liệu Các cấu trúc khung cho lập trình đa lõi (Trang 34 - 47)

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

(73 trang)