MPI筆記-計(jì)算機(jī)軟件及應(yīng)用-IT計(jì)算機(jī)-專業(yè)資料_第1頁
MPI筆記-計(jì)算機(jī)軟件及應(yīng)用-IT計(jì)算機(jī)-專業(yè)資料_第2頁
MPI筆記-計(jì)算機(jī)軟件及應(yīng)用-IT計(jì)算機(jī)-專業(yè)資料_第3頁
MPI筆記-計(jì)算機(jī)軟件及應(yīng)用-IT計(jì)算機(jī)-專業(yè)資料_第4頁
已閱讀5頁,還剩13頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

1,數(shù)據(jù)類型MPI_Status狀態(tài)類型MPLAint 地址偏移類型MPI.Datatype數(shù)據(jù)類型MPI_Comm通信域類型MPI_Group組類型MPLOp歸約操作類型MPI_RequestMPI_ErrhandlerMPI_Copy_functionMPI_Delete_functionMPI_User_function2.MPI預(yù)定義的與C一致的數(shù)據(jù)類型MPI預(yù)定義數(shù)據(jù)類型相應(yīng)的cMPICHARsignedcharMPLSHORTsignedshortintMPIINTsignedintMPLLONGsignedlongintMPIUNSIGNEDCHARunsignedcharMPIUNSIGNED_SHORTunsignedshortintMPLUNSIGNEDunsignedintMPIUNSIGNED-LONGunsignedlongintMPLFLOATfloatMPLDOUBLEdoubleMPLLONG-DOUBLElongdoubleKPLBYTE無對(duì)應(yīng)類型MPIPACKED無對(duì)應(yīng)類型附加的數(shù)據(jù)類型:MPLLONG.LONG」NT longlongint其他:復(fù)數(shù)型(MPLCOMPLEX)、邏輯型(MPLLOGICAL)、浮點(diǎn)型(MPLREALヽMPI_DOUBLE_PRECISION)3.MPI.MAXLOC和MPI.MINLOC在C中用到的類型MP1數(shù)據(jù)類型對(duì)應(yīng)的c類型MPIFLOATINTstruct[float,int|MPILONGINTstruct{long,int}MPIDOUBLEINTstruct{double,int}MPISHORTINTstruct{short,int)MPI2INTstruct!inuint!MPI_LONG_DOUBLE_INTstmct{longdouble,int};可選MPI_LONG_LONG_INTstruct{longlong,int}:可選MPI數(shù)據(jù)類型用途MPIPACKEDForMPIPackandMPIUnpackMPIUBForMPITypestruct;anupper-boundindicatorMP1_LBForMPITypestruct;alower-boundindicator5.通信域,在C中其類型為MPI.Comm可用的預(yù)定義通信域含義MPI_COMM_WORLD包含所有進(jìn)程MP1_COMM_SELF只包含調(diào)用進(jìn)程本身.進(jìn)程組,進(jìn)程組在C中是MPI_Group類型預(yù)定義進(jìn)程組含義MPI_GROUP_EMPTY不包含任何成員的進(jìn)程組.進(jìn)程組比較結(jié)果比較返回的結(jié)果含義MPIJDENT完全相同MPI_CONGRUENT進(jìn)程組完全相同MPI_SIM1LAR成員相同但順序不同MPIJJNEQUAL不同.組調(diào)用,ー些組調(diào)用要進(jìn)行運(yùn)算操作(MPI_REDUCE,MP1.ALLREDUCE,MPI_REDUCE_SCATTER,MPI_SCAN),該操作的類型在C中是MPI_Op類型發(fā)定義也調(diào)用操作及ヤ含義MPLMAX?大他MPIMIN?小被MPI.SUM求和MPI-PROD求61MPLLAND邏班ワMPI.BAND技位與MPI_LOR選拗或MPLBOR技位或MPI_LXOR邏釈片或MPI^BXOR技位異或MPLMINLOC返回最小值和位置MPLMAXLOC返回最大位和位置.關(guān)鍵字值關(guān)鍵字含義MPI_TAG_UB最大的!ag標(biāo)識(shí)數(shù)值MPIJ4OSテ主進(jìn)程標(biāo)識(shí)MPIJOI/O進(jìn)程標(biāo)識(shí)MPI_WTIME_IS_GLOBAL若MPI_WTIME全局同步則返回1

無效對(duì)象標(biāo)識(shí)含義MP1_COMM_NULL無效通信域MP1_OP_NULL無效操作MP1_GROUP_NULL無效進(jìn)程組MPLDATATYPE_NULL無效數(shù)據(jù)類型MP1_REQUEST_NULL無效對(duì)象MPI_ERRHANDLER_NULL無效錯(cuò)誤句柄11.預(yù)定義常量常量:名含義MPI_MAX_PROCESSOR_NAME機(jī)器名最大長度MP1_MAX_ERROR_STR1NG錯(cuò)誤字符串最大長度MPI-UNDEFINED用于無定義或不知道的整數(shù)值MPI_UNDEF【NED_RANK不知道的進(jìn)程標(biāo)識(shí)MP1_KEYVAL_INVAUD未初始化的無效關(guān)鍵字值mpi_bsend_6verhead緩存發(fā)送時(shí)增加的空間MP1_PROC_NULL空的進(jìn)程標(biāo)識(shí)MPI_ANY_SOURCE從任何源接收MPI_ANY_TAG匹配任何lag標(biāo)識(shí)MP1_BOTTOM地址空冋的絕対起始地址12.拓?fù)漕愋屯負(fù)漕悇e臺(tái)乂MP1_GRAPH通用圖拓?fù)銶PLCART笛卡兒拓?fù)?MPI狀態(tài),MPLStatus數(shù)據(jù)類型的結(jié)構(gòu),它包括三個(gè)成員狀態(tài)成員含義MPI_SOURCE發(fā)送消息的進(jìn)程MP1_TAG該消息的標(biāo)識(shí)MPI_ERROR返回的錯(cuò)誤代碼.其它類型與函數(shù)MPI-Aintc中的地址類型MPl_HandlerfunctionC中處理錯(cuò)誤的函數(shù)MPI_User_functionC中的用戶定義函數(shù)MPl_Copy_function屬性拷貝函數(shù)MP1_NULL_COPY_FN預(yù)定義拷貝函數(shù)MPl_Delete_function刪除屬性函數(shù)MP1_NULL_DELETE_FN刪除函數(shù)MPI_DUP_FN豆制函數(shù)mpi_errors_are_fatal強(qiáng)制退出的錯(cuò)誤句柄MPI_ERRORS_RETURN返回錯(cuò)誤代碼的句柄

