【正文】
n d ( r e q u e st 2, 32 , Q ) P r oc e ss Q: w h il e ( t r u e ) { r e c v ( r e c e iv e d _r e q u e st , 32 , A n y _P r oc e ss) 。 p r oc e ss r e c e iv e d _r e q u e st 。 } P r oc e ss P : sen d (r e q u e st1, 32, Q, tag1) P r oc e ss R: sen d (r e q u e st2, 32, Q , tag2) P r oc e ss Q : w h i l e (t r u e ){ r e c v (r e c e i v e d _r e q u e st, 32, An y _P r oc e ss , An y _T ag, S tat u s)。 i f ( S tat u s. T ag== tag1) p r oc e ss r e c e i v e d _r e q u e st i n on e w ay 。 i f ( S tat u s. T ag== tag2) p r oc e ss r e c e i v e d _r e q u e st i n an oth e r w ay 。 } MPI消息 (消息標(biāo)簽 ) 33 ? 通信域 (Communicator)包括 進(jìn)程組(Process Group)和 通信上下文(Communication Context)等內(nèi)容,用于描述通信進(jìn)程間的通信關(guān)系。 ? 通信域分為組內(nèi)通信域和組間通信域,分別用來(lái)實(shí)現(xiàn) MPI的 組內(nèi)通信 (Intramunication)和 組間通信 (Intermunication)。 2 MPI 組成 MPI消息 (通信域 ) ? 進(jìn)程組是進(jìn)程的有限、有序集。 – 有限意味著,在一個(gè)進(jìn)程組中,進(jìn)程的個(gè)數(shù) n是有限的,這里的 n稱(chēng)為 進(jìn)程組大小 (Group Size)。 – 又序意味著,進(jìn)程的編號(hào)是按 0,1, … , n1排列的 ? 一個(gè)進(jìn)程用它在一個(gè)通信域 (組 )中的編號(hào)進(jìn)行標(biāo)識(shí)。組的大小和進(jìn)程編號(hào)可以通過(guò)調(diào)用以下的 MPI函數(shù)獲得 : – MPI_Comm_size(municator, amp。group_size) – MPI_Comm_rank(municator, amp。my_rank) 2 MPI 組成 MPI消息 (通信域 ) MPI消息 (消息狀態(tài) ) ? 消息狀態(tài) (MPI_Status類(lèi)型 )存放接收消息的狀態(tài)信息,包括 : 消息的源進(jìn)程標(biāo)識(shí)-- MPI_SOURCE 消息標(biāo)簽-- MPI_TAG 錯(cuò)誤狀態(tài)-- MPI_ERROR 其他--包括數(shù)據(jù)項(xiàng)個(gè)數(shù)等,但多為系統(tǒng)保留的。 ? 是消息接收函數(shù) MPI_Recv的最后一個(gè)參數(shù)。 ? 當(dāng)一個(gè)接收者從不同進(jìn)程接收不同大小和不同標(biāo)簽的消息時(shí),消息的狀態(tài)信息非常有用 2 MPI 組成 MPI消息 (消息狀態(tài) ) ? 假設(shè)多個(gè)客戶(hù)進(jìn)程發(fā)送消息給服務(wù)進(jìn)程請(qǐng)求服務(wù),通過(guò)消息標(biāo)簽來(lái)標(biāo)識(shí)客戶(hù)進(jìn)程,從而服務(wù)進(jìn)程采取不同的服務(wù) ? while (true){ MPI_Recv(received_request,100,MPI_BYTE,MPI_Any_source,MPI_Any_tag,m,amp。Status)。 switch () { case tag_0: perform service type0。 case tag_1: perform service type1。 case tag_2: perform service type2}} 2 MPI 組成 include int main( int argc, char** argv ){ int rank, size, tag=1。 int senddata,recvdata。 MPI_Status status。 MPI_Init(amp。argc, amp。argv)。 MPI_Comm_rank(MPI_COMM_WORLD, amp。rank)。 MPI_Comm_size(MPI_COMM_WORLD, amp。size)。 if (rank==0){ senddata=9999。 MPI_Send( amp。senddata, 1, MPI_INT, 1, tag, MPI_COMM_WORLD)。} if (rank==1) MPI_Recv(amp。recvdata, 1, MPI_INT, 0, tag, MPI_COMM_WORLD, amp。status)。 MPI_Finalize()。 return (0)。}