操作系統(tǒng)分析MPI關(guān)鍵源代碼初步_第1頁(yè)
操作系統(tǒng)分析MPI關(guān)鍵源代碼初步_第2頁(yè)
操作系統(tǒng)分析MPI關(guān)鍵源代碼初步_第3頁(yè)
操作系統(tǒng)分析MPI關(guān)鍵源代碼初步_第4頁(yè)
操作系統(tǒng)分析MPI關(guān)鍵源代碼初步_第5頁(yè)
免費(fèi)預(yù)覽已結(jié)束,剩余90頁(yè)可下載查看

下載本文檔

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

文檔簡(jiǎn)介

常用的并行編程標(biāo)準(zhǔn)由MPI、PVM等,其中消息傳遞接口MPI以其移植性好、功能強(qiáng)MPICH的層次嵌套結(jié)構(gòu)及每一層主要實(shí)現(xiàn)的功能。通過(guò)源代碼分析,闡述了整個(gè)程序的流程以及關(guān)鍵語(yǔ)句的作用。隨后,MPICH最后總結(jié)了本所做工作的經(jīng)驗(yàn)與不足,以及需要繼續(xù)研究的問(wèn)題。Theappearanceofclustertechnologebroketheparrernofhigh-performancecomputermarketinlargeextent.Insomearea,thehigh-costandeasy-failurehigh-performancecomputerarereplacedbylow-costandhigh-stabilitycluster.Withthedevelopmentofhigh-performancecomputingtechnology,howtomakebetteruseofthecluster,designouthigh-effectandstableparallelpargramisoneofthehotspotincomputersciencefieldatpresent,alsohasbroadlyapplyingbackgroundandpracticalvalue.SomecommonusedparallelprogrammingstandardsareMPI,PVMetc.MPIstandardisedbecauseofitsportability,powerfulfunctionandefficiencyand ethemostleadingtools.Inthispaper,wechooseoneofthemostimpotantimplementationofMPI,toyzeitssourcecodeofsomekeyInthispaper,webeginwiththestandardsendfunctioninpoint-to-pointcommunicationanddescribethestructureandthemainfunctionsofeachlevel.Withtheyingofsourcecode,thecircuitofthewholeprogramandtheuseofsomekeysentencesaredescribed.Moreover,aspecificexampleisyzedandwedepictalltheprocessesfromuserinterfacetoinformationtransmissioninbottom.Atlast,theworkandexperienceofthispaperissummariedandtheissuesthatneedfurtherresearcharepointedout.Keyword:MPI,ParallelProgramming,SourceCode第一章緒遠(yuǎn)的影響,因此計(jì)算機(jī)被列為與理論分析與實(shí)驗(yàn)并列的第三種的科學(xué)研究[1]。同時(shí),高性能計(jì)算機(jī)也逐漸從大型進(jìn)入各大商業(yè)公司中,充當(dāng)更重要的角色?,F(xiàn)在的計(jì)算機(jī)比10年前性能提高超過(guò)100但更加復(fù)雜的數(shù)值模擬和計(jì)算機(jī)輔助設(shè)計(jì)對(duì)計(jì)算機(jī)的性研究的背景與意(SISD(SIMD,(MIMD隨著計(jì)算機(jī)的發(fā)展,向量機(jī)與SIMD計(jì)算機(jī)已經(jīng)退出了歷史的舞臺(tái)。當(dāng)代的主流是可擴(kuò)展的并行計(jì)算機(jī),包括多計(jì)算機(jī)( puter)和集中式多處理器(centralizedputer處理器之間通過(guò)傳遞消息來(lái)互相通信,如分布的大規(guī)模并行機(jī)(MPP)和工作站集(COWmutltiprocessor,SMP,是集盡管并行計(jì)算機(jī)系統(tǒng)體系結(jié)構(gòu)各有不同,但一個(gè)投入使用的并行計(jì)算機(jī)系統(tǒng),并行程(geingInterfae,消息傳遞接口)IIII和自己所使用系統(tǒng)設(shè)計(jì)出效率更高的并行程序。5]主要工MPICH2-1.0.328本文首先介紹并行計(jì)算環(huán)境集群然后介紹了I標(biāo)準(zhǔn)的產(chǎn)生和一些重要的術(shù)語(yǔ)概念。本文的內(nèi)容是對(duì)C2-1.0.3點(diǎn)對(duì)點(diǎn)函數(shù)接口及其實(shí)現(xiàn)的源代碼的分析。針對(duì)點(diǎn)對(duì)點(diǎn)通信的不同阻塞情況,本文分別分析了阻塞模式與非阻塞模式下的接收與發(fā)送功能的具體實(shí)現(xiàn)。另外,根據(jù)發(fā)送模式的不同,還具體分為緩沖模式發(fā)送,同步模式發(fā)送10個(gè)函數(shù)的接口與實(shí)現(xiàn)的源代碼。另外,對(duì)于底層的通信,Iet調(diào)用進(jìn)行底層的通信,本文的分析也涉及底層通信的原理與實(shí)現(xiàn)。本文的安第一章(本章)介紹了的研究背景,所進(jìn)行的主要工作以及文章的結(jié)構(gòu)安排。MPI并行程序設(shè)計(jì)環(huán)境作了簡(jiǎn)要的介紹,包括對(duì)計(jì)算機(jī)集群、MPI的歷史及MPII-1.0.3HI的通信原理及實(shí)現(xiàn)。第六章包含對(duì)本文的工作及經(jīng)驗(yàn)進(jìn)行總結(jié), 需要繼續(xù)研究的問(wèn)題第二章MPI并行程序設(shè)計(jì)環(huán)境介并行計(jì)算環(huán)境介一、設(shè)計(jì)全新的并行程序設(shè)計(jì)語(yǔ)言,可以完全擺脫串行語(yǔ)言的束縛,從語(yǔ)言成分上二、擴(kuò)展串行程序設(shè)計(jì)語(yǔ)言,使之能支持并行程序設(shè)計(jì)。這種方法與第一種相比, 就可以實(shí)現(xiàn)并行。MPI標(biāo)準(zhǔn)正是基于這種方式而產(chǎn)生的并行函數(shù)庫(kù)。線程級(jí)并行程序設(shè)計(jì)環(huán)境與語(yǔ)POSIXthreadOPENMPPOSIXthread簡(jiǎn)稱為pthread,是一個(gè)公認(rèn)的線程標(biāo)準(zhǔn)。該標(biāo)準(zhǔn)定義內(nèi)部API創(chuàng)建和線程。如今,Unix與Linux系統(tǒng)PthreadPthreadWindows操作系統(tǒng)。OpenMP是作為共享標(biāo)準(zhǔn)而問(wèn)世的。它是為在多處理機(jī)上編寫并行程序而設(shè)計(jì)的OpenMPC語(yǔ)言程序相似,只是在C程序中加入了OpenMP的編譯指示。這些編譯指示描述了程序應(yīng)該以何種進(jìn)程級(jí)并行程序設(shè)計(jì)環(huán)境與語(yǔ)ISP計(jì)算的 高擴(kuò)展性。當(dāng)用戶需要擴(kuò)展系統(tǒng)計(jì)算能力的時(shí)候,只需新的計(jì)算機(jī),添加四、高可靠性。集群與單機(jī)相比,大大提高了系統(tǒng)的可靠性,也降低了應(yīng)系用停運(yùn)PVMMPI。PVM(并行虛擬機(jī))1989成一個(gè)易于管理的,可擴(kuò)展的并行計(jì)算機(jī)資源。數(shù)年之后,又出現(xiàn)了MPI。MPI(消息傳行語(yǔ)言,同時(shí)提供并行實(shí)現(xiàn)并行功能。我們可以認(rèn)為,MPI是一個(gè)并行庫(kù),而不是一門新的語(yǔ)言。MPI1.1標(biāo)準(zhǔn)支持MPIFortranC語(yǔ)言綁定,2.0標(biāo)準(zhǔn)支持C++語(yǔ)言。因此Fortran+MPI、C++/C+MPIMPI函數(shù)的調(diào)用完全遵C/Fortran庫(kù)函數(shù)/過(guò)程的調(diào)用規(guī)則,與一般的函數(shù)/過(guò)程并無(wú)區(qū)別。另外,MPI是一種規(guī)范而不是特指它的實(shí)現(xiàn)。迄今為止,多數(shù)計(jì)算機(jī)系用都支持MPI。一個(gè)正確的MPI程序可MPI實(shí)現(xiàn)的計(jì)算機(jī)系統(tǒng)上運(yùn)行。[12]MPI的歷史與現(xiàn)MPI的歷MPI1992年,許多大學(xué)和組織為此付出了努力。1992429日至30日,在弗吉尼亞州堡召開的“分布環(huán)境中消息傳遞標(biāo)準(zhǔn)”討論會(huì)上,Dongarra,Hempel,HeyWalker提出了初始的建議,并在年月推出了初始的草案。年月,修正版的草案推出,這就是MPI1.0。19956MPI草案的MPI1.1MPI做了進(jìn)一步的修繕與擴(kuò)充。19977速發(fā)展,對(duì)MPI進(jìn)行了重大的擴(kuò)充,稱為MPI-2,而將先前的版本,統(tǒng)稱為MPI-1。MPI-2對(duì)MPI標(biāo)準(zhǔn)作了多方面擴(kuò)充,主要在下列面:并行I/O、動(dòng)態(tài)過(guò)程管理和訪MPI的現(xiàn)MPIMPICH: 是應(yīng)用最為廣泛的一個(gè) 實(shí)現(xiàn),可以上免費(fèi)獲得。Argonne國(guó)家及MSU對(duì)它做出了極大的貢獻(xiàn)。版本為MPICH2-1.0.7,而本文中所使用的版本是MPICH2-1.0.3。CHIMP:CHIMP是由Edinburgh開發(fā)的另一個(gè)免費(fèi)的MPI實(shí)現(xiàn),實(shí)在EPCCEdinburgh 的支持下進(jìn)行的。也可以從ftp://ftp.epcc.ed.ac.uk/pub/packages/chimp/release免費(fèi)獲得,版本為chimpv2.1.1。LAM(LocalArea puter發(fā)的。免費(fèi)為MPI主要接口函數(shù)及術(shù)六個(gè)基本接口函MPI-1128MPI-2159MPI是一個(gè)相當(dāng)大且復(fù)雜的函數(shù)庫(kù)。但從理論上來(lái)說(shuō),MPI6個(gè)最基本的調(diào)用來(lái)實(shí)現(xiàn),6個(gè)函數(shù)調(diào)用組成的完備子集可以所有消息傳遞的基本功能。[15]MPI函數(shù)接口對(duì)其參數(shù)的傳入方式有三種,分別是IN,OUT和INOUT。IN(輸入MPI的參數(shù),MPI除了使用該參數(shù)外不允許對(duì)這一參數(shù)做MPIINOUT(輸入輸出:調(diào)用部分首先將該參數(shù)傳遞給MPI,MPI對(duì)這一參數(shù)、修改MPIMPI初始化:MPI_INIT()C:intMPI_Init(int*argc,char***argv)Fortran:MPI_INIT(IERROR)INTEGERMPI結(jié)束:MPI_FINALIZE()函數(shù)原型:MPI_FINALIZE()C:intFortran:MPI_FINALIZE(IERROR)INTEGERIERRORMPI_FINALIZEMPIMPIMPI當(dāng)前進(jìn)程標(biāo)識(shí) comm.該進(jìn)程所在的通信域(句柄)outrank 調(diào)用進(jìn)程在comm中的標(biāo)識(shí)號(hào)C:int mcomm.,int*rank) M_RANK(COMM,RANK,IERROR)INTEGERCOMM,RANK,通信域包含的進(jìn)程數(shù) M_SIZE(comm,size) 通信域comm內(nèi)包括的進(jìn)程數(shù)(整數(shù))C:int mcomm.,int*size) M_SIZE(COMM,SIZE,IERROR)INTEGERCOMM,SIZE,函數(shù)原型:MPI_SEND(buf,count,datatype,desttag,發(fā)送緩沖區(qū)的其實(shí)地址(可選類型將發(fā)送端數(shù)據(jù)的個(gè)數(shù)(非負(fù)整數(shù)發(fā)送數(shù)據(jù)的數(shù)據(jù)類型(句柄目的進(jìn)程標(biāo)識(shí)(整型消息標(biāo)志(整型通信域(句柄C:intMPI_Send(void*buf,intcount,MPI_Datatype,intdest,inttag, mcomm)Fortran:MPI_SEND(BUF,COUNT,DATATYPE,DEST,TAG,COMM,IERROR)<type>Dcountdatatypedestta發(fā)送端消息和本進(jìn)程向同一目的進(jìn)程發(fā)送的其他消息區(qū)別開來(lái)。Dcountdatatye的連續(xù)數(shù)據(jù)空間組成,buf其中datatype數(shù)據(jù)類型可以是MPI對(duì)預(yù)定義類型也可以是用戶自定義的類型通過(guò)使MPI_SEND,可以發(fā)送不同類型的數(shù)據(jù)。函數(shù)原型:MPI_RECV(buf,count,datatype,source,tag,comm.,接收緩沖區(qū)的起始地址(可選數(shù)據(jù)類型最多可接收的數(shù)據(jù)的個(gè)數(shù)(整型接收數(shù)據(jù)的數(shù)據(jù)類型(句柄接收數(shù)據(jù)的來(lái)源即發(fā)送數(shù)據(jù)的進(jìn)程的進(jìn)程標(biāo)識(shí)號(hào)(整型消息表示,與相應(yīng)的發(fā)送操作的表示相匹配相同(整型本進(jìn)程和發(fā)送進(jìn)程所在的通信域(句柄返回狀態(tài)(狀態(tài)類型C:intMPI_Recv(void*buf,intcount,MPI_Datatypedatatype,intsource,inttag,mcomm.,MPI_Status*status)Fortran:MPI_RECV(BUF,COUNT,DATATYPE,SOURCE,TAG,COMM,STATUS, STATUS(MPI_STATUS_SIZE),IERRORMPI_REVCsource收進(jìn)程制定的datatype和tag相一致接收到的消息所包含的數(shù)據(jù)元素的個(gè)數(shù)最多countcountdatatyedatatyebufI沒有截?cái)啵邮站彌_區(qū)會(huì)發(fā)生溢出錯(cuò)誤,因此程序員要保證接收緩沖區(qū)的長(zhǎng)度不小于發(fā)送數(shù)據(jù)的長(zhǎng)度。如果一個(gè)短于接收緩沖區(qū)的消息到達(dá),那么只有相應(yīng)于這個(gè)消息的那些地址被修改。count可以是零,這種情況下消息的數(shù)據(jù)部分是空的。datatypeMPIMPI_RECV,可以接收不同類型的數(shù)據(jù)。MPI術(shù)第三章MPICH2源代碼分析結(jié)構(gòu)框架及函數(shù)調(diào)用層MPICH的層次結(jié) 通過(guò) 通過(guò)ADI層提供的服務(wù)和平臺(tái)無(wú)關(guān)的算法、數(shù)據(jù)結(jié)構(gòu)實(shí)現(xiàn)API實(shí)現(xiàn),把實(shí)現(xiàn)后的接口封裝成一類抽表 MPICH層次結(jié)MPI的最上層是MPI的標(biāo)準(zhǔn)接口,供用戶調(diào)用的API;中間一層在MPICH中被稱為抽socketAPI,Myrient網(wǎng)卡驅(qū)動(dòng)函數(shù)庫(kù)等。(channelgasnet,ib,shm,sock,sshm,ssm66種程序能自動(dòng)識(shí)別系統(tǒng)平臺(tái)所支持的底層通信,從而選擇合適的通道。由于時(shí)間和篇幅Windowssock通道。圖 MPICH通實(shí)現(xiàn)源碼中,針對(duì)不同的抽線層次,MPICH有嚴(yán)格名規(guī)范,如下表所示MPIMPIRMPI標(biāo)準(zhǔn)接口的數(shù)MPIDADIMPI 、 ADIADI層的函數(shù),2MPICH下圖描述了一個(gè)MPI通口實(shí)現(xiàn)流程圖2MPI通口實(shí)現(xiàn)流函數(shù)調(diào)用層中所涉及的MPI點(diǎn)對(duì)點(diǎn)通口函數(shù)的調(diào)用層次說(shuō)明如下:3.3、3.4節(jié)及第四章的代碼分析中另有描述。發(fā)送函i)阻塞算MPIMPI層函數(shù)調(diào)用。MPI_Send3.1.1MPIMPID_Send3.3節(jié)。4MPI_SendMPI_BsendMPIR_Bsend_IsendMPI5MPI_Ssendii)非阻塞函7MPI_Isend8MPI_Ibsend接收函MPI標(biāo)準(zhǔn),對(duì)于發(fā)送接收動(dòng)作,采用的是發(fā)送推動(dòng)(Push)的模式,即由發(fā)送者主動(dòng)決定何時(shí)往何處發(fā)送數(shù)據(jù),接收需要接收目標(biāo)為自己的數(shù)據(jù)即可,不能主動(dòng)從其他11MPI_RecvMPI_IrecvMPIADI層,底層通信的功能都是由發(fā)送函數(shù)完成的。接收需要處理本地?cái)?shù)據(jù)即可。關(guān)鍵數(shù)據(jù)結(jié)數(shù)據(jù)結(jié)構(gòu)是一個(gè)程序的基礎(chǔ),可以說(shuō)一個(gè)程序就是有數(shù)據(jù)結(jié)構(gòu)與算法組成的。MPICH(unionCommunicator:通信域可以說(shuō)是MPI2.3.1節(jié)中六個(gè)MPICHStruct來(lái)實(shí)現(xiàn)。源代碼如下表所示:M_SIZEm{typedefstructvolatileintMPID_VCRMPID_VCR M MM_RANK structMPID_Collops structMPID_TopoOps #ifdefMPID_HAS_HETEROintis_hetero;*mm_kind_tMPID_ErrhandlerMPID_AttributetypedefstructMPID_Request volatileint#if(USE_THREAD_IMPL=MPID_Thread_mutex_tMPID_Request_kind_tkind;volatileintcc;intvolatilem*comm;MPI_Statusstatus;structMPID_Request*partner_request; void*grequest_extra_state; #ifdefMPID_DEV_REQUEST_DECL}14-16 行中請(qǐng)求的類型,在PICH中定義請(qǐng)求的類型共8種:Datatype:MPI允許用戶自己定 typedefstructMPID_Datatype

intvolatileintref_count;intsize;

MPI_DatatypeMPIint inteltype,MPI_AintintintMPID_Datatype_contentsstructMPID_Dataloop structMPID_DataloopintintstructMPID_Attribute int32_t}

14-19VC:VCMPICH實(shí)現(xiàn)中的一個(gè)很重要的數(shù)據(jù)結(jié)構(gòu),它串聯(lián)起發(fā)送函數(shù)MPIADI層,其源代碼如下表所示:VC行 源代 typedefstructMPIDI_VC{ intdummy;volatileintMPIDI_VC_State_tMPIDI_PG_t*intint#ifMPID_Seqnum_t#ifMPID_Seqnum_t #if# 行為VC的狀態(tài),MPICH中共定義5種VC狀態(tài):行 源代 typedefunion行 源代 typedefunionMPIDI_CH3_Pkt MPIDI_CH3_Pkt_type_tMPIDI_CH3_Pkt_eager_send_tMPIDI_CH3_Pkt_eager_send_tMPIDI_CH3_Pkt_rndv_send_tMPIDI_CH3_Pkt_put_tMPIDI_CH3_Pkt_get_tMPIDI_CH3_Pkt_get_resp_tMPIDI_CH3_Pkt_accum_tMPIDI_CH3_Pkt_lock_tMPIDI_CH3_Pkt_lock_granted_tMPIDI_CH3_Pkt_pt_rma_done_tMPIDI_CH3_Pkt_close_t#if#}10-RNDV第三行定義了數(shù)據(jù)包的類型,MPICH中,數(shù)據(jù)包的類型共有如下幾種: PktUnionStructpkteager_send類型數(shù)據(jù)包,則:MPIDI_CH3_Pkt_tMPIDI_CH3_Pkt_eager_send_t*consteager_pkt=阻塞算MPI_Send,MPI_Bsend,MPI_Ssend,MPI_RsendMPI_Recv5分析,其他部分用偽碼代替。另外,對(duì)于錯(cuò)誤處理的操作,本文沒有涉及,需要,請(qǐng)如2.3.2中定義的術(shù)語(yǔ),阻塞操作,即是發(fā)送方在消息被安全地起來(lái)之后才會(huì)返-接收這個(gè)過(guò)程因?yàn)閷?duì)緩沖的不同處理而變得復(fù)雜??赡茉谀承┣闆r下,因?yàn)闆]有相對(duì)應(yīng)的接收端,發(fā)送端馬上就返回了,而此時(shí),相應(yīng)的接收端還沒有啟動(dòng)。另外,消息消耗的系統(tǒng)資源也是很龐大的因?yàn)橄⑹窃诰彌_之間進(jìn)行拷貝完全是器到器的操作而且I1.13Bsend(Bufer,end(s)Rsend(Ready。[19]MPI來(lái)決定,發(fā)送的數(shù)據(jù)是否放進(jìn)緩存中。:MPI_Send((mpich2- intMPI_Send(void*buf,intcount,MPI_Datatypedatatype,intdest,intm{staticconstcharFCNAME[]=intmpi_errno=m*comm_ptr=MPID_Request*request_ptr= 06~0708~13/*Validatehandleparametersneedingtobeconverted#ifdef{{M(comm,if(mpi_errno)goto}}#endif/*HAVE_ERROR_CHECKING/*ConvertMPIobjecthandlestoobjectpointersm_get_ptr(comm,comm_ptr/*Validateparametersiferrorcheckingisenabled#ifdef{{m_valid_ptr(comm_ptr,mpi_errnoif(mpi_errno)gotoif(mpi_errno)goto/*Validatedatatypehandle/*Validatedatatypeobjectif(HANDLE_GET_KIND(datatype)!={MPID_Datatype*datatype_ptr=MPID_Datatype_get_ptr(datatype,mitted_ptr(datatype_ptr,if(mpi_errno)goto}/*Validatebufferif(mpi_errno)goto}}#endif/*HAVE_ERROR_CHECKING 30~40count,rank,tag等參數(shù)42~54檢查數(shù)據(jù)類型56~61 /*...bodyofroutine... mpi_errno=MPID_Send(buf,count,datatype,dest,tag,if(mpi_errno!=MPI_SUCCESS)gotoif(request_ptr=={goto}/*Ifarequestwasreturned,thenweneedtoblockuntiltheiscompleteif((*(request_ptr)->cc_ptr)!={MPID_Progress_statewhile((*(request_ptr)->cc_ptr)!={mpi_errno=if(mpi_errno!={/*--BEGINERRORHANDLING--goto/*--ENDERRORHANDLING--} } mpi_errno=request_ptr- if(mpi_errno!=MPI_SUCCESS)gotofn_fail; /*...endofbodyofroutine...*/ MPID_Send(74~100request81~91行的循環(huán),不斷檢request的值,使程序阻塞,87~88,當(dāng)程序可以返回時(shí),結(jié)束阻塞操作。return/*--BEGINERRORHANDLING-- ifdef{mpi_errno=mpi_errno,MPIR_ERR_RECOVERABLE,LINE,MPI_ERR_OTHER,"**mpi_send%p%d%D%i%t%C",buf,count,datatype,tag,}#mpi_errno= m(comm_ptr,mpi_errnogoto/*--ENDERRORHANDLING-- 函數(shù):MPID_Send((mpich2- intMPID_Send(constvoid*buf,intcount,MPI_Datatypedatatype,intrank,intm*comm,intMPID_Request**{ if(rank==comm->rank&&comm->comm_kind {mpi_errno=MPIDI_Isend_self(buf,count,datatype,rank,tag,context_offset,MPIDI_REQUEST_TYPE_SEND,}07~11MPIDI_Isend_self() if(data_sz== MPIDI_CH3_Pkt_tMPIDI_CH3_Pkt_eager_send_t*consteager_pkt=&upkt.eager_send;eager_pkt->match.rank=comm-eager_pkt->match.tag=eager_pkt->match.context_id=comm->context_id+eager_pkt->sender_req_id=eager_pkt->data_sz=mpi_errno=MPIDI_CH3_iStartMsg(vc,eager_pkt,sizeof(*eager_pkt),}014~17Pkt18~2224~25 if(data_sz+sizeof(MPIDI_CH3_Pkt_eager_send_t) {MPID_IOViov[0].MPID_IOV_BUF=iov[0].MPID_IOV_LEN=if{iov[1].MPID_IOV_BUF=(MPID_IOV_BUF_CAST)((char*)bufiov[1].MPID_IOV_LEN=mpi_errno=MPIDI_CH3_iStartMsgv(vc,iov,2,}MPIDI_CH3_EAGER_MAX_MSG_SIZEMPICHMPIDI_CH3_EAGER_MAX_MSG_SIZE35~37iov 41~43 {intMPIDI_Request_create_sreq(sreq,mpi_errno,gotoMPID_Segment_init(buf,count,datatype,&sreq->dev.segment,sreq->dev.segment_first=sreq->dev.segment_size=iov_n=MPID_IOV_LIMIT-mpi_errno=MPIDI_CH3U_Request_load_send_iov(sreq,if(mpi_errno=={ iov_n+= mpi_errno=MPIDI_CH3_iSendv(vc,sreq,iov, else錯(cuò)誤處理51~55requestrequest {if{sreq->dev.iov[0].MPID_IOV_BUF=((char*)sreq->dev.user_buf+sreq->dev.iov[0].MPID_IOV_LEN=sreq->dev.iov_count= sreq->dev.iov_count= sreq->dev.segment_first=

sreq->dev.segment_size=mpi_errno=MPIDI_CH3U_Request_load_send_iov(sreq,&sreq- mpi_errno=MPIDI_CH3_iStartRndvMsg(vc,sreq,當(dāng)消息長(zhǎng)度大于MPIDI_CH3_EAGER_MAX_MSG_SIZE(128000)Rendezvous73~8081~91 發(fā)送操作就可以返回。緩沖模式的發(fā)送操作是本地操作,它不依賴于與之相匹配的接收操作。因此,如果一個(gè)緩沖模式的發(fā)送已經(jīng)開始了,而其相應(yīng)的接收操作還沒有開始的話,I將會(huì)將數(shù)據(jù)放入由用戶控制的緩沖中。當(dāng)然,足夠的緩沖空間是必要的,否則,MPI將會(huì)報(bào)錯(cuò)。[3]函數(shù):MPI_Bsend()(mpich2- intMPI_Bsend(void*buf,intcount,MPI_Datatypedatatype,intdest,intm{M(comm,m_get_ptr(comm,comm_ptrm_valid_ptr(com_pt,mpi_rrno09 if(cm_ptr){ if(HANDLE_GET_KIND(datatype)!={MPID_Datatype*datatype_ptr=MPID_Datatype_get_ptr(datatype,mitted_ptr(datatype_ptr, MPIMPI tagrank13~20 /*...bodyofroutine mpi_errno=MPIR_Bsend_isend(buf,count,datatype,dest,tag,BSEND,&request_ptr/*Notethatwecanignoretherequest_ptrbecauseitishandledbythebsendutilroutinesif(mpi_errno!=MPI_SUCCESS)gotofn_fail; /*...endofbodyofroutine...*/ :MPIR_send_isen(mpich-intMPIR_Bsend_isend(void*buf,intcount,MPI_Datatypeintdest,int mBsendKind_tkind,MPID_Request**request{for(pass=0;pass<2;pass++)p=MPIR_Bsend_find_buffer(packsizeif(p)/*Foundasegment/*Packthedataintothebufferp->msg.count=(void)NMPI_Pack(buf,count,dtype,p->msg.msgbuf,&p->msg.count,comm_ptr->handle/*Trytosendthe Wemustusebecausethiscallmustnotblockmpi_errno=MPID_Isend(p->msg.msgbuf,p-MPI_PACKED,dest,tag,if(p->request)MPIR_Bsend_take_buffer(p,p->msg.countp- =*request=p-}else/*TrytocompletesomependingbsendsMPIR_Bsend_check_active(/*GiveprioritytoanypendingoperationsMPIR_Bsend_retry_pending(}}MPI_BSENDMPI_ISENDMPIMPIR_Bsend_isend()函數(shù)。MPI_SENDMPI_ISENDADI 檢查可供使用的緩沖,這樣可以減少碎13~15節(jié)28~31函數(shù):MPI_Ssend((mpich2- intMPI_Ssend(void*buf,intcount,MPI_Datatypedatatype,intdest,intm{M(comm,m_get_ptr(comm,comm_ptrm_valid_ptr(comm_ptr,mpi_errnoif(comm_ptr)}if(HANDLE_GET_KIND(datatype)!={MPID_Datatype*datatype_ptr=MPID_Datatype_get_ptr(datatype,mitted_ptr(datatype_ptr,}/*...bodyofroutine mpi_errno=MPID_Ssend(buf,count,datatype,dest,tag,if((*(request_ptr)->cc_ptr)!={MPID_Progress_statewhile((*(request_ptr)->cc_ptr)!={mpi_errno=}}mpi_errno=request_ptr-/*...endofbodyofroutine...}05~22參數(shù)檢測(cè)24~46 MPID_Ssend()ADI19~42函數(shù):MPID_Ssend()(mpich2- intMPID_Ssend(constvoid*buf,intcount,MPI_Datatypedatatype,intrank,intm*comm,intMPID_Request**{if(rank==comm->rank&&comm->comm_kind {mpi_errno=MPIDI_Isend_self(buf,count,datatype,rank,tag,context_offset,MPIDI_REQUEST_TYPE_SSEND,} MPIDI_Isend_self MPIDI_Datatype_get_info(count,datatype,dt_contig,data_sz,dt_ptr,dt_true_lb); m_get_vc(comm,rank,&vc); MPIDI_Request_create_sreq(sreq,mpi_errno,goto if(data_sz=={MPIDI_CH3_Pkt_tMPIDI_CH3_Pkt_eager_sync_send_t*constes_pktsreq->cc= es_pkt->match.rank=comm-es_pkt->match.tag=es_pkt->match.context_id=comm->context_id+es_pkt->sender_req_id=sreq-es_pkt->data_sz=mpi_errno=MPIDI_CH3_iSend(vc,sreq,es_pkt,} 16~17request21~22創(chuàng)建數(shù)據(jù)包23~3335~37 if(data_sz+sizeof(MPIDI_CH3_Pkt_eager_sync_send_t)

iov[0].MPID_IOV_BUF=(MPID_IOV_BUF_CAST)es_pkt;iov[0].MPID_IOV_LEN=sizeof(*es_pkt);if{iov[1].MPID_IOV_BUF=(MPID_IOV_BUF_CAST)((char*)buf+iov[1].MPID_IOV_LEN=mpi_errno=MPIDI_CH3_iSendv(vc,sreq,iov,}46~56行處理連續(xù)數(shù)據(jù)的情況。45~46

requestmpi_errno=MPIDI_CH3U_Request_load_send_iov(sreq, if(mpi_errno== mpi_errno=MPIDI_CH3_iSendv(vc,sreq,iov, 果不可預(yù)知。在某些系統(tǒng)中,需要使用到的握手操作。發(fā)送操作的完成,不依賴于接統(tǒng)以外,準(zhǔn)備模式的發(fā)送與標(biāo)準(zhǔn)模式和同步模式的發(fā)送幾乎相同。一般情況,除了性能上函數(shù):MPI_Rsend((mpich2- intMPI_Rsend(void*buf,intcount,MPI_Datatypedatatype,intdest,intm{M(comm,m_get_ptr(comm,comm_ptrm_valid_ptr(comm_ptr,mpi_errnoif(comm_ptr)}if(HANDLE_GET_KIND(datatype)!={MPID_Datatype*datatype_ptr=MPID_Datatype_get_ptr(datatype,mitted_ptr(datatype_ptr,}/*...bodyofroutine mpi_errno=MPID_Rsend(buf,count,datatype,dest,tag,if((*(request_ptr)->cc_ptr)!={MPID_Progress_statewhile((*(request_ptr)->cc_ptr)!={mpi_errno=}}mpi_errno=request_ptr-/*...endofbodyofroutine...}05~22參數(shù)檢測(cè)24~46 MPID_Ssend()ADI19~42函數(shù):MPID_Rsend((mpich2- intMPID_Rsend(constvoid*buf,intcount,MPI_Datatypedatatype,intrank,intm*comm,intMPID_Request**{if(rank==comm->rank&&comm->comm_kind {mpi_errno=MPIDI_Isend_self(buf,count,datatype,rank,tag,context_offset,MPIDI_REQUEST_TYPE_SSEND,} MPIDI_Datatype_get_info(count,datatype,dt_contig,data_sz,

m_get_vc(comm,rank, if(data_sz=={ mpi_errno=MPIDI_CH3_iStartMsg(vc,ready_pkt, iov[0].MPID_IOV_BUF= iov[0].MPID_IOV_LEN= if

iov[1].MPID_IOV_BUF=(MPID_IOV_BUF_CAST)((char*)buf+iov[1].MPID_IOV_LEN=mpi_errno=MPIDI_CH3_iStartMsgv(vc,iov,2,25~26 {mpi_errno=MPIDI_CH3U_Request_load_send_iov(sreq,if(mpi_errno=={mpi_errno=MPIDI_CH3_iSendv(vc,sreq,iov,} mpi_errnoMPIDI_CH3_iSendv(vc,sreq,ioviov_n)函數(shù):MPI_Recv()(mpich2- intMPI_Recv(void*buf,intcount,MPI_Datatypedatatype,intsource,intmcomm,MPI_Status{M(comm,m_get_ptr(comm,comm_ptrm_valid_ptr(comm_ptr,mpi_errnoif(comm_ptr)}if(HANDLE_GET_KIND(datatype)!={MPID_Datatype*datatype_ptr=MPID_Datatype_get_ptr(datatype,mitted_ptr(datatype_ptr,}/*...bodyofroutine mpi_errno=MPID_Recv(buf,count,datatype,source,tag,if((*(request_ptr)->cc_ptr)!={ MPID_Progress_statewhile((*(request_ptr)->cc_ptr)!={mpi_errno= }/*...endofbodyofroutine...*/ 06~2226~27MPID_RecvADI29~39函數(shù):MPID_Recv((mpich2- intMPID_Recv(void*buf,intcount,MPI_Datatypedatatype,intrank,intm*comm,intMPI_Status*status,MPID_Request**{rreq=MPIDI_CH3U_Recvq_FDU_or_AEP(rank,tag,comm->context_idcontext_offset,rreq->comm=rreq->dev.user_buf=rreq->dev.user_count=rreq->dev.datatype=if{MPIDI_VC_t*m_get_vc(comm,rreq->dev.match.rank,if(MPIDI_Request_get_msg_type(rreq)=={intif{MPIDI_CH3_Pkt_tMPIDI_CH3_Pkt_eager_sync_ack_t*constesa_pktMPID_Request*MPIDI_Pkt_init(esa_pkt,esa_pkt->sender_req_id=rreq-mpi_errno=MPIDI_CH3_iStartMsg(vc,esa_pkt,}ifififACKACKMPIDI_Request_recv_pending(rreq,if{if(rreq->dev.recv_data_sz>{}rreq=goto}{if(HANDLE_GET_KIND(datatype)!={MPID_Datatype_get_ptr(datatype,rreq-}}} if41~4546~47 else52~55將接收操作交由進(jìn)程處理器(ProgressEngine)elseif(MPIDI_Request_get_msg_type(rreq){MPID_Request*MPIDI_CH3_Pkt_tMPIDI_CH3_Pkt_rndv_clr_to_send_t*cts_pkt=MPIDI_Pkt_init(cts_pkt,cts_pkt->sender_req_id=rreq-cts_pkt->receiver_req_id=rreq-mpi_errno=MPIDI_CH3_iStartMsg(vc,cts_pkt,if(cts_req!={}if(HANDLE_GET_KIND(datatype)!={MPID_Datatype_get_ptr(datatype,rreq-}}59~60rendezvouselseif62~69CTS70~71將CTS數(shù)據(jù)包發(fā)送給進(jìn)76~80將接收操作交由進(jìn)程處理器(ProgressEngine){if(HANDLE_GET_KIND(datatype)!={MPID_Datatype_get_ptr(datatype,rreq-}rreq->dev.recv_pending_count=} else非阻塞算MPI程序的性能受到影響,于是出現(xiàn)了非阻塞通信方式。一個(gè)非阻的計(jì)算可以與發(fā)送的過(guò)程同步進(jìn)行,而不用將發(fā)送端阻塞。與此相類似,一個(gè)接收開始調(diào)行。另外,非阻塞的接收操作可以避免使用系統(tǒng)的緩沖區(qū),并且避免器到器之間的數(shù)據(jù)。[20]沖模式(Buffer)MPI_Ibsend,同步模式(Synchronous)MPI_Isend和準(zhǔn)備模式(Ready)MPI_Irsend。四種非阻塞發(fā)送模式的語(yǔ)義與阻塞模式下語(yǔ)義相同,故不做單獨(dú)說(shuō)明。這四作開始之前返回。若不使用緩沖,則發(fā)送完成調(diào)用在數(shù)據(jù)被到接收緩沖前不會(huì)返回。函數(shù):MPI_Isend((mpich2- intMPI_Isend(void*buf,intcount,MPI_Datatypedatatype,intdest,int

mcomm,MPI_Request 變量與函數(shù)初始化工M(comm,m_get_ptr(comm,comm_ptrm_valid_ptr(comm_ptr,mpi_errno);if(HANDLE_GET_KIND(datatype)!={MPID_Datatype*datatype_ptr=MPID_Datatype_get_ptr(datatype,mitted_ptr(datatype_ptr, 06~0810~13COUNT,RANK,TAG,ARGNULL15~22mpi_errno=MPID_Isend(buf,count,datatype,dest,tag,*request=request_ptr-25~26MPID_Isend()ADI request函數(shù):MPID_Isend(mpich2- intMPID_Isend(constvoid*buf,intcount,MPI_Datatypedatatype,intrank,int

m*comm,intcontext_offset,MPID_Request**request)變量與函數(shù)初始化工if(rank==comm->rank&&comm->comm_kind {mpi_errno=MPIDI_Isend_self(buf,count,datatype,rank,tag,comm,context_offset,MPIDI_REQUEST_TYPE_SEND,&sreq);}09~10MPIDI_Isend_self() MPIDI_Datatype_get_info(count,datatype,dt_contig,data_sz,

m_get_vc(comm,rank,if(data_sz=={MPIDI_CH3_Pkt_tMPIDI_CH3_Pkt_eager_send_t*consteager_pkt=&upkt.eager_send;sreq->dev.ca= MPIDI_Pkt_init(eager_pkt, eager_pkt->match.rank=comm- eager_pkt->match.tag=eager_pkt->match.context_id=comm->context_id+eager_pkt->sender_req_id=sreq-eager_pkt->data_sz=MPIDI_Pkt_set_seqnum(eager_pkt,MPIDI_Request_set_seqnum(sreq,mpi_errno=MPIDI_CH3_iSend(vc,sreq,eager_pkt,}012~13 VC18~2931~33 if(data_sz+sizeof(MPIDI_CH3_Pkt_eager_send_t){MPIDI_CH3_Pkt_tMPIDI_CH3_Pkt_eager_send_t*consteager_pkt=MPID_IOVint MPIDI_Pkt_init(eager_pkt,eager_pkt->match.rank=comm-eager_pkt->match.tag=eager_pkt->match.context_id=comm->context_id+eager_pkt->sender_req_id=sreq-eager_pkt->data_sz=iov[0].MPID_IOV_BUF=iov[0].MPID_IOV_LEN=sizeof(*eager_pkt); if iov[1].MPID_IOV_BUF=(MPID_IOV_BUF_CAST)((char*)buf iov[1].MPID_IOV_LEN=data_sz; mpi_errno=MPIDI_CH3_iSendv(vc,sreq,iov, MPIDI_CH3_EAGER_MAX_MSG_SIZE(128000)且數(shù)據(jù)40~4142~43 request47~52為數(shù)據(jù)包賦值54~55 if59~61

MPID_Segment_init(buf,count,datatype,&sreq->dev.segment,0);sreq->dev.segment_first=0;sreq->dev.segment_size=iov_n=MPID_IOV_LIMIT-mpi_errno=MPIDI_CH3U_Request_load_send_iov(sreq,if(mpi_errno=={iov_n+=mpi_errno=MPIDI_CH3_iSendv(vc,sreq,iov,} else69~7173~75 {MPIDI_Request_set_msg_type(sreq,mpi_errno=mpi_errno=MPIDI_CH3_iStartMsg(vc,rts_pkt,}}128000else分支request87~8892~93MPIDI_CH3_iStartMsg()函數(shù):MPI_Ibsend()(mpich2- intMPI_Ibsend(void*buf,intcount,MPI_Datatypedatatype,intdest,int

mcomm,MPI_Request變量與函數(shù)初始M(comm,mpi_errno);m_get_ptr(comm,comm_ptr);m_valid_ptr(comm_ptr,mpi_errno);MPIR_ERRTEST_COUNT(count,mpi_errno);MPIR_ERRTEST_SEND_RANK(comm_ptr,dest,mpi_errno);MPIR_ERRTEST_SEND_TAG(tag,mpi_errno);if(HANDLE_GET_KIND(datatype)!={MPID_Datatype*datatype_ptr=NULL;MPID_Datatype_get_ptr(datatype,datatype_ptr);MPID_Datatype_valid_ptr(datatype_ptr,mpi_errno);mitted_ptr(datatype_ptr,} mpi_errno=MPIR_Bsend_isend(buf,count,datatype,dest,tag,IBSEND,&request_ptr);25~26MPIR_Bsend_isend()MPIR_Bsend_isend((mpich2-3.2.2節(jié)MPID_Isend(:MPI_Issend((mpich2- intMPI_Issend(void*buf,intcount,MPI_Datatypedatatype,intdest,intmcomm,MPI_Request{M(comm,m_get_ptr(comm,comm_ptrm_valid_ptr(comm_ptr,mpi_errno);if(HANDLE_GET_KIND(datatype)!={MPID_Datatype*datatype_ptr=MPID_Datatype_get_ptr(datatype,mitted_ptr(datatype_ptr,}mpi_errno=MPID_Issend(buf,count,datatype,dest,tag,}MPID_Issend()ADI函數(shù):MPID_Issend()(mpich2- intMPID_Issend(constvoid*buf,intcount,MPI_Datatypedatatype,intrank,m*comm,intMPID_Request**{變量與函數(shù)初始化工if(rank==comm->rank&&comm->comm_kind {mpi_errno=MPIDI_Isend_self(buf,count,datatype,rank,tag,context_offset,MPIDI_REQUEST_TYPE_SEND,} MPIDI_Datatype_get_info(count,datatype,dt_contig,data_sz,m_get_vc(comm,rank,&vc);if(data_sz=={MPIDI_CH3_Pkt_tMPIDI_CH3_Pkt_eager_send_t*consteager_pkt=&upkt.eager_send;sreq->dev.ca= MPIDI_Pkt_init(eager_pkt, eager_pkt->match.rank=comm- eager_pkt->match.tag= eager_pkt->match.context_id=comm->context_id+ eager_pkt->sender_req_id=sreq- eager_pkt->data_sz= mpi_errno=MPIDI_CH3_iSend(vc,sreq,eager_pkt, VC18~29 if(data_sz+sizeof(MPIDI_CH3_Pkt_eager_send_t){MPID_IOVintiov[0].MPID_IOV_BUF=iov[0].MPID_IOV_LEN=sizeof(*eager_pkt); if iov[1].MPID_IOV_BUF=(MPID_IOV_BUF_CAST)((char*)buf iov[1].MPID_IOV_LEN=data_sz; mpi_errno=MPIDI_CH3_iSendv(vc,sreq,iov, 40~43 if47~49 {iov_n=MPID_IOV_LIMIT-mpi_errno=MPIDI_CH3U_Request_load_send_iov(sreq,if(mpi_errno=={iov_n+=mpi_errno=MPIDI_CH3_iSendv(vc,sreq,iov,} else59~60 {MPIDI_Request_set_msg_type(sreq,mpi_errno=mpi_errno=MPIDI_CH3_iStartMsg(vc,rts_pkt,}} 128000else72~7377~78MPIDI_CH3_iStartMsg()函數(shù):MPI_Irsend(mpich2- intMPI_Irsend(void*buf,intcount,MPI_Datatypedatatype,intdest,int

mcomm,MPI_Request 變量與函數(shù)初始

M(comm,m_get_ptr(comm,comm_ptrm_valid_ptr(comm_ptr,mpi_errnoif(HANDLE_GET_KIND(datatype)!={MPID_Datatype*datatype_ptr=MPID_Datatype_get_ptr(datatype,mitted_ptr(datatype_ptr,}mpi_errno=MPID_Irsend(buf,count,datatype,dest,tag,}MPID_Irsend()ADI函數(shù) intMPID_Irsend(constvoid*buf,intcount,MPI_Datatypedatatype,intrank, m*comm,intMPID_Request**{變量與函數(shù)初始化工if(rank==comm->rank&&comm->comm_kind {mpi_errno=MPIDI_Isend_self(buf,count,datatype,rank,tag,context_offset,MPIDI_REQUEST_TYPE_SEND,}09~10MPIDI_Isend_self() MPIDI_Datatype_get_info(count,datatype,dt_contig,data_sz, m_get_vc(comm,rank,&vc); if(data_sz== sreq->dev.ca= mpi_errno=MPIDI_CH3_iSend(vc,sreq,ready_pkt, if iov[0].MPID_IOV_BUF=iov[0].MPID_IOV_LEN=if{sreq->dev.ca= iov[1].MPID_IOV_BUF=(MPID_IOV_BUF_CAST)((char*)buf iov[1].MPID_IOV_LEN=data_sz; mpi_errno=MPIDI_CH3_iSendv(vc,sreq,iov,2); 29~30 if 36~38將數(shù)據(jù)進(jìn)發(fā)送緩{intiov_n=MPID_IOV_LIMIT-mpi_errno=MPIDI_CH3U_Request_load_send_iov(sreq,&iov[1],if(mpi_errno=={ iov_n+= MPIDI_Pkt_set_seqnum(ready_pkt,

MPIDI_Request_set_seqnum(sreq,seqnum);mpi_errno=MPIDI_CH3_iSendv(vc,sreq,iov,iov_n);}else函數(shù):MPI_Irecv()(mpich2- intMPI_Irecv(void*buf,intcount,MPI_Datatypedatatype,int

int mcomm,MPI_RequestM(comm,mpi_errno);m_get_ptr(comm,comm_ptr);m_valid_ptr(comm_ptr,mpi_errno);if(comm_ptr)MPIR_ERRTEST_COUNT(count,mpi_errno);}if(HANDLE_GET_KIND(datatype)!={MPID_Datatype*datatype_ptr=NULL;MPID_Datatype_get_ptr(datatype,datatype_ptr);MPID_Datatype_valid_ptr(datatype_ptr,mpi_errno);mitted_ptr(datatype_ptr, /*...bodyofroutine... mpi_errno=MPID_Irecv(buf,count,datatype,source,tag,if(mpi_errno!=MPI_SUCCESS)gotofn_fail;/*returnthehandleoftherequesttotheuser*request=request_ptr->handle;/*...endofbodyofroutine...06~2226~27MPID_RecvADI函數(shù):MPID_Irecv((mpich2- intMPID_Irecv(void*buf,intcount,MPI_Datatypedatatype,intrank,intm*comm,intMPI_Status*status,MPID_Request**{rreq=MPIDI_CH3U_Recvq_FDU_or_AEP(rank,tag,comm->context_idcontext_offset,rreq->comm=rreq->dev.user_buf=rreq->dev.user_count=rreq->dev.datatype=if{MPIDI_VC_t*m_get_vc(comm,rreq->dev.match.rank,if(MPIDI_Request_get_msg_type(rreq)=={intif{MPIDI_CH3_Pkt_tMPIDI_CH3_Pkt_eager_sync_ack_t*constesa_pktMPID_Request*MPIDI_Pkt_init(esa_pkt,esa_pkt->sender_req_id=rreq-mpi_errno=MPIDI_CH3_iStartMsg(vc,esa_pkt,}ifififACKACKMPIDI_Request_recv_pending(rreq,if{if(rreq->dev.recv_data_sz>{}rreq=goto}{if(HANDLE_GET_KIND(datatype)!={MPID_Datatype_get_ptr(datatype,rreq-}}} if41~4546~47 else52~55將接收操作交由進(jìn)程處理器(ProgressEngine)elseif(MPIDI_Request_get_msg_type(rreq)

MPID_Request*cts_req;MPIDI_CH3_Pkt_tupkt;MPIDI_CH3_Pkt_rndv_clr_to_send_t*cts_pkt=MPIDI_Pkt_init(cts_pkt,MPIDI_CH3_PKT_RNDV_CLR_TO_SEND);cts_pkt->sender_req_id=rreq->dev.sender_req_id;cts_pkt->receiver_req_id=rreq-mpi_errno=MPIDI_CH3_iStartMsg(vc,cts_pkt,sizeof(*cts_pkt),if(cts_req!={}if(HANDLE_GET_KIND(datatype)!={}59~60rendezvouselseif62~69CTS70~71將CTS數(shù)據(jù)包發(fā)送給進(jìn)76~80將接收操作交由進(jìn)程處理器(ProgressEngine)

if(HANDLE_GET_KIND(datatype)!={MPID_Datatype_get_ptr(datatype,rreq- rreq->dev.recv_pending_count= else分支第四章MPICH2源代碼分析(2)MPICHMPIADI層的代碼。本章主要分析底層發(fā)送功能的發(fā)送函IIelC3_iSen(,(rtMs(sg(等五個(gè)函elf,直接完成了所有的發(fā)送功能,而其他的函數(shù),則根據(jù)系統(tǒng)的硬件條件的不同,調(diào)用不同的通道和底層發(fā)送函數(shù)完成發(fā)送任務(wù)。本節(jié)將會(huì)分析這五個(gè)函數(shù)的源代碼。[22]mmsmmsmsmms= sv=m= mv=3ADI函數(shù):MPIDI_Isend_self()(mpich2-ADIintMPIDI_Isend_self(constvoid*buf,intcount,MPI_Datatypedatatype,intrank, m*comm,intinttye,Iequest**reuest)04 {變量與函數(shù)初始化設(shè)match.rank=match.tag=match.context_id=comm->context_id+rreq=MPIDI_CH3U_Recvq_FDP_or_AEU(&match,&found);m_get_vc(comm,rank,if{MPIDI_msg_sz_tMPIDI_CH3U_Buffer_copy(buf,count,datatype,&sreq-rreq->status.count= sreq->cc=}{if(type!={intif(HANDLE_GET_KIND(datatype)!={}rreq->partner_request=rreq->dev.sender_req_id=sreq-MPID_Datatype_get_size_macro(datatype,rreq->status.count=count*}}}08~10 VC if19~22調(diào)用MPIDI_CH3U_Buffer_copy()函數(shù)在本地?cái)?shù)23~27 requestelse30~44未發(fā)現(xiàn)待發(fā)送的數(shù)據(jù),將處理過(guò)程交給進(jìn)程處理器(ProgressEngine)成從本小節(jié)開始,分析與底層硬件有關(guān)的發(fā)送函數(shù)的源代碼。如上文所述,MPICH66Socket調(diào)用的發(fā)送函數(shù)函數(shù):MPIDI_CH3_iSend()(mpich2-intMPIDI_CH3_iSend(MPIDI_VC_t*vc,MPID_Request*sreq,void*MPIDI_msg_sz_t{變量與函數(shù)初始化工hdr_sz=sizeof(MPIDI_CH3_Pkt_t);if(vc->ch.state=={if MPIU_Size_tintrc=MPIDU_Sock_write(vc->ch.sock,hdr,hdr_sz,if(rc=={if(nb=={MPIDI_CH3U_Handle_send_req(vc,sreq,if{vc->ch.conn->send_active=mpi_errno=MPIDU_Sock_post_writev(vc->ch.conn- {update_request(sreq,hdr,hdr_sz,vc->ch.conn->send_active=mpi_errno=MPIDU_Sock_post_write(vc->ch.conn-}}} if if if if else29~31 {update_request(sreq,hdr,hdr_sz,}}else(vc->ch.state=={update_request(sreq,hdr,hdr_sz,mpi_errno=}elseif(vc->ch.state!={update_request(sreq,hdr,hdr_sz,}return} else 若未與節(jié)點(diǎn)連接,進(jìn)入elseif分 若與節(jié)點(diǎn)連接失敗,進(jìn)入elseif分 MPIDI_CH3_iSend((mpich2-intMPIDI_CH3_iSendv(MPIDI_VC_t*vc,MPID_Request*sreq,void*MPIDI_msg_sz_t{變量與函數(shù)初始化工iov[0].MPID_IOV_LEN=if(vc->ch.state=={if

MPIU_Size_tnb;intrc;rc=MPIDU_Sock_write(vc->ch.sock,hdr,hdr_sz,&nb);if(rc==MPI_SUCCESS){intoffset=while(offset<{if((int)iov[offset].MPID_IOV_LEN<={nb-=iov[offset].MPID_IOV_LEN;}{update_requ

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(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)論