錯(cuò)誤代碼含義MPI_SUCCESS成功MPI_ERR_BUFFER無效緩沖區(qū)指針MP1_ERR_COUNT無效記數(shù)參數(shù)MPI_ERR_TYPE無效數(shù)據(jù)類型MPI_ERR_TAG無效tag標(biāo)識(shí)MPI_ERR_COMM無效通信域MP1_ERR_RANK無效進(jìn)程標(biāo)識(shí)MPI_ERR_ROOT無效ROO!根進(jìn)程MP1_ERR_GROUP傳遞給函數(shù)的組為空MPI_ERR_OP無效操作MP1_ERR_TOPOLOGY無效拓?fù)銶PI_ERR_DIMS不合法的維MPI_ERR_ARG無效參數(shù)MP1_ERR_UNKNOWN未知的錯(cuò)誤MPI_ERR_TRUNCATE接收時(shí)'消息被核斷MPI_ERR_OTHER用錯(cuò)誤字符串表示的其它錯(cuò)誤MP1_ERR_INTERN內(nèi)部錯(cuò)誤代碼MPI_ERRJN_STATUS錯(cuò)誤在status中MPI_ERR_PENDING孤立掛起對(duì)象MPI_ERR_REQUEST不合法的對(duì)象句柄MPI_ERR_LASTCODE最后ー個(gè)錯(cuò)誤代碼MPI的類型匹配規(guī)則MPI_BYTE和MPI.PACKED可以和任何以字節(jié)為單位的存儲(chǔ)相匹配,包含這些字節(jié)的類型是任意的,MPI_TYPE用于不加修改地傳送內(nèi)存中的二進(jìn)制值,MPLPACK用于數(shù)據(jù)的打包和解包(MPLUNPACK)。類型匹配規(guī)則可以概括為:有類型數(shù)據(jù)的通信,發(fā)送方和接收方均使用相同的數(shù)據(jù)類型。無類型數(shù)據(jù)的通信,發(fā)送方和接收方均以MPLBYTE作為數(shù)據(jù)類型。打包數(shù)據(jù)的通信,發(fā)送方和接收方均使用MPLPACKED.發(fā)送MPLPACKED格式的數(shù)據(jù)可以用任意數(shù)據(jù)類型來接收,只要它和實(shí)際接收到的消息的數(shù)據(jù)類型相匹配;以任何類型發(fā)送的消息(包括MPLPACKED類型)都可以用MPLPACKED類型接收。MPI通信域MPI通信域包括兩部分:進(jìn)程組和通信上下文。進(jìn)程組即所有參加通信的進(jìn)程的集合。通信上下文提供ー個(gè)相對(duì)獨(dú)立的通信區(qū)域,不同的消息在不同的上下文中進(jìn)行傳遞,不同上下文的消息互不干涉,通信上下文可以將不同的通信區(qū)別開來。18,安全的通信調(diào)用次序當(dāng)兩個(gè)進(jìn)程需要相互交換數(shù)據(jù)時(shí),ー個(gè)進(jìn)程的發(fā)送操作在前,接收操作在后;而另一個(gè)進(jìn)程的接收操作在前,發(fā)送操作在后,前后兩個(gè)發(fā)送和接收操作要相互匹配。

