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ậ
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 Th c Hi nờ ự ệ
Th i gian ờ
ch c a ờ ủ
ti n trình ế
g iử
Ti n trình ế
g iử
Ti n trình ế
nh nậ
MPI_Send(dest =
rank c a ti n ủ ế
trình nh n)ậ
MPI_Recv(sourc
e = rank c a ủ
ti n trình ế
g i)ử
Th i Gian Th c Hi nờ ự ệ
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ề ể ể
buffer
count
datatype
N i dung thông đi pộ ệ
destination
tag
communicator
Thông tin thông đi p (source đ c hi u ng m đ nh)ệ ượ ể ầ ị
Đ nh tuy n MPI_Sendị ế
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ả
IN buf
bi n con tr (không ế ỏ
đ nh ki u)ị ể
tr đ n vùng nh ch a d ỏ ế ớ ứ ữ
li uệ
IN count int
s l ng ph n t trong d ố ượ ầ ử ữ
li uệ
IN dtype MPI_Datatype ki u d li uể ữ ệ
IN dest int rank c a ti n trình đíchủ ế
IN tag int đ xác đ nh thông đi pể ị ệ
IN comm MPI_Comm
communicator c a ti n ủ ế
trình g i và nh nử ậ
Truy n thông đi m-đi mề ể ể
buffer
count
datatype
N i dung thông đi pộ ệ
source
tag
communicator
Thông tin thông đi p (destination đ c hi u ng m ệ ượ ể ầ
đ nh) - đ ị ể so kh p v i thông đi p treoớ ớ ệ
status
Thông tin v thông đi p đã nh n ề ệ ậ
Đ nh tuy n MPI_Recvị ế
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ả
OUT buf
Bi n con tr (không ế ỏ
đ nh ki u)ị ể
Tr đ n vùng nh ch a d ỏ ế ớ ứ ữ
li uệ
IN count int
S l ng ph n t trong d ố ượ ầ ử ữ
li uệ
IN dtype MPI_Datatype ki u d li uể ữ ệ
IN source int Rank c a ti n trình g iủ ế ử
IN tag int đ xác đ nh thông đi pể ị ệ
IN comm MPI_Comm
Communicator c a ti n ủ ế
trình g i và nh nử ậ
OUT status MPI_Status
Thông tin v thông đi p đã ề ệ
nh nậ
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ề ể ể
mpicc comm_pp.c –o comm_pp -lm
Biên d ch: ị
Ví d 1 – Truy n thông đi m đi mụ ề ể ể
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 */
Truy n thông đi m-đi mề ể ể
Ví d 2 – Truy n thông đi m đi mụ ề ể ể
10. if( myrank == 0 ){ /* Send a message */
11. for (i=0;i<100;++i) a[i]=sqrt(i);
12. MPI_Send( a, 100, MPI_DOUBLE, 1, 17, MPI_COMM_WORLD );
13. }
14. else if( myrank == 1 ){ /* Receive a message */
15. MPI_Recv( b, 300, MPI_DOUBLE, MPI_ANY_SOURCE, MPI_ANY_TAG, MPI_COMM_WORLD,
&status );
16. MPI_Get_count(&status,MPI_DOUBLE,&count);
17. printf("P:%d message came from rank %dn", myrank, status.MPI_SOURCE);
18. printf("P:%d message had tag %dn",myrank,status.MPI_TAG);
19. printf("P:%d message size was %dn",myrank,count);
20. }
21. MPI_Finalize(); /* Terminate MPI */
22. }
Truy n thông đi m-đi mề ể ể
Ví d 2 – Truy n thông đi m đi mụ ề ể ể
10. if( myrank == 0 ){ /* Send a message */
11. for (i=0;i<100;++i) a[i]=sqrt(i);
12. MPI_Send( a, 100, MPI_DOUBLE, 1, 17, MPI_COMM_WORLD );
13. }
14. else if( myrank == 1 ){ /* Receive a message */
15. MPI_Recv( b, 300, MPI_DOUBLE, MPI_ANY_SOURCE, MPI_ANY_TAG, MPI_COMM_WORLD,
&status );
16. MPI_Get_count(&status,MPI_DOUBLE,&count);
17. printf("P:%d message came from rank %dn", myrank, status.MPI_SOURCE);
18. printf("P:%d message had tag %dn",myrank,status.MPI_TAG);
19. printf("P:%d message size was %dn",myrank,count);
20. }
21. MPI_Finalize(); /* Terminate MPI */
22. }
Output:
P:1 message came from rank 0
P:1 message had tag 17
P:1 message size was 100
Truy n thông đi m-đi mề ể ể
Tr ng thái th i gian ch yạ ờ ạ
Khi đ nh tuy n MPI_Send đ c g i, x y ra 1 trong 2 tr ng h p sau:ị ế ượ ọ ả ườ ợ
•
TH1: Thông đi p đ c l u vào b đ m riêng c a MPI, và đ c ệ ượ ư ộ ệ ủ ượ
truy n t i đích sau, trong m t ti n trình ng m nào đó. Ti n trình g i ề ớ ộ ế ầ ế ử
đ c phép chuy n sang l nh khác ngay sau khi thông đi p chuy n ượ ể ệ ệ ể
h t vào b đ m.ế ộ ệ
•
TH2: Thông đi p v n n m t i n i nó đ c g i, d i d ng các bi n ệ ẫ ằ ạ ơ ượ ọ ướ ạ ế
c a ch ng trình cho đ n khi ti n trình đích s n sàng nh n.ủ ươ ế ế ẵ ậ
Th t ng c nhiên khi ngay c trong tr ng h p 1, l i g i MPI_Send có th ậ ạ ả ườ ợ ờ ọ ể
tr v giá tr ả ề ị tr c khiướ b t kỳ ấ l i g i không ph i c c bờ ọ ả ụ ộ nào đó đ c b t ượ ắ
đ u.ầ
Truy n thông đi m-đi mề ể ể
S ràng bu c và s hoàn thànhự ộ ự
C hai đ nh tuy n MPI_Send và MPI_Recv đ u b ràng bu c v i ti n ả ị ế ề ị ộ ớ ế
trình g i nó cho đ n khi quá trình truy n thông hoàn thành.ọ ế ề
Quá trình truy n thông hoàn thành khi hoàn thành c hai đ nh tuy n ề ả ị ế
MPI_Send và MPI_Recv
S hoàn thành c a đ nh tuy n MPI_Recv là đ n gi n và tr c quan:ự ủ ị ế ơ ả ự
•
Khi so kh p đúng thông đi p, d li u đ c chuy n t i đ i s đ u ra ớ ệ ữ ệ ượ ể ớ ố ố ầ
c a l i g iủ ờ ọ
•
Ngay sau đó, các bi n ch a thông đi p trong MPI_Recv s n sàng ế ứ ệ ẵ
dùng cho l i g i khácờ ọ
Truy n thông đi m-đi mề ể ể
S ràng bu c và s hoàn thành (ti p)ự ộ ự ế
S hoàn thành c a đ nh tuy n MPI_Send là ự ủ ị ế đ n gi nơ ả , nh ng không ư
tr c quan:ự
•
MPI_Send hoàn thành khi:
−
Thông đi p trong l i g i không còn liên quan đ n MPIệ ờ ọ ế
−
V nguyên t c, hoàn thành ngay sau khi thông đi p đ c đ a ề ắ ệ ượ ư
h t vào b đ m, th m chí thông đi p ch a b gi i ph ng kh i ế ộ ệ ậ ệ ư ị ả ỏ ỏ
ti n trình g iế ử