Tải bản đầy đủ (.pdf) (54 trang)

slike bài giảng tính toán lưới - nguyễn hữu đức bài 4 truyền thông điểm điểm trong lập trình song song truyền thông điệp

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 (341.29 KB, 54 trang )

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ế ử

×