MP!并行程序的兩種基本模式對(duì)等模式:MPI程序的各個(gè)進(jìn)程的功能、地位相同或相近,MPI程序的代碼也應(yīng)該是相近的,所不同的只是處理的對(duì)象和操作的數(shù)據(jù)。主從模式:MPI程序的各個(gè)進(jìn)程所起的作用和地位并不相同,一個(gè)或者ー些進(jìn)程完成一類任務(wù),而另外的進(jìn)程完成其它的任務(wù),這些功能或者地位不同的進(jìn)程所對(duì)應(yīng)的代碼也有較大的差別。虛擬進(jìn)程虛擬進(jìn)程(MPLPROC一NULL)是不存在的假想進(jìn)程,在MPI中的主要作用是充當(dāng)真實(shí)進(jìn)程通信的目或源。一個(gè)真實(shí)進(jìn)程向虛擬進(jìn)MPI_PRC_NULL發(fā)送消息時(shí)會(huì)立即成功返回,一個(gè)真實(shí)進(jìn)程從虛擬進(jìn)程MPLPROC一NULL的接收消息時(shí)也會(huì)立即成功返回,并且對(duì)接收緩沖區(qū)沒有任何改變。MPI的四種通信模式表格6MPI的通信模式通信模式發(fā)送接收標(biāo)準(zhǔn)通信模式MP1_SENDMP1_RECV緩存通信模式MPLBSEND同步通信模式MPI_SSEND就緒通信模式MPI_RSEND標(biāo)準(zhǔn)通信模式:是否對(duì)發(fā)送的數(shù)據(jù)進(jìn)行緩存是由MPI自身決定的,而不是山并行程序員來控制。對(duì)于非阻塞通信,發(fā)送操作雖然沒有完成,但是發(fā)送調(diào)用可以正確返冋。進(jìn)程1進(jìn)程1接收消息不依賴 依賴接收埠程す接喔進(jìn)程發(fā)送完成緩存消息發(fā)送完成全部接收開始接收發(fā)送完成緩存消息發(fā)送完成全部接收開始接收?qǐng)D32標(biāo)準(zhǔn)通信模式緩存通信模式:由用戶直接對(duì)通信緩沖區(qū)進(jìn)行申請(qǐng)、使用和釋放。緩存通信模式不管接收操作是否啟動(dòng),發(fā)送操作都可以執(zhí)行,當(dāng)緩存發(fā)送返回后,只有當(dāng)緩沖區(qū)中的消息發(fā)送出去后,ォ可以釋放該緩沖區(qū)。對(duì)丁?非阻塞發(fā)送,正確退出并不意味者緩沖區(qū)可以被其它的操作任意使用。發(fā)送進(jìn)程發(fā)送進(jìn)程圖33緩存通信模式MPLBUFFER.ATTACH將大小為size的緩沖區(qū)遞交給MPLMPLBUFFER-DETACH將提交的大小為size的緩沖區(qū)buffer收回,該調(diào)用是阻塞調(diào)用,它一直等到使用該緩存的消息發(fā)送完成后才返回。#include"mpi.h"#include<stdio.h>intmain(intargc,char*argv[])(intid,size;MPI_Statusstatus;MPI_Init(&argc,&argv);MPI_Comm_rank(MPI_COMM_WORLD,&id);if(id==O)intse=100;int*buffer,*dbuffer,bsize,dsize;MPI_Pack_size(1,MPI_INT,MPI_COMM_WORLD,&bsize);buffer=(int*)malloc(bsize+MPI_BSEND_OVERHEAD);if(!buffer){fprintf(stderr,uCan'tallocatebsendbufferofsize%d\nM,bsize);MPI_Abort(MPI_COMM_WORLD,1);)MPI_Buffer_attach(buffer,bsize+MPI_BSEND_OVERHEAD);MPI_Bsend(&se,1,MPI_INT,1,99,MPI_COMM_WORLD);MPI_Buffer_detach(&dbuffer,&dsize);}else(intre;MPI_Recv(&re,1,MPI」NT,0,99,MPI_COMM_WORLD,&status);printf(Hid=%dreceived%d\n”,id,re);}MPI_Finalize();)同步通信模式:同步發(fā)送卻必須等到相應(yīng)的接收進(jìn)程開始后オ可以正確返回。同步發(fā)送返回后,意味著發(fā)送緩沖區(qū)中的數(shù)據(jù)已經(jīng)全部被系統(tǒng)緩沖區(qū)緩存,因此發(fā)送緩沖區(qū)可以被釋放或重新使用。圖34同步通信模式就緒通信模式:只有當(dāng)接收進(jìn)程的接收操作已經(jīng)啟動(dòng)時(shí),發(fā)送進(jìn)程才可以肩動(dòng)發(fā)送操作,發(fā)送的正確返回則發(fā)送緩沖區(qū)可以重復(fù)使用。要求接收操作先于發(fā)送操作而被啟動(dòng)。對(duì)于非阻塞發(fā)送操作的正確返回,并不意味著發(fā)送已完成。22.非阻塞通信阻塞通信:發(fā)送進(jìn)程接收進(jìn)程圖35就緒通信模式明塞與萋阻塞調(diào)用的対比阻?通信 非阻?通信在通信完成之前不能做其它的事情22.非阻塞通信阻塞通信:發(fā)送進(jìn)程接收進(jìn)程圖35就緒通信模式明塞與萋阻塞調(diào)用的対比阻?通信 非阻?通信在通信完成之前不能做其它的事情在通信執(zhí)行過程中可以執(zhí)行其セ操作圖45阻塞消息發(fā)送和接收非阻塞通信:主要用于計(jì)算和通信的重疊,在該通信硬件完成該通信操作的同時(shí),處理機(jī)可以同時(shí)進(jìn)行計(jì)算操作。由于當(dāng)非阻塞通信調(diào)用返回時(shí)一般該通信操作還沒有完成,因此對(duì)于非阻塞的發(fā)送操作,發(fā)送緩沖區(qū)必須等到發(fā)送完成后才能釋放。同理對(duì)于非阻塞的接收操作,該調(diào)用返回后并不意味著接收消息已全部到達(dá),必須等到消息到達(dá)后オ可以引用接收到的消息數(shù)據(jù)。

