Bài giảng Tính toán lưới - Bài 4: Truyền thông điểm điểm trong lập trình song song truyền thông điệp - Nguyễn Hữu Đức

Truyền thông điểm-điểm  
Truyền thông điểm điểm trong lập trình  
song song truyền thông điệp  
Truyền thông điểm-điểm  
Nội dung bài học  
.
.
.
.
.
.
Khái niệm Tiến trình nguồn và Tiến trình đích  
Cấu trúc thông điệp  
Quá trình gửi/nhận thông điệp  
Gửi nhận thông điệp có ràng buộc  
Gửi nhận thông điệp không ràng buộc  
Các chế độ gửi  
Truyền thông điểm-điểm  
Tiến trình nguồn và tiến trình đích  
. Truyền thông điểm điểm là truyền thông hai phía  
Đòi hỏi khởi tạo quá trình truyền thông từ cả hai phía  
Gồm một tiến trình gửi và một tiến trình nhận  
Tiến trình gửi gọi là tiến trình nguồn  
•
•
•
•
Tiến trình nhận gọi là tiến trình đích  
Truyền thông điểm-điểm  
Tiến trình nguồn và tiến trình đích  
.
Nói chung, tiến trình nguồn và tiến trình đích là không đồng bộ  
Tiến trình  
gửi  
Tiến trình  
nhận  
Tiến trình  
gửi  
Tiến trình  
nhận  
Thời gian  
chờ của  
tiến trình  
gửi  
MPI_Recv(sourc  
e = rank của  
tiến trình  
gửi)  
MPI_Send(dest =  
rank của tiến  
trình nhận)  
MPI_Send(dest =  
rank của tiến  
trình nhận)  
MPI_Recv(sour  
ce = rank của  
tiến trình  
gửi)  
Thời gian  
chờ của tiến  
trình nhận  
Truyền thông điểm-điểm  
Cấu trúc thông điệp  
.
Gồm 2 phần:  
•
•
Thông tin về thông điệp  
Nội dung thông điệp  
.
Thông tin về thông điệp gồm 4 phần:  
•
•
•
•
Nguồn: tiến trình gửi  
Đích: tiến trình nhận  
Nhóm truyền thông: Nhóm tiến trình bao gồm cả nguồn và đích  
Tag: Dùng để phân biệt với các thông điệp khác  
−
Quan trọng  
−
Cách dùng phụ thuộc từng chương trình.  
Truyền thông điểm-điểm  
Nội dung thông điệp  
.
Nội dung thông điệp gồm 3 phần:  
• Bộ đệm: Dữ liệu trao đổi  
−
buffer  
−
Thường là một mảng  
• Loại dữ liệu: Loại của dữ liệu trao đổi  
−
datatype  
−
Loại dữ liệu của mảng  
• Bộ đếm: Số lượng dữ liệu trong bộ đệm cần trao đổi  
−
count: count * sizeof(dtype)  
−
Số phần tử của mảng  
Truyền thông điểm-điểm  
Quá trình gửi nhận thông điệp  
.
Quá trình gửi thông điệp  
• Nguồn (định danh người gửi) là ngầm định  
• Thông tin và nội dung của thông điệp phải được khai báo rõ ràng  
bởi tiến trình gửi  
.
Thông điệp treo (a pending message)  
• Thông điệp đã gửi nhưng chưa được nhận  
• Không được lưu trong hàng đợi  
• Chứa các thuộc tính phục vụ quá trình nhận  
Truyền thông điểm-điểm  
Qúa trình gửi nhận thông điệp  
.
Quá trình nhận thông điệp  
• Chỉ định thông tin thông điệp để so khớp với các thông điệp treo  
• Thành công: thông điệp được nhận, quá trình nhận kết thúc  
• Không thành công: tiếp tục chờ đợi, so khớp, quá trình nhận chưa  
hoàn thành  
• Cung cấp đủ không gian lưu trữ cho nội dung thông điệp  
Truyền thông điểm-điểm  
Gửi nhận thông điệp có ràng buộc  
.
Dùng hai định tuyến (routine)  
• MPI_Send: gửi thông điệp  
• MPI_Recv: nhận thông điệp  
.
.
Cả hai định tuyến đều ràng buộc với tiến trình gọi nó  
Sự ràng buộc kết thúc khi quá trình truyền thông hoàn thành  
.
.
Khi nào hoàn thành truyền thông?  
Hiện tượng deadlock có tồn tại?  
Truyền thông điểm-điểm  
Định tuyến MPI_Send  
buffer  
Nội dung thông điệp  
count  
datatype  
destination  
tag  
Thông tin thông điệp (source được hiểu ngầm định)  
communicator  
Truyền thông điểm-điểm  
Định tuyến MPI_Send (tiếp)  
MPI_Send(void* buf, int count, MPI_Datatype dtype, int dest,  
int tag, MPI_Comm comm)  
Truyền thông điệp trong buf đến tiến trình dest  
Giá trị trả về của hàm là mã lỗi  
IN/OUT  
Tên biến  
Loại biến  
Mô tả  
biến con trỏ (không  
định kiểu)  
trỏ đến vùng nhớ chứa dữ  
liệu  
IN  
buf  
số lượng phần tử trong dữ  
liệu  
IN  
count  
int  
IN  
IN  
IN  
dtype  
dest  
tag  
MPI_Datatype  
kiểu dữ liệu  
int  
int  
rank của tiến trình đích  
để xác định thông điệp  
communicator của tiến  
trình gửi và nhận  
IN  
comm  
MPI_Comm  
Truyền thông điểm-điểm  
Định tuyến MPI_Recv  
buffer  
Nội dung thông điệp  
count  
datatype  
source  
Thông tin thông điệp (destination được hiểu ngầm  
định) - để so khớp với thông điệp treo  
tag  
communicator  
status  
Thông tin về thông điệp đã nhận  
Giá trị của tag, source có thể là các ký tự thay thế.  
Truyền thông điểm-điểm  
MPI_Recv(void* buf, int count, MPI_Datatype dtype, int source,  
int tag, MPI_Comm comm, MPI_Status* status)  
Nhận truyền thông điệp từ source đưa vào buf  
Giá trị trả về của hàm là mã lỗi  
IN/OUT  
Tên biến  
Loại biến  
Mô tả  
Biến con trỏ (không  
định kiểu)  
Trỏ đến vùng nhớ chứa dữ  
liệu  
OUT  
buf  
Số lượng phần tử trong dữ  
liệu  
IN  
count  
int  
IN  
IN  
IN  
dtype  
source  
tag  
MPI_Datatype  
kiểu dữ liệu  
int  
int  
Rank của tiến trình gửi  
để xác định thông điệp  
Communicator của tiến  
trình gửi và nhận  
IN  
comm  
status  
MPI_Comm  
MPI_Status  
Thông tin về thông điệp đã  
nhận  
OUT  
Truyền thông điểm-điểm  
Một số lưu ý quan trọng về định tuyến MPI_Recv  
• Nếu thông điệp nhận được có số lượng phần tử lớn hơn giá trị  
count, sẽ phát sinh lỗi.  
• Tiến trình gửi và nhận phải đồng ý với nhau về loại dữ liệu truyền  
thông. Nếu không, kết quả là không xác định (MPI không kiểm tra  
được chính xác dữ liệu)  
• Khi định tuyến trả về giá trị  
−
Dữ liệu nhận đã được chuyển vào bộ đệm;  
−
Đồi số status cho biết giá trị các tham số source, tag, và số  
lượng dữ liệu thực sự nhận được  
Truyền thông điểm-điểm  
Ví dụ 1 – Truyền thông điểm điểm  
1. /* simple send and receive */  
2. #include <stdio.h>  
3. #include <mpi.h>  
4. #include <math.h>  
5. int main (int argc, char **argv) {  
6. int myrank,i;  
7. MPI_Status status;  
8. double a[100],b[100];  
9. MPI_Init(&argc, &argv); /* Initialize MPI */  
10.MPI_Comm_rank(MPI_COMM_WORLD, &myrank); /* Get rank */  
Truyền thông điểm-điểm  
Ví dụ 1 – Truyền thông điểm điểm  
11.if( myrank == 0 ){/* Send a message */  
12.  
for (i=0;i<100;++i) a[i]=sqrt(i);  
13.  
MPI_Send( a, 100, MPI_DOUBLE, 1, 17, MPI_COMM_WORLD );  
14.}  
15.else if( myrank == 1 ) /* Receive a message */  
16. MPI_Recv( b, 100, MPI_DOUBLE, 0, 17, MPI_COMM_WORLD,  
&status );  
17.MPI_Finalize(); /* Terminate MPI */  
18.}  
Truyền thông điểm-điểm  
Ví dụ 1 – Truyền thông điểm điểm  
mpicc comm_pp.c –o comm_pp
Biên dịch:  
Truyền thông điểm-điểm  
Ký tự thay thế, biến status  
.
Tiến trình nhận được phép nhận dữ liệu từ tiến trình gửi bất kỳ với tag  
bất kỳ.  
.
.
.
Bất kỳ nguồn nào: MPI_ANY_SOURCE  
Bất kỳ tag nào: MPI_ANY_TAG  
Có thể dùng ký tự thay thế cho nguồn hoặc tag hoặc cả hai  
Truyền thông điểm-điểm  
Ký tự thay thế, biến status  
.
Thông tin của tiến trình gửi nằm trong biến status  
•
•
•
status.MPI_SOURCE  
status.MPI_TAG  
int MPI_Get_count(MPI_Status *status, MPI_Datatype dtype, int  
*count);  
−
Kích thước của thông điệp  
−
Số phần tử được gửi, các phần tử có loại dữ liệu xác định  
Truyền thông điểm-điểm  
Ví dụ 2 – Truyền thông điểm điểm  
1. #include <stdio.h>  
2. #include <mpi.h>  
3. #include <math.h>  
4. int main (int argc, char **argv) {  
5. int myrank,i;  
6. MPI_Status status;  
7. double a[100],b[300];  
8. MPI_Init(&argc, &argv); /* Initialize MPI */  
9. MPI_Comm_rank(MPI_COMM_WORLD, &myrank); /* Get rank */  
Tải về để xem bản đầy đủ
pdf 54 trang Thùy Anh 21640 Free
Bạn đang xem 20 trang mẫu của tài liệu "Bài giảng Tính toán lưới - Bài 4: Truyền thông điểm điểm trong lập trình song song truyền thông điệp - Nguyễn Hữu Đức", để tải tài liệu gốc về máy hãy click vào nút Download ở trên

File đính kèm:

  • pdfbai_giang_tinh_toan_luoi_bai_4_truyen_thong_diem_diem_trong.pdf