Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (1.44 MB, 78 trang )
quy ngập lụt và lớn nhất bằng tổng của thời gian lớn nhất khi sóng đi và tổng thời gian
lớn nhất khi sóng về. Ta có biểu thức sau:
Deadtimeseq _ Wave < Deadtimespanningtree _ Wave < Deadtime flood _ Wave
Sau khi đã xác định được hai thành phần đầu tiếp đến chúng ta lựa chọn các công nghệ
có thể đáp ứng cho việc viết các ứng dụng chạy sóng đệ quy. Sóng đệ quy có thể được
thực hiện bằng các lời gọi thủ tục từ xa RPC, hoặc bằng cơ chế gửi nhận các tin nhắn,
do vậy tất cả các công nghệ hỗ trợ các cách thức trên đều có thể được dùng để cài đặt
sóng đệ quy. Trên thực tế có nhiều công nghệ có thể đáp ứng được như:
• Message Passing Interface: Đây không phải là một ngôn ngữ lập trình mà là
một chuẩn cho việc gửi nhận, quản lý truyền tin nhắn giữa các tiến trình trong
các node khác nhau.
• Java RMI: bao gồm rất nhiều các thư viện phục vụ cho việc truyền nhận dữ liệu
giữa các máy tính trên một mạng.
• RPC trên ngôn ngữ C
II. Đề xuất Message Passing Interface cho sóng đệ quy:
1. MPI và lịch sử phát triển:
Message passing là một mô hình lập trình được sử dụng rộng rãi trong tính toán song
song đặc biệt là các máy tính Scalable Parallel Computer với các bộ nhớ phân tán và
trên Network of Workstations. Sử dụng khái niệm processes communicating thông qua
tin nhắn dễ dàng trong việc tiếp cận. Chuẩn MPI định nghĩa các giao diện người dùng
và các khả năng của message passing. Chuẩn này được hoàn thành tháng 6 năm 1994,
MPI được chấp nhận và sử dụng rộng rãi. Mặc dù message passing thường được dùng
cho các máy tính song song với bộ nhớ phân tán, nó có thể dùng cho mạng máy tính
hoặc tập hợp các tiến trình chạy trên một máy tính đơn lẻ.
MPI là một thư viện về việc chuyển các tin nhắn dựa trên sự thống nhất của diễn đàn
MPI bao gồm hơn 40 các tổ chức bao gồm các nhà sản xuất, các nhà nghiên cứu, các
nhà phát triển thư viện lập trình… Mục tiêu của MPI là thiết lập một chuẩn hiệu quả
và mềm dẻo cho việc chuyển tin nhắn mà sẽ được sử dụng rộng rãi cho việc viết các
chương trình truyền tin nhắn, đây cũng là chuẩn đầu tiên độc lập với các hãng hàng
đầu về CNTT. MPI không phải là một chuẩn của ISO hoặc IEEE nhưng thực tế nó đã
trở thành một chuẩn công nghiệp cho việc viết các ứng dụng truyền tin nhắn trên kiến
trúc máy tính hiệu năng cao (High Performance Computer).
Lịch sử phát triển:
Trang 66
• MPI là kết quả từ những nỗ lực của những cá nhân cũng như tổ chức từ những
thảo luận tại diễn đàn năm 1992 và 1994.
• Những năm 1980 đầu 1990, các nhà phát triển tính toán song song và bộ nhớ
phân tán đã nhận thấy cần thiết một chuẩn cho việc phát triển.
• Tháng 4 năm 1992: Hội thảo về chuẩn MPI trong môi trường bộ nhớ phân tán,
các tính năng căn bản của một chuẩn MPI đã được thảo luận.
• Tháng 11 năm 1992: Hội thảo tại Minneapolis đã đưa ra bản thảo đề nghị
(MPI1).
• Tháng 11 năm 1993: tại hội thảo siêu máy tính, bản thảo chuẩn MPI đã được
đưa ra.
• Bản thảo cuối cùng được phát hành vào tháng 5 năm 1994.
• MPI-2 ra đời năm 1996 và hiện nay MPI là tổ hợp của cả MPI-1 và MPI-2.
2. Cấu trúc chung một ứng dụng MPI:
Dưới đây là một ví dụ về cấu trúc chung của một chương trình MPI, chương trình thực
hiện tính số π .
#include "mpi.h"
#include
int main( int argc, char *argv[] )
{
int n, myid, numprocs, i;
double PI25DT = 3.141592653589793238462643;
Trang 67
double mypi, pi, h, sum, x;
MPI_Init(&argc,&argv);
MPI_Comm_size(MPI_COMM_WORLD,&numprocs);
MPI_Comm_rank(MPI_COMM_WORLD,&myid);
while (1) {
if (myid == 0) {
printf("Enter the number of intervals: (0 quits) ");
scanf("%d",&n);
}
MPI_Bcast(&n, 1, MPI_INT, 0, MPI_COMM_WORLD);
if (n == 0)
break;
else {
h = 1.0 / (double) n;
sum = 0.0;
for (i = myid + 1; i <= n; i += numprocs) {
x = h * ((double) i - 0.5);
sum += (4.0 / (1.0 + x*x));
}
mypi = h * sum;
MPI_Reduce(&mypi, &pi, 1, MPI_DOUBLE, MPI_SUM, 0,
MPI_COMM_WORLD);
if (myid == 0)
printf("pi is approximately %.16f, Error is %.16f\n",
pi, fabs(pi - PI25DT));
}
}
MPI_Finalize( );
return 0;
}
Trong đoạn mã ta thấy các phần bố cục một chương trình MPI rất rõ ràng:
•
#include "mpi.h"
là phần thêm thư viện mpi phục vụ cho việc gọi các hàm
mpi.
• Phần khởi tạo môi trường MPI:
MPI_Init(&argc,&argv);
MPI_Comm_size(MPI_COMM_WORLD,&numprocs);
MPI_Comm_rank(MPI_COMM_WORLD,&myid);
• Tiếp đến là phần xử lý thuật toán và truyền tin nhắn giữa các tiến trình nằm
trong câu lệnh while.
• Phần dừng môi trường MPI:
MPI_Finalize( );
Trang 68
3. Các khái niệm cơ bản về MPI:
a. Một số khái niệm cơ bản:
Trong mô hình tính toán song song sử dụng việc truyền tin nhắn, các tiến trình thực thi
song song và có các không gian địa chỉ khác biệt. Việc giao tiếp giữa các tiến trình xảy
ra là kết quả của quá trình copy một không gian đia chỉ của tiến trình này sang không
gian địa chỉ của tiến trình khác. Hoạt động này được đóng gói trong hai hàm send và
receive, câu hỏi đặt ra là số lượng nhỏ nhất các tham số cho các hàm này?
Với bên gửi, cần xác định dữ liệu cho việc giao tiếp và tiến trình đích nơi dữ liệu được
gửi đến. Cách tối ưu để mô tả dữ liệu là xác định địa chỉ bắt đầu và độ dài dữ liệu tính
theo byte. Bên phía nhận, các tham số cần là địa chỉ và độ dài của vùng nhớ. Ngoài ra,
cần một kí hiệu cho việc điều khiển các tin nhắn nhận được, bằng cách thêm vào type
hoặc là tag cho tin nhắn. Các hàm cơ bản với các tham số ít nhất có thể được thể hiện
như sau:
send (address, length, destination, tag)
receive (address, length, source, tag, actlen)
Bộ đệm các tin nhắn MPI có dạng (address, count, datatype)
Đặt tên các tiến trình: Các tiến trình phụ thuộc vào các nhóm. Nếu một nhóm chứa n
tiến trình, các tiến trình của nhóm được nhận diện bởi rank là các số nguyên từ 0 đến
n-1.
Các communicator là khái niệm ngữ cảnh và nhóm được tổ hợp với nhau, đây là tham
số cho các dạng hoạt động point to point và các hoạt động thu thập. Các tham số
destination và source trong hàm send, receive chính là rank của tiến trình. Hàm MPI
cho việc gửi tin nhắn đi như sau:
MPI_Send(address,count,datatype,destination,tag,comm)
Các chương trình MPI được xây dựng từ 6 hàm cơ bản nhất
Ngoài ra để tăng thêm các tính năng, các hàm khác được thêm vào với nhiều mục đích:
Trang 69
•
•
•
•
•
Các hàm tăng thêm tính mềm dẻo như các hàm về datatype
Các hàm tăng thêm tính mạnh mẽ như các hàm về gửi nhân không khóa.
Các hàm tăng thêm tính hiệu quả như các hàm về trạng thái.
Các hàm liên quan đến group và communicator.
Các hàm tăng thêm sự thuận lợi như hỗ trợ topology, thu thập hoạt động…
Chuẩn MPI bao gồm:
•
•
•
•
•
•
•
Các giao tiếp điểm điểm (Point-to-point communication).
Các hoạt động thu thập thông tin.
Xử lý với các nhóm.
Giao tiếp giữa các miền.
Xử lý topology.
Quản lý môi trường MPI và các truy vấn môi trường.
Kết nối các interface.
Do MPI là một chuẩn do đó nó không có các hoạt động chia sẻ bộ nhớ, không có các
công cụ xây dựng ứng dụng cũng như là các ứng dụng gỡ lỗi (debug tool), với các ứng
dụng đa luồng, quản lý các tác nhiệm, các chức năng vào ra chỉ được hỗ trợ ở chuẩn
MPI2.
b. Giao tiếp điểm điểm (Point-to-Point Communication):
Trong giao tiếp điểm điểm, cơ chế giao tiếp là chuyển dữ liệu giữa hai tiến trình một
bên gửi và một bên nhận. Hầu hết các xây dựng của MPI đều xoay quanh giao tiếp
điểm đến điểm. MPI cung cấp một tập các hàm gửi và nhận cho phép giao tiếp các
dạng dữ liệu liên quan đến tag. Chúng ta xem xét ví dụ sau về giao tiếp điểm đến
điểm:
char msg[20];
int myrank, tag = 99;
MPI_Status status;
…
MPI_Comm_rank( MPI_COMM_WORLD, &myrank); /* find my rank */
if (myrank==0){
strcpy(msg,”Hello there”);
MPI_Send( msg, strlen(msg)+1, MPI_CHAR, 1, tag,MPI_COMM_WORLD);
}else if (myrank==1){
MPI_Recv( msg, 20, MPI_CHAR, 0, tag, MPI_COMM_WORLD, &status);
}
Trang 70
Trong ví dụ này tiến trình 0 gửi một tin nhắn đến tiến trình 1, mã được thực thi trên cả
hai tiến trình. Tiến trình 0 gửi một chuỗi kí tự sử dụng hàm MPI_Send(). Ba tham số
đầu tiên của lời gọi xác định dữ liệu được gửi đi: được lấy từ msg. Tham số thứ 4 xác
định đích đến của tin nhắn là tiến trình 1. Tham số thứ 5 xác định message tag. Tham
số cuối cùng là một communicator để các định một communicator của miền cho giao
tiếp này. Rank của các tiến trình là các số nguyên và được lấy ra bởi truy vấn đến
communicator trong hàm MPI_Comm_rank(). MPI_COMM_WORLD là
communicator mặc định. Tiến trình nhận xác định được dữ liệu đến được đặt trong
msg và có tối đa 20 phần tử với dạng là MPI_CHAR. Biến status được thiết lập bởi
MPI_Recv() đưa thông tin về nguồn và tag của tin nhắn và số lượng các phân từ được
nhận. Ví dụ, bên nhận có thể kiểm tra biến này để tìm độ dài thực tế của chuỗi kí tự
nhận được. Dạng dữ liệu khớp giữa hai bên gửi và nhận và giao tiếp chuyển dữ liệu
trên hệ thống không đồng nhất
4. MPICH2:
MPICH2 là một thực hiện hiệu năng cao và trên diện rộng của chuẩn MPI bao gồm cả
chuẩn MPI1 và MPI2. Mục tiêu của MPICH2 là:
• Cung cấp thực hiện MPI một cách hiệu quả hỗ trợ các nền tính toán và giao tiếp
khác nhau như các sản phẩm thương mại (hệ thống máy bàn, hệ thống chia sẻ
bộ nhớ, kiến trúc đa lõi), mạng tốc độ cao (10Gbs Ethernet, InfiniBand…) và
các hệ thống tính toán cao cấp (Blue Gên, Cray, SiCortex)
• Cho phép mở rộng các framework có nguồn gốc khác.
Trang 71
PHẦN KẾT LUẬN
Sau một thời gian nghiên cứu em nhận thấy đề tài sóng đệ quy phân tán là đề tài rất
hấp dẫn, có khả năng áp dụng lớn trong thực tế cũng như khả năng phát triển trên
nhiều khía cạnh khác nhau. Do thời gian hạn hẹp nên việc nghiên cứu của em chỉ dừng
lại ở mức mô hình hóa, chưa cài đặt cụ thể trên một ngôn ngữ nhất định cũng như là
chưa cài đặt trên môi trường thực. Công việc này em sẽ cố gắng thực hiện trong thời
gian tới để hoàn thiện hơn về một đề tài sóng đệ quy phân tán. Sau đây là những đúc
kết của em khi nghiên cứu đề tài này:
Sóng đệ qui là một công cụ mới để xây dựng các ứng dụng phân tán. Kỹ thuật này có
các ưu điểm sau:
- Đây là một cấu trúc bậc cao cho phép quản lý trao đổi thông tin giữa các tiến trình,
không cần sử dụng đến các hàm thông báo nguyên thủy.
- Cho phép xây dựng các thuật toán đơn giản, dễ hiểu và không ảnh hưởng đến hiệu
năng.
- Đảm bảo sự độc lập giữa đặc tả của thuật toán và topology của mạng truyền thông.
Các thông tin toàn cục không cần được biết trước.
- Trong trường hợp chỉ có một tiến trình kích hoạt thuật toán, thuật toán kết thúc khi
sóng đệ qui trở về với tiến trình kích hoạt: có thể phát hiện được sự kết thúc của thuật
toán.
Sóng đệ qui được xây dựng trên cơ sở các thuật toán đệ qui và sóng phân tán. Như vậy
sóng đệ qui rất thích hợp cho việc thiết kế các giải thuật phân tán. Với sự hỗ trợ của
mô hình, việc triển khai sóng đệ qui phục vụ cho các giải thuật đệ qui tuần tự trên các
hệ thống song song trở nên dễ dàng. Thay vì việc phải khử đệ qui các thuật toán đệ qui
tuần tự rồi song song hóa, với sóng đệ qui chúng ta có thể áp dụng trực tiếp giải thuật
đệ qui tuần tự vào hệ thống song song, bằng cách chuyển các lời gọi thủ tục tuần tự
thông thường thành các lời gọi thủ tục phân tán, có tính đến việc phân tải hợp lý.
Các công việc đã thực hiện trong luận văn là:
1. Đưa ra một mô hình toán học của sóng đệ qui;
2. Đưa ra qui trình xây dựng một giải thuật dựa trên sóng đệ qui.
Trang 72
3. Áp dụng sóng đệ quy phân tán vào một số thuật toán phân tán như snapshot,
election.
4. Đưa ra mô hình chung cho việc cài đặt cho sóng đệ quy phân tán.
Trong tương lai, sóng đệ qui sẽ được nghiên cứu mở rộng theo các hướng:
- Tự động hóa sóng đệ qui, tạo ra các macros cho phép đưa trực tiếp các mã của
thuật toán đệ qui tuần tự mà không cần phải thay đổi các lời gọi.
- Sử dụng sóng đệ qui để xây dựng một giao thức thu thập các thông tin về bộ vi
xử lý: hệ số sử dụng, thời gian rỗi của CPU, không gian bộ nhớ.
- Xây dựng cơ chế xác định tập tiến trình sẽ được thực hiện dựa trên các tham số
thu được.
- Xây dựng cơ chế lời gọi thủ tục từ xa để cài đặt các lời gọi sóng đệ qui.
- Cài đặt sóng đệ qui trên MPI (Message Passing Interface).
Trang 73
TÀI LIỆU THAM KHẢO
[1] Distributed recursive waves – Trung Ha Quoc, Marc Bui
[2] An efficient APSP algorithm – Ivan Lavallée, Marc Bui, Trung Ha Quoc - 2004
[3] Systematic building of a distributed recursive algorithm – Gérard Florin, Roberto
Gómez, Ivan Lavallée
[4] Distributed system: Principles and Paradigms – Andrew S. Tanenbaum Maarten
Van Steen
[5]Echo Algorithms: Depth Parallel Operations on General Graphs – Ernest J. H.
Chang - 1982
[6]Principles of Concurrent and Distributed Programming –M. Ben-Ari - 2nd version
2006
[7]Recursive Distributed programming scheme – G. Florin, R. Gomez, I. Lavallée
[8]The wave algorithms as a Self-stabilizing control structure – L. Duchien, G. Florin,
R. Gomez, L. Seinturier
[9] Introduction to Distributed Algorithms – Rachid Guerraoui, Luís Rodrigues - draff
version
[10] A Distributed Algorithm for Minimum-Weight Spanning Trees – R.G.Gallager,
P.A. Humblet, P. M. Spira
[11] Yet another distributed election and spanning tree algorithm – Ivan Lavallee,
Christian Lavault.
[12] Distributed Snapshots: Determining Global States of Distributed Systems - K.
Mani Chandy, Leslie Lamport -1985
[13] Elections in a Distributed Computing System - Hector Garcia, Molina - 1982
[14] Implementing Remote Procedure Calls - Andrew D. Birrell, Bruce Jay Nelson 1984
Trang 74
[15] Super-Recursive Algorithms - Mark Burgin - 2005
[16] A Non-blocking Snapshot Algorithm for Distributed - WeiJen Wang, Carlos A.
Varela.
[17] Distributed Algorithms – Nancy A. Lynch - 1997
[18] An introduction to snapshot algorithm in distributed computing - Ajay D
Kshemkalyani, Michel Raynal, Mukesh Singhal - The British Computer Society, The
Institution of Electrical Engineers and IOP Publishing Ltd. 1994
[19] A Distributed Spanning Tree Algorithm for Topology Aware Network - Arjan
J.Mooij, Nicolae Goga, Wieger Wesselink - Unknow publisher- 2003
[20] Using MPI: Portable Parallel Programming With the Message-passing Interface Gropp William, Lusk Ewing, Skjellum Anthony - MIT Press - 1999
Trang 75