表格7非阻塞MPI通信模式通信模式發(fā)送接收標(biāo)準(zhǔn)通信模式MP1JSENDMPI_IRECV緩存通信模式MPIJBSEND同步通信模式MPLISSEND就緒通信模式MP1JRSEND重復(fù)非阻塞通信標(biāo)準(zhǔn)通信模式MPI_SENDJNITMP1_RECVJNIT緩存通信模式MPLBSENDJNIT同步通信模式MP1_SSEND_INIT就緒通信模式MPIRSENDJN1T表格8非阻塞通信的完成與檢測(cè)非阻塞通信的數(shù)量檢測(cè)完成ー個(gè)非阻塞通信MP1_TESTMP1_WAIT任意ー個(gè)非阻塞通信MP1_TESTANYMPI_WAITANY一到多個(gè)非阻塞通信MP1_TESTSOMEMPI_WAITSOME所有非阻塞通信MPI_TESTALLMPI_WAITALL阻塞發(fā)送非阻塞發(fā)送標(biāo)準(zhǔn)通信模式緩存通信模式同步通信模式就緒通信模式標(biāo)準(zhǔn)通信模式緩存通信模式同步通信模式就緒通信模式阻塞發(fā)送非阻塞發(fā)送圖48不同類型的發(fā)送與接收的匹配非阻塞標(biāo)準(zhǔn)通信:MPIJSEND:調(diào)用返回立即返回,并不意味著消息已經(jīng)成功發(fā)送它只表示該消息可被發(fā)送。MPIJRECV:調(diào)用的返回并不意味著已經(jīng)接收到了相應(yīng)的消息,它只表示符合要求的消息可以被接收。非阻塞同步通信:MPIJSSEND,返回只是意味著相應(yīng)的接收操作已經(jīng)啟動(dòng),并不表示消息發(fā)送的完成。非阻塞緩存通信:需要程序員主動(dòng)為該發(fā)送操作提供發(fā)送緩沖區(qū)。非阻塞就緒通信:MPIJRSEND,當(dāng)調(diào)用啟動(dòng)之前相應(yīng)的接收操作必須已經(jīng)啟動(dòng)。.非阻塞通信的MPI_WAIT與MPI.TEST單個(gè)非阻塞通信:MPLWAIT:等到非阻塞通信完成后オ返回,同時(shí)釋放該阻塞通信對(duì)象。MPLTEST:若該非阻塞通信已經(jīng)結(jié)束,則它和MPLWAIT的效果完全相同,完成標(biāo)志flag=true!若非阻塞通信還沒有完成,不必等待該非阻塞通信的完成而是可以直接返回,但是完成標(biāo)志flag=false,同時(shí)也不釋放相應(yīng)的非阻塞通信對(duì)象。多個(gè)非阻塞通信:MPLWAITANY:等待非阻塞通信對(duì)象表中任何一個(gè)非阻塞通信對(duì)象i的完成,釋放已完成的非阻塞通信對(duì)象然后返回,index=i,即完成的是非阻塞通信對(duì)象表中的第i個(gè)對(duì)象對(duì)應(yīng)的非阻塞通信。MPLWAITALL:必須等到非阻塞通信對(duì)象表中所有的非阻塞通信對(duì)象相應(yīng)的非阻塞操作都完成后オ返回。MPLWAITSOME:只要有一個(gè)或多個(gè)非阻塞通信完成,則該調(diào)用就返回。MPLTESTANY:測(cè)試非阻塞通信對(duì)象表中是否有任何ー個(gè)對(duì)象已經(jīng)完成,如真則令flag=ture,否則為false?MPLTESTALL:當(dāng)所有的非阻塞通信對(duì)象都完成時(shí),オ使得。ag=true返回,并且釋放所有的查詢對(duì)象:只要有任何ー個(gè)沒有完成,則為false返回。MPI_TESTSOME:測(cè)試有幾個(gè)非阻塞通信對(duì)象已完成。.非阻塞通信對(duì)象MPI_Request*非阻塞通信對(duì)象是MPI內(nèi)部的對(duì)象,通過ー個(gè)句柄存取,可以識(shí)別各種通信操作和判斷相應(yīng)的非阻塞操作是否完成。所有的非阻塞發(fā)送或接收通信都會(huì)返回?個(gè)’‘非阻塞通信對(duì)象“。非阻塞通信的取消MPLCancel:若取消操作調(diào)用時(shí)相應(yīng)的非阻塞通信已經(jīng)開始,則它會(huì)正常完成,不受取消操作的影響:若取消操作調(diào)用時(shí)相應(yīng)的非阻塞通信還沒有開始,則可以釋放通信占用的資源,取消該非阻塞通信。對(duì)于非阻塞通信,即使調(diào)用了取消操作,也必須調(diào)用非阻塞通信的完成操作或查詢對(duì)象的釋放操作來釋放查詢對(duì)象。如果ー個(gè)非阻塞通信已經(jīng)被執(zhí)行了取消操作,則該通信的MPLWAIT或MPLTEST將釋放取消通信的非阻塞通信對(duì)象,并且在返回結(jié)果status中指明該通信已經(jīng)被取消。判斷是否取消MPI_TEST_CANCELLED:若返回結(jié)果flag=true,則表明該通信」經(jīng)被成功取消,否則說明該通信還沒有被取消。#include"mpi.h"#include<stdio.h>intmain(intargc,char*argv[])(intid,size,flag;MPI_Requestrequest;MPI_Statusstatus;MPI_Init(&argc,&argv);MPI_Comm_rank(MPI_COMM_WORLD,&id);if(id==O)(intsbuf=100;MPI_Send(&sbuf,1,MPIJNT,1,99,MPI_COMM_WORLD);)else(intrbuf;MPI_Irecv(&rbuf,1,MPIJNT,0,99,MPI_COMM_WORLD,&request);MPI_Cancel(&request);MPI_Wait(&request,&status);//必須調(diào)用此函數(shù),以確保真的取消了MPI_Test_cancelled(&status,&flag);if(flag)(printf("%d\n”,request);〃若取消成功后,兩者ー樣printf("%d\n”,MPI_REQUEST_NULL);〃若取消成功后,兩者ー樣})MPI_Finalize();非阻塞通信對(duì)象的釋放MPI_Request_free:直接將該對(duì)象所占用的資源釋放,原來的非阻塞通信對(duì)象request變?yōu)镸PI_REQUEST_NULL?如果與該非阻塞通信對(duì)象相聯(lián)系的通信還沒有完成,則該對(duì)象的資源并不會(huì)立即移放,它將等到該非阻塞通信結(jié)束后再釋放。.檢査消息是否到達(dá)非阻塞檢查MPI」probe:如果存在ー個(gè)消息可被接收且該消息的信封和MPIJPROBE的消息信封相匹配,則該調(diào)用返冋flag=true和相應(yīng)的status:否則,立即返回結(jié)果flag=false并且不對(duì)status定義。參數(shù)可以是MPLANY-SOURCE、MPI_ANY.TAG。阻塞檢查MPLPROBE:是ー個(gè)阻塞調(diào)用,只有找到ー個(gè)匹配的消息到達(dá)之后它オ會(huì)返回。非阻塞通信有序接收的語義約束:根據(jù)程序的書寫順序,先發(fā)送的消息一定被先匹配的接收調(diào)用接收。若在實(shí)際運(yùn)行過程中后發(fā)送的消息先到達(dá),它也只能等待。.重復(fù)非阻塞通信如果一個(gè)通信會(huì)被重復(fù)執(zhí)行如循環(huán)結(jié)構(gòu)內(nèi)的通信調(diào)用,MP!對(duì)這樣的通信進(jìn)行優(yōu)化。重復(fù)非阻塞通信需要如下步驟:1通信的初始化,比如MPI_SEND_INIT2啟動(dòng)通信,MPI_START < 重復(fù)3完成通信,MP1_WAIT ?14杼放査詢對(duì)象,MP1_REQUEST_FREE消息真正開始通信是由MPLSTART觸發(fā)的;消息的完成操作并不釋放相應(yīng)的非阻塞通信對(duì)象只是將其狀態(tài)置為非活動(dòng)狀態(tài)。初始化重復(fù)非阻塞通信MPI_Send_init:MPI_Bsend_init:MPI_Ssend_init:MPI_Rsend_init:MPI_Recv_init:啟動(dòng)非阻塞通信MPI_Start:MPI_Startall:ー個(gè)用MPLSTART初始化的發(fā)送操作可以被任何接收操作匹配,類似地,ー個(gè)用MPLSTART初始化的接收操作可以接收任何發(fā)送操作產(chǎn)生的消息。.組通信(通信、同步、計(jì)算)k廣播MPLBcast2、收集MPI_Gather>MPI_Gatherv3、散發(fā)MPI_Scatter、MPI_Scatterv4、組收集MPI_Allgather>MPI_Allgatherv5、全交換MPLAlltoall、MPI_Aalltoallv#includeumpi.h"#include<stdlib.h>#include<stdio.h>intmain(intargc,char*argv[])(intrank,size;intchunk=2;//每個(gè)進(jìn)程的數(shù)據(jù)的個(gè)數(shù)inti,j;int*sb;int*rb;intstatus,gstatus;MPI_Init(&argc,&argv);MPI_Comm_rank(MPI_COMM_WORLD,&rank);MPI_Comm_size(MPI_COMM_WORLD,&size);sb=(int*)malloc(size*chunk*sizeof(int));rb=(int*)malloc(size*chunk*sizeof(int));for(i=0;i<size;i++)(for(j=0;j<chunk;j++){sb[i*chunk+j]=i*chunk+j;printf(nmyid=%d,sendtoid=%d,data[%d]=%d\n",rank,i,j,sb[i*chunk+j]);rb[i*chunk+j]=0;})MPI_Antoall(sb,chunk,MPI」NT,rb,chunk,MPIJNT,MPI_COMM_WORLD);for(i=0;i<size;i++)(for(j=0;j<chunk;j++){printf(umyid=%d,recvfromid=%d,data[%d]=%d\nn,rank,i,j,rb[i*chunk+j]);))free(sb);free(rb);MPI_Finalize();6、同步MPLBaEerフ、歸約MPI_Reduce8、組歸約MPLAllreduce9、歸約并散發(fā)MPI_Reduce_scatter10、掃描MPI_Scan11、MINLOC和MAXLOC的值對(duì)12、用戶自定義歸約操作:MPI_Op_create、MPI_Op_free、MPI_Type_contiguous、MPI_Type_commit、MPI_Op>MPI_Datatype.進(jìn)程組MPI_Group_sizeMPI_Group_rankMPI_Group_translate_ranksMPI_Group_compareMPI_Comm_groupMPI_Group_unionMPI__Group_intersectionMPI_Group_differnceMPI_Group_inclMPI_Group_exclMPI_Group_range_inclMPI_Group_range_exclMPI_Group_free.通信域MPI_Comm_sizeMPI_Comm_rankMPI_Comm_compareMPI_Comm_dupMPI_Comm_createMPI_Comm_splitMPI_Comm_free.組間通信域MPI_Comm_test_interMPI_Comm_remote_sizeMPI_Comm_remote_groupMPI_Intercomm_create.屬性信息.發(fā)送不連續(xù)的數(shù)據(jù):定義新的數(shù)據(jù)類型、數(shù)據(jù)的打包和解包派生數(shù)據(jù)類型:1、連續(xù)復(fù)制類型的生成MPI_Type_contiguous2、向量數(shù)據(jù)類型的生成MPI_Type_vector,,MPI_TYPE_CONTIGUOUS(count,oldtypc,newtype)調(diào)用等價(jià)于MPI_TYPE_VECTOR(count,1,1,oldtype,newtype)或調(diào)用MPI_TYPE_VECTOR(1,count,n,oldtype,newtype),n為升序3、索引數(shù)據(jù)類型的生成MPI_Type_indexed。ー個(gè)MPI_TYPE_VECTOR(count,blocklength,stride,oldtype,newtype)等價(jià)于調(diào)用MPI_TYPE_INDEXED(couni,B,D,oldtype,newtype)4、結(jié)構(gòu)數(shù)據(jù)類型的生成MPI_Type_structuMPI_TYPE_HINDEXED(count,B,D,oldtype,newtype)等價(jià)于調(diào)用MPI_TYPE_STRUCT(count,B,D,T,newtype),其中T的每一項(xiàng)都等于oldtype新類型遞交:MPI_Type_commit類型釋放:MPI_Type_free33.地址函數(shù)MPI_ADdress#include<stdio.h>#include"mpi.h"intmain(intargc,char**argv)(intrank;struct{inta;doubleb}value;/?定義ー個(gè)包含整型和雙精度型的結(jié)構(gòu)*/MPI_Datatypemystruct;intblocklens⑵;MPLAintindices[2];MPI_Datatypeold_types[2];MPI_Init(&argc,&argv);MPI_Comm_rank(MPI_COMM_WORLD,&rank);blocklens[0]=1;/?新數(shù)據(jù)類型中包含ー個(gè)整型?/blocklensll]=l;/?新數(shù)據(jù)類型中包含一個(gè)雙精度型*/old_types[0]=MPI.INT;/?新類型的第一個(gè)組成部分是整型?/oldjypes[l]=MPI,DOUBLE;/?新類型的第二個(gè)組成部分是雙精度型?//? 得到整型和雙精度型的相對(duì)位置*/MPI_Address(&value.a,&indices[O]);MPI_Address(&value.b,&indices[l]);/? 設(shè)置在新類型中的相對(duì)偏移?/indicesfl]=indices!1]-indices[0];indices⑼=0;MPI_Type_struct(2,blocklens,indices,old_types,&mystruct);/*生成新的MPI數(shù)據(jù)類型*/MPI_Type_commit(&mystruct);/?遞交?/do{if(rank==0)scanf(nInput:%d%lf;&value.a,&value.b);/?只有進(jìn)程〇讀需要廣播的整型和雙精度型數(shù)據(jù)?/MPI_Bcast(&value,1,mystruct,0,MPI_COMM_WORLD);/?對(duì)新數(shù)據(jù)類型表示的數(shù)據(jù)進(jìn)行廣播?/printf("Process%dgot%dand%lAn",rank,value.a,value.b);}while(value.a>=0);MPI_Type_free(&mystruct);/?新類型釋放*/MPI_Finalize();MPI_Type_extent:以字節(jié)為單位返回一個(gè)數(shù)據(jù)類型的跨度extentMPI_Type_size:返回給定數(shù)據(jù)類型有用部分所占空間的大小,即跨度減去類型中的空隙后的空間大小MPI_Get_elements:返回的則是以基本的類型為單位的數(shù)據(jù)的個(gè)數(shù)MPI_Get_count:返回的是以指定的數(shù)據(jù)類型為單位,接收操作接收到的數(shù)據(jù)的個(gè)數(shù)下界標(biāo)記類型:MPI_Type_lb上界標(biāo)記類型:MPI_Type_ub34.打包與解包打包(Pack)和解包(Unpack)操作是為了發(fā)送不連續(xù)的數(shù)據(jù),在發(fā)送前顯式地把數(shù)據(jù)包裝到,,個(gè)連續(xù)的緩沖區(qū);在接收之后從連續(xù)緩沖區(qū)中解包。入口參數(shù)position的值是輸出緩沖區(qū)中用于打包的起始地址,打包后它的值根據(jù)打包消息的大小來增加;出口參數(shù)position的值是被打包的消息占用的輸出緩沖區(qū)后面的第一個(gè)地址。相同類型數(shù)據(jù)的打包#include<stdio.h>#include"mpi.h"intmain(intargc,char**argv)(intid;intposition,i=100j=101,a[2];charbuffi1000];MPI_Statusstatus;MPI_Init(&argc,&argv);MPI_Comm_rank(MPI_COMM_WORLD,&id);if(id==0){position=0;/*打包的起始位置*/MPI_Pack(&i,l,MPI」NT,bufT,1〇00,&position,MPI_COMM_WORLD);printf(nposition:%d\nH,position);/*將整數(shù)i打包?/MPI_Pack(&j,1,MPI_INT,buff,100〇,々position,MPI_COMM_WORLD);printf("position:%d\n”,position);/?將整數(shù)j打包?/MPI_Send(buff,position,MPI.PACKED,1,0,MPI_COMM_WORLD);}elseif(id==l){MPI_Recv(a,2,MPI」NT,0,0,MPI_COMM_WORLD,&status);/?以整型從進(jìn)程0接收消息?/printf("processor%d

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論