Hình 4-9 : Giao ti p non-blocking
Phân lo i theo các hình th c truy n thơng thì non-blocking c ng cĩ m t s th t c t ng t nh các th t c blocking và cĩ thêm các tham s trong th t c nh sau nh m đ qu n lý các ti n trình g i
Request object : Ki u d li u MPI_Request Ý ngh a :
Nonblocking communication s d ng đ i t ng request đ yêu c u
đ i t ng nh n di n nh ng h at đ ng truy n thơng và liên k t v i nh ng thao tác xem xét s hồn thành c a tác v . i t ng request đ c đnh rõ v trí trong b nh h th ng MPI. Ng i dùng khơng bi t đ n c u trúc c a nh ng đ i t ng này. Ch ng trình ng d ng ch v n d ng th đi u khi n (handle) đ i t ng. H th ng cĩ th dùng đ i t ng request này đ xác đnh m t s thu c tính khác c a nh ng thao tác truy n thơng, ch ng h n nh b đ m truy n thơng liên quan đ n nĩ, hay đ l u tr thơng tin v nh ng v tr ng thái ch a đ c gi i quy t c a các h at đ ng truy n thơng (g i, nh n).
T ng t các Blocking Send hay Receive c a blocking communication, nh ng tên hàm cịn cĩ thêm ch “I” phía tr c.
MPI_Isend(void* buf, int count, MPI_Datatype datatype, int dest, int tag, MPI_Comm comm, MPI_Request *request)
MPI_Issend (void *buf,int count,MPI_Datatype datatype,int dest,int tag,MPI_Comm comm,MPI_Request *request)
Gi ng nh MPI_Isend(), ngo i tr hàm MPI_Wait() ho c MPI_Test ch ra r ng khi nào thì x lý đích đã nh n đ c thơng đi p.
MPI_Ibsend (void *buf,int count,MPI_Datatype datatype,int dest,int tag,MPI_Comm comm,MPI_Request *request)
Gi ng nh MPI_Bsend() ngo i tr MPI_Wait() hay MPI_Test ch ra r ng x lý đích đã nh n đ c thơng đi p hay ch a. Hàm này ph i đ c s d ng v i hàm MPI_Buffer_attach.
MPI_Irsend(void *buf,int count,MPI_Datatype datatype,int dest, int tag,MPI_Comm comm,MPI_Request *request)
Gi ng nh MPI_Rsend() ngo i tr MPI_Wait() hay MPI_Test() ch ra r ng khi nào thì x lý chính nh n thơng đi p. Ch nên s d ng n u l p trình viên ch c ch n r ng cĩ m t trình nh n thơng đi p thích h p x lý đích đã
đ c đ a lên.
4.3.3.2. Non-Blocking Receive
MPI_Irecv(void* buf, int count, MPI_Datatype datatype, int source, int tag, MPI_Comm comm, MPI_Request *request)
thêm vào đ i t ng cĩ ki u d li u MPI_Request dùng đ tr v th đi u khi n. Và th này dùng trong các tr ng h p ch tr ng thái hồn thành c a các Posting Operations, qu n lý ti n trình nh n và g i thơng đi p.
tr v c a h th ng th c thi g i thơng đi p, t ng t truy xu t cho thao tác nh n.
4.3.3.3. Ki m tra s hồn thành c a các ti n trình nh n
B i vì các hàm trong Posting Operation khơng đ c bi t tr c s hồn thành khi đ c kh i ch y. Nên MPI cung c p ch c n ng ch cho đ n khi thao tác Send và Receive đã hồn thành. N u thao tác non blocking Send và Receive cĩ thêm các thao tác ch s hồn thành thì gi ng nh hàm blocking. Cĩ th hình dung nh th này
MPI_Isend()+MPI_Wait() = = MPI_Send() MPI_Irecv()+MPI_Wait() = = MPI_Recv()
Phân lo i ki u ki m s hồn thành trong truy n thơng Blocking
Ki m tra s hồn thành c a các ti n trình g i ho c nh n và dùng l i các thơng tin liên quan đ n các đ i t ng này, ch y u là vùng nh ng d ng dùng đ g i d li u.Các hàm do MPI cung c p cĩ tên Wait.
Non-blocking :
Ch ki m tra xem đã hồn thành 1 tác v hay ch a, hàm này tr v ngay t i th i đi m đĩ. Và n u tác v đã hồn thành thì tr v thêm các thơng tin liên quan đ n s hồn thành đĩ, ng c l i tr v m t giá tr khơng đ nh ngh a. Các hàm này mang tên Test
MPI_Wait(MPI_Request *request,MPI_Status *status)
Ch cho đ n khi ti n trình nh n thơng đi p nh n đ c thơng đi p hồn tồn, thơng qua th đi u khi n request liên quan đ n ti n trình nh n thơng đi p. Và bi n status s nh n đ c tr ng thái c a ti n trình nh n nh đnh danh thơng
đi p v.v...
MPI_Test (MPI_Request *request,int *flag,MPI_Status *status)
G i hàm MPI_Test, flag tr v b ng true n u thao tác g i ho c nh n
đ c xác đnh b ng đ i t ng request đã hồn thành. Trong tr ng h p này,
đ i t ng tr ng thái status đ c thi t l p n i dung thơng tin trên thao tác đã hồn thành và đ i t ng request s đ c gán giá tr MPI_REQUEST_NULL.
Ng c l i, flag tr v b ng false. Trong tr ng h p này, giá tr c a đ i t ng tr ng thái status là khơng xác đnh.
C hàm MPI_Wait và MPI_Test, thơng tin tr v thao tác hồn thành
đ u d a trên thơng tin đ i t ng tr ng thái status. N i dung c a đ i t ng tr ng thái status. N u mu n ch m t t p các truy n thơng gi a các ti n trình hồn thành thì dùng các hàm sau
MPI_ Waitany(int count,MPI_Request *arrayofrequest,int *index,MPI_Status *status)
Khĩa m t thao tác truy n thơng (g i ho c nh n), liên k t v i m t đ i t ng request trong m ng các đ i t ng Request. N u nhi u h n hay b ng m t thao tác đã hồn thành, thì MPI_Waitany tùy ý l y m t đ i t ng request trong m ng đĩ và hồn thành nĩ, MPI_Waitany s tr v ch s c a ph n t request trong m ng và tr v tr ng thái hồn thành. i t ng request đĩ s đ c gi i phĩng và đ c gán giá tr MPI_REQUEST_NULL
MPI_Testany(int count,MPI_Request *array_of_requests,int *index,int *flag,MPI_Status *status)
N u cĩ m t hay nhi u h n m t thao tác đã hồn thành, nĩ tr v flag=true, và ch s c a đ i t ng request trong m ng đ i t ng Request, và tr ng thái c a thao tác đĩ và đ i t ng tr ng thái đĩ đ c gi i phĩng và gán giá tr MPI_REQUEST_NULL. Ng c l i, flag=false, và index=MPI_UNDEFINED và status=MPI_UNDEFINED, các giá tr này do MPI đnh ngh a dùng trong tr ng h p các giá tr tr v khơng thích h p.
MPI_ Waitall(int count,MPI_Request *arrayofrequest,MPI_Status *arrayofstatus)
Ch cho đ n khi t t c các thao thác cĩ đ i t ng request trong m ng Request hồn thành. Ch s tr ng thái th i trong m ng các tr ng thái tr v
N u t t c các thao tác đã hồn thành thì flag=true, và tr v tr ng thái status t ng ng trong m ng các tr ng thái, gi i phĩng tồn b các đ i t ng request và đ c gán giá tr là MPI_REQUEST_NULL,
MPI_ Waitsome(int incount,MPI_Request *arrayofrequest,int *outcount,int *offsets,MPI_Status*arrayofstatuses)
Ch cho đ n khi nhi u h n m t truy n thơng đ c hồn thành, liên k t v i nh ng đ i t ng request trong m ng. MPI_Waitsome tr v s l ng đ i t ng request đã hồn thành.
MPI_Testsome(int incount,MPI_Request *array_of_request,int *outcount,int *array_of_indices,MPI_Status *array_of_statuses)
C ng nh hàm MPI_Waitsome, ng ai tr nĩ tr v ngay l p t c. N u khơng cĩ thao tác nào hồn thành thì outcount=0
MPI_Iprobe(int source,int tag,MPI_Comm comm,int *flag,MPI_Status *status)
Là hàm thu c d ng non-blocking, tr v flag=true n u cĩ m t thơng đi p mà cĩ th đ c nh n v i nh ng thơng tin đ c t v source, tag, comm. L i g i c ng t ng thích cùng thơng đi p mà đã đ c nh n v i hàm MPI_Recv (v i nh ng tham s nh th này).
4.3.3.4. Các th t c liên quan đ n đ i t ng request
Gi i phĩng Request(Freeing Requests)
M t đ i t ng request cĩ th đ c gi i phĩng d a vào các hàm MPI_Wait hay MPI_Test. Ngịai ra, nĩ cịn d c gi i phĩng b i s d ng nh ng thao tác khác nh :
MPI_Request_free(MPI_Request *request)
Nh ng các thao tác này khơng gi i phĩng đ c đ i t ng request khi cĩ m t s giao ti p liên quan đ n đ i t ng này v n t n t i. Vì th MPI cung c p thêm m t hàm n a là :
MPI_Cancel(MPI_Request *request)
ánh d u cho vi c h y b thao tác truy n thơng nonblocking (g i hay nh n) đang b treo. Nĩ tr v ngay l p t c, cĩ th tr c khi s thao tác đĩ b
b . C ng gi ng nh các hàm MPI_IRecv(..). Hàm này c ng cĩ th áp d ng các hàm liên quan đ n vi c ch đ i nh MPI_Wait(..) đ bi t hàm này đã th c hi n xong hay ch a. N u s truy n thơng khơng b h y b (b i vì s truy n thơng
đã x y ra tr c khi hàm này t ra hi u qu ), ng c l i thì đ i t ng request s
đ c gi i phĩng và tr v tr ng thái thơng tin đã b h y b b ng cách s d ng hàm MPI_Test_cancelled(MPI_Status *status,int *flag): status l u thơng tin c a thao tác c n ki m tra xem cĩ ph i thao tác này đã b h y b hay ch a. flag=true n u x y ra đi u đĩ, ng c l i flag=false.
4.4. Trao đ i thơng tin t p h p
4.4.1. ng b hĩa
MPI_Barrier (MPI_Comm comm)
T o ra m t rào c n đ ng b trong m t nhĩm. M i tác v , khi ti n t i l i g i MPI_Barrier, thì khĩa l i cho đ n khi nào t t c các tác v khác trong nhĩm c ng ti n t i cùng m t l i g i MPI_Barrier. Ch c n ng này giúp t t c các x lý trong nhĩm đã nh n h t đ c d li u.
4.4.2. Di d i d li u trong nhĩm
MPI_Bcast(void *buffer, int count, MPI_Datatype datatype, int root, MPI_Comm comm)
Broadcast (g i) m t thơng đi p t x lý v i rank=root t i t t c các x lý cịn l i trong cùng m t communicator (trong cùng m t nhĩm v i nhau)
Các x lý trong m t communicator s nh n d li u c a ti n trình g i broadcast
Tham s Di n gi i Buffer đ a ch c a b đ m ng d ng
Hình 4-10 : Broadcast d li u
MPI_Scatter(void *sendbuff,int sendcnt,MPI_Datatype sendtype,void *recvbuf,int recvcnt,MPI_Datatype recvtype,int root,MPI_Comm comm)
Phân ph i và chia nh thơng đi p thành n ph n khác nhau t m t x lý ngu n và g i đ n m i x lý cịn l i trong communicator. Hàm này gi ng nh g m n hàm MPI_Send v i n là s ti n trình và m i ti n trình đ u th c hi n hàm MPI_Recv(...). T t c các tham s đ u quan trong v i ti n trình g i Broadcast, cịn l i các ti n trình khác ch quan tâm b đ m nh n, communicator, ti n trình g i, d ng d li u và s d liêu đ c nh n.
Cho phép m t s l ng d liêu đ c g i đ n m i ti n trình, b i vì sendcount là m t m ng và cịn cĩ thêm m t tham s n a là m ng displs dùng
Hình 4-11 : Ví d hàm Scatter
S m r ng c a hàm Scatter là: MPI_Scatterv(void *sendbuf,int *sendcounts,int *displs,MPI_Datatype sendtype,void *recvbuf,int recvcount,MPI_Datatype recvtype,int root,MPI_Comm comm)
Trái ng c v i các hàm MPI_Scatter thì g m các hàm sau đây MPI_Gather(void *sendbuff, int sendcnt, MPI_Datatype sendtype, void
*recvbuf, int recvcount, MPI_Datatype recvtype, int root, MPI_Comm comm) Hàm này cĩ nhi m v l y l i t t c các thơng đi p t m i tác v trong m t nhĩm vào m t tác v đích duy nh t.
M i x lý (k c x lý root) đ u ph i g i thơng tin v sendbuf đ n ti n trình root, và ti n trình root s nh n thơng đi p và l u chúng trong m t danh sách cĩ th t các đnh danh ti n trình (rank) .
Hình 4-12 : Hàm MPI_Gather
MPI_Allgather(void *sendbuf,int sendcount,MPI_Datatype sendtype,void * recvbuf,int recvcount,MPI_Datatype recvtype,MPI_Comm comm)
Hình 4-13 : Hàm MPI_Allgather
MPI_Alltoall(void *sendbuf,int sendcount,MPI_Datatype sendtype,void *recvbuff,int *recvcount,MPI_Datatype recvtype,MPI_Comm comm) là m t s m r ng c a hàm MPI_Allgather. M i x lý s g i d li u phân bi t đ n m i trình nh n.X lý th i s g i kh i th j đ n x lý th j và
đ c thay th trong kh i th i c a b nh l u tr nh n
4.4.3. Tính tốn g p
Các hàm d ng này cung c p thêm tính tốn g p trên các x lý v i nhau (ví d nh tính t ng, tính giá tr l n nh t...) các gía tr thu c v các thành viên c a nhĩm x lý. C ng gi ng nh các hàm collective operation khác, nh ng hàm này c ng cĩ hai d ng, đĩ là k t qu tính tốn tr v trên m t nút ho c k t qu tính tốn tr v trên nhi u nút (nút đây xem nh là m t x lý hay m t máy trên m t m ng)
MPI_Reduce(void *sendbuf, void *recvbuf, int count, MPI_Datatype datatype, MPI_Op op, int root, MPI_Comm comm)
Tính giá tr c a t t c các ti n trình trong communicator g i đ n và sau đĩ đ a giá tr tính tốn đĩ v m t ti n trình cĩ rank=root.
4.4.3.1. M t s ki u tính tốn do MPI cung c p
CÁC TH T C TÍNH TỐN KI U D LI U C S
D NG
MPI_MAX Tính giá tr l n nh t integer,float MPI_MIN Tính giá tr nh nh t integer,float
MPI_SUM Tính t ng integer,float MPI_PROD product integer,float
MPI_LAND Tốn t lu n lý AND integer
MPI_BAND Tốn t d u bit AND integer,MPI_BYTE MPI_LOR Tốn t lu n lý OR integer
MPI_BOR Tốn t d u bit OR integer,MPI_BYTE MPI_LXOR Tốn t lu n lý XOR integer
MPI_BXOR Tốn t d u bit XOR integer,MPI_BYTE MPI_MAXLOC Tính giá tr l n nh t và
thêm thơng tin rank c a ti n trình ch a giá tr l n nh t
integer,double,và long double
MPI_MINLOC Tính giá tr nh nh t và thêm thơng tin rank c a ti n trình ch a giá tr nh nh t
integer,double,và long double
4.4.3.2. M t s ki u tính tốn do ng i dùng đnh ngh a
vi t m t hàm v i ch c n ng do ng i dùng đnh ngh a d a vào thu t tốn c a hàm MPI_Reduce cung c p cĩ th th c hi n theo 3 b c sau :
Ki m tra ph ng pháp tính tốn cĩ phù thu c vào nh ng yêu c u sau
đây khơng?
B c 1: Cĩ tính k t h p Ví d a + (b+c)=(a+b)+c
Ví d a+b=b+a
B c 2 : b sung tốn t vào hàm g p (reduction) theo quy t c sau
Hàm myfunc(void *in,void *inout,int *len,MPI_Datatype *datatype)
B c 3 : ng ký hàm này v i MPI int commute,myop; commute=1 MPI_Op_create(myfunc,commute,&myop) MPI_Reduce(...,myop,..) Hình 4-16 : S d ng 8 x lý đ tính giá tr tuy t đ i M t s hàm tính tốn g p cịn l i :
MPI_Allreduce(void *sendbuf,void *recvbuf,int count,MPI_Datatype datatype,MPI_Op op,MPI_Comm comm)
C ng gi ng nh hàm MPI_Reduce nh ng t t c các x lý trong cùng m t communicator s nh n giá tr tính tốn đ c
Hình 4-17 Hàm Mpi-Allreduce
MPI_Reduce_scatter(void *sendbuf,void *recvbuf,int
recvcount,MPI_Datatype datatype,MPI_Op op,MPI_Comm comm)
MPI_Reduce_scatter th c hi n hai b c. B c th nh t là dùng tính tốn g p trên m i giá tr t b đ m g i (và d nhiên là m i giá tr này s l u trong m t m ng). Sau đĩ m ng này s đ c phân chia ra thành n đo n (v i n là s x lý). o n th i s ch a giá tr th i trong m ng đã tính tốn. Và đo n th i s đ c g i đ n x lý th i và l u trong b đ m nh n.
Hình 4-18 : Hàm MPI_Reduce_scatter
MPI_Scan(void *sendbuf, void *recvbuf, int count, MPI_Datatype datatype,MPI_Op op, MPI_Comm comm)
MPI_Scan(...) đ c s d ng đ th c hi n m t d ng tính tốn g p theo ki u Reduction trên nh ng v i ti n trình i, k t qu s là th c hi n tính tốn g p trên các ti n trình t 0 d n i. Hình v sau đây s minh h a rõ h n v đi u này
Hình 4-19 : Hàm MPI_Scan
4.5. Các ki u d li u
4.5.1. Nh ng ki u d li u đã đ c đnh ngh a
Ki u d li u c a MPI Ki u d li u c a C
MPI_CHAR signed char
MPI_SHORT signed short int
MPI_INT signed int
MPI_LONG signed long int MPI_UNSIGNED _CHAR unsigned char MPI_UNSIGNED_SHORT unsigned short int
MPI_UNSIGNED unsigned int
MPI_UNSIGNED_LONG unsigned long int
MPI_FLOAT float MPI_DOUBLE double MPI_LONG_DOUBLE long double MPI_BYTE MPI_PACKED Ki u d liêu khác
MPI_BYTE khác v i MPI_CHAR, v i m t s máy tính thì MPI_CHAR cĩ th là m t ký t 8 bit (1 byte), nh ng m t s máy khác thì MPI_CHAR cĩ
T t c các ki u d li u cịn l i g n gi ng v i các ki u d li u c a C. Ngồi ra cịn cĩ thêm ki u d li u MPI_Packed, m t d ng d li u nén mà chúng ta s đ c p sau.
4.5.2. Các ki u d li u b sung
Ngồi nh ng ki u d liêu do MPI cung c p nh MPI_BYTE, MPI_DOUBLE v.v…thì MPI cịn cung c p kh n ng cho vi c đnh ngh a chính c u trúc d li u d a trên các d ng d li u chính. Nh ng c u trúc do ng i dùng
đnh ngh a đ c g i là d ng d li u b sung.
MPI cung c p m t s ph ng pháp cho vi c c u trúc nh ng ki u d li u sau đây : + Contiguous + Vector + Indexed + Struct 4.5.2.1. Contiguous C u trúc đ n gi n nh t. S n sinh ra m t d ng d li u m i b ng cách t o m t s l ng nh ng b n sao chép c a m t d ng d li u đã cĩ.
MPI_Type_contiguous(in count,in oldtype, out *newtype)
MPI_Type_vector(int count,int blocklenght,int stride, MPI_Datatype oldtype, MPI_Datatype*newtype)
C ng gi ng nh contiguous, nh ng cho phép khoanh vùng d li u mu n
đ c t .MPI_Type_hvector c ng gi ng nh MPI_Type_vector ngo i tr ph m