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 đủ
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:
- bai_giang_tinh_toan_luoi_bai_4_truyen_thong_diem_diem_trong.pdf