并行計(jì)算基礎(chǔ)知識(shí)講座課件1_第1頁(yè)
并行計(jì)算基礎(chǔ)知識(shí)講座課件1_第2頁(yè)
并行計(jì)算基礎(chǔ)知識(shí)講座課件1_第3頁(yè)
并行計(jì)算基礎(chǔ)知識(shí)講座課件1_第4頁(yè)
并行計(jì)算基礎(chǔ)知識(shí)講座課件1_第5頁(yè)
已閱讀5頁(yè),還剩139頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

基于MPI的并行程序設(shè)計(jì)王振海西北工業(yè)大學(xué)理學(xué)院西北工業(yè)大學(xué)高性能計(jì)算研究與發(fā)展中心2022/11/161基于MPI的并行程序設(shè)計(jì)王振海2022/11/101MPI并行編程環(huán)境進(jìn)程與消息傳遞

MPI并行程序設(shè)計(jì)入門初步的MPI消息傳遞函數(shù)先進(jìn)的MPI函數(shù)MPI并行程序示例面向性能的程序設(shè)計(jì)

主要內(nèi)容2022/11/162MPI并行編程環(huán)境主要內(nèi)容2022/11/102目前,高性能并行機(jī)主要可以分為對(duì)稱多處理共享存儲(chǔ)并行機(jī)(SMP,SymmetricMultiProcessor)、分布式共享存儲(chǔ)多處理機(jī)(DSM,DistributiedSharedMemory)、大規(guī)模并行處理機(jī)(MPP,MassivelyParallelProcessor)和微機(jī)機(jī)群(Cluster)等四類。在這些并行機(jī)上,并行程序設(shè)計(jì)平臺(tái)主要可分為消息傳遞、共享存儲(chǔ)和數(shù)據(jù)并行三類,其中消息傳遞具有很好的可移植性,它能被所有這些類型的并行機(jī)所支持,而共享存儲(chǔ)只能在在SMP和DSM并行機(jī)中使用,數(shù)據(jù)并行只能在SMP,DSM和MPP并行機(jī)上使用。并行編程環(huán)境簡(jiǎn)介2022/11/163目前,高性能并行機(jī)主要可以分為對(duì)稱多處理共享存儲(chǔ)并行機(jī)(SM消息傳遞并行編程環(huán)境(MPI:MessagePassingInterface)是目前國(guó)際上最流行、可移植性和可擴(kuò)展性很好的并行程序設(shè)計(jì)平臺(tái),并被當(dāng)前流行的所有高性能并行機(jī)所支持。它是在標(biāo)準(zhǔn)串行程序設(shè)計(jì)語(yǔ)言(C,F(xiàn)ortran,C++)的基礎(chǔ)上,再加入實(shí)現(xiàn)進(jìn)程間通信的MPI消息傳遞庫(kù)函數(shù),就構(gòu)成了MPI并行程序設(shè)計(jì)所依賴的并行編程環(huán)境。MPI已經(jīng)在Windows系列的非Unix、Linux平臺(tái)上實(shí)現(xiàn),其程序設(shè)計(jì)語(yǔ)言支持C,Fortran和Java。在國(guó)產(chǎn)的三大并行機(jī)系列神威、銀河和曙光上也都實(shí)現(xiàn)了對(duì)MPI和支持。MPI并行編程環(huán)境2022/11/164消息傳遞并行編程環(huán)境(MPI:MessagePassingMPI并行環(huán)境的應(yīng)用現(xiàn)狀

MPI是全球工業(yè)、政府和科研部門聯(lián)合推出的適合進(jìn)程間進(jìn)行標(biāo)準(zhǔn)消息傳遞的并行程序設(shè)計(jì)平臺(tái),最初版MPI1.0本于1994年6月推出,目前最新的為MPI2.0版,于1998年10月推出。MPI的具體實(shí)現(xiàn):MPICH和LAMMPI,目前均已實(shí)現(xiàn)MPI1.2版,適用于任何并行計(jì)算平臺(tái);部分并行機(jī)已實(shí)現(xiàn)MPI2.0版。MPI是目前應(yīng)用最廣的并行程序設(shè)計(jì)平臺(tái),幾乎被所有并行計(jì)算環(huán)境(共享和分布式存儲(chǔ)并行機(jī)、MPP、機(jī)群系統(tǒng)等)和流行的多進(jìn)程操作系統(tǒng)(UNIX、WindowsNT)所支持,基于它開發(fā)的應(yīng)用程序具有最佳的可移植性。2022/11/165MPI并行環(huán)境的應(yīng)用現(xiàn)狀MPI是全球工業(yè)、政府和科研部門聯(lián)MPI并行環(huán)境的應(yīng)用現(xiàn)狀(續(xù))

目前高效率的超大規(guī)模并行計(jì)算(1000個(gè)處理器)最可信賴的平臺(tái)。工業(yè)、科學(xué)與工程計(jì)算部門的大量科研和工程軟件(氣象、石油、地震、空氣動(dòng)力學(xué)、核等)目前已經(jīng)移植到MPI平臺(tái),發(fā)揮了重要作用。

MPI的優(yōu)點(diǎn):(1)具有很好的可移植性,幾乎被所有的并行環(huán)境支持;(2)具有很好的可擴(kuò)展性,是目前高效率的大規(guī)模并行計(jì)算最可信賴的平臺(tái);(3)比其它消息傳遞系統(tǒng)好用;(4)有完備的異步通信功能;(5)有精確的定義,從而為并行軟件產(chǎn)業(yè)的發(fā)展提供了必要的條件。2022/11/166MPI并行環(huán)境的應(yīng)用現(xiàn)狀(續(xù))目前高效率的超大規(guī)模并行計(jì)算MPI并行環(huán)境的應(yīng)用現(xiàn)狀(續(xù))

MPI2.0版在1.0版的基礎(chǔ)上,增加了如下的消息傳遞功能:(1)并行I/O:允許多個(gè)進(jìn)程同時(shí)讀寫同一個(gè)文件;(2)線程安全:允許MPI進(jìn)程的多個(gè)線程執(zhí)行,即支持與OpenMP的混合并行編程;(3)動(dòng)態(tài)進(jìn)程管理:允許并行應(yīng)用程序在執(zhí)行過程中,動(dòng)態(tài)地增加和刪除進(jìn)程個(gè)數(shù);(4)單邊通信:允許某個(gè)進(jìn)程對(duì)其它進(jìn)程的局部?jī)?nèi)存單元直接執(zhí)行讀寫訪問,而步需要對(duì)方進(jìn)程的顯式干預(yù);(5)并行應(yīng)用程序之間的動(dòng)態(tài)互操作:允許各個(gè)MPI并行應(yīng)用程序之間動(dòng)態(tài)地建立和刪除消息傳遞通道。目前,各類并行機(jī),特別式微機(jī)機(jī)群,只實(shí)現(xiàn)了MPI2.0的部分功能。本中心機(jī)群所支持的為MPI1.2.5版本。2022/11/167MPI并行環(huán)境的應(yīng)用現(xiàn)狀(續(xù))MPI2.0版在1.0版的MPI并行編程環(huán)境進(jìn)程與消息傳遞

MPI并行程序設(shè)計(jì)入門初步的MPI消息傳遞函數(shù)先進(jìn)的MPI函數(shù)MPI并行程序示例面向性能的程序設(shè)計(jì)2022/11/168MPI并行編程環(huán)境2022/11/108單個(gè)進(jìn)程(process)進(jìn)程是一個(gè)程序,同時(shí)包含它的執(zhí)行環(huán)境(內(nèi)存、寄存器、程序計(jì)數(shù)器等),是操作系統(tǒng)中獨(dú)立存在的可執(zhí)行的基本程序單位。通俗理解:串行應(yīng)用程序編譯形成的可執(zhí)行代碼,分為“指令”和“數(shù)據(jù)”兩個(gè)部分,并在程序執(zhí)行時(shí)“獨(dú)立地申請(qǐng)和占有”內(nèi)存空間,且所有計(jì)算均局限于該內(nèi)存空間。進(jìn)程1內(nèi)存進(jìn)程22022/11/169單個(gè)進(jìn)程(process)進(jìn)程是一個(gè)程序,同時(shí)包含它的執(zhí)行環(huán)單機(jī)內(nèi)多個(gè)進(jìn)程

多個(gè)進(jìn)程可以同時(shí)存在于單機(jī)內(nèi)同一操作系統(tǒng):由操作系統(tǒng)負(fù)責(zé)調(diào)度分時(shí)共享處理機(jī)資源(CPU、內(nèi)存、存儲(chǔ)、外設(shè)等)。進(jìn)程間相互獨(dú)立(內(nèi)存空間不相交):在操作系統(tǒng)調(diào)度下各自獨(dú)立地運(yùn)行,例如多個(gè)串行應(yīng)用程序在同一臺(tái)計(jì)算機(jī)中運(yùn)行。進(jìn)程間可以相互交換信息:例如數(shù)據(jù)交換、同步等待,消息是這些交換信息的基本單位,消息傳遞是指這些信息在進(jìn)程間的相互交換,是實(shí)現(xiàn)進(jìn)程間通信的唯一方式。2022/11/1610單機(jī)內(nèi)多個(gè)進(jìn)程多個(gè)進(jìn)程可以同時(shí)存在于單機(jī)內(nèi)同一操作系統(tǒng):由最基本的消息傳遞操作:發(fā)送消息(send)、接受消息(receive)、進(jìn)程同步(barrier)、規(guī)約(reduction)。消息傳遞的實(shí)現(xiàn):共享內(nèi)存或信號(hào)量,用戶不必關(guān)心。單機(jī)內(nèi)多個(gè)進(jìn)程(續(xù))2022/11/1611最基本的消息傳遞操作:發(fā)送消息(send)、接受消息(rec包含于通過網(wǎng)絡(luò)聯(lián)接的不同計(jì)算機(jī)的多個(gè)進(jìn)程

進(jìn)程獨(dú)立存在:進(jìn)程位于不同的計(jì)算機(jī),由各自獨(dú)立的操作系統(tǒng)調(diào)度,享有獨(dú)立的CPU和內(nèi)存資源。進(jìn)程間相互信息交換:消息傳遞。消息傳遞的實(shí)現(xiàn):基于網(wǎng)絡(luò)socket機(jī)制,用戶不必關(guān)心。2022/11/1612包含于通過網(wǎng)絡(luò)聯(lián)接的不同計(jì)算機(jī)的多個(gè)進(jìn)程進(jìn)程獨(dú)立存在:進(jìn)程消息傳遞庫(kù)函數(shù)

應(yīng)用程序接口(API):提供給應(yīng)用程序(FORTRAN、C、C++語(yǔ)言)的可直接調(diào)用的完成進(jìn)程間消息傳遞的某項(xiàng)特定功能的函數(shù)。消息傳遞庫(kù):所有定義的消息傳遞函數(shù)編譯形成的軟件庫(kù),調(diào)用其內(nèi)部函數(shù)的應(yīng)用程序,通過與之聯(lián)接,即可成為可并行執(zhí)行的程序。目前流行的消息傳遞函數(shù)庫(kù):PVM3.3.11、MPICH1.2、LAMMPI6.4等。2022/11/1613消息傳遞庫(kù)函數(shù)應(yīng)用程序接口(API):提供給應(yīng)用程序(FO標(biāo)準(zhǔn)消息傳遞界面MPIMPI標(biāo)準(zhǔn):根據(jù)應(yīng)用程序?qū)ο鬟f功能的需求,全球工業(yè)、應(yīng)用和研究部門聯(lián)合推出標(biāo)準(zhǔn)的消息傳遞界面函數(shù),不考慮其具體實(shí)現(xiàn),以保證并行應(yīng)用程序的可移植性。MPI的具體實(shí)現(xiàn):消息傳遞庫(kù)函數(shù),目前有影響的為MPICH和LAMMPI,我們注重MPICH系列。2022/11/1614標(biāo)準(zhǔn)消息傳遞界面MPIMPI標(biāo)準(zhǔn):根據(jù)應(yīng)用程序?qū)ο鬟f功能基于消息傳遞的并行程序執(zhí)行模式

SPMD模式:?jiǎn)纬绦蚨鄶?shù)據(jù)流2022/11/1615基于消息傳遞的并行程序執(zhí)行模式SPMD模式:?jiǎn)纬绦蚨鄶?shù)據(jù)流基于消息傳遞的并行程序執(zhí)行模式(續(xù))

MPM模式:多程序多數(shù)據(jù)流,除初始啟動(dòng)多個(gè)可執(zhí)行代碼,其余與SPMD模式一致。2022/11/1616基于消息傳遞的并行程序執(zhí)行模式(續(xù))MPM模式:多程序多數(shù)共享存儲(chǔ)與分布式存儲(chǔ)

屬于并行機(jī)體系結(jié)構(gòu)的范疇,與消息傳遞并行程序設(shè)計(jì)平臺(tái)無關(guān)。2022/11/1617共享存儲(chǔ)與分布式存儲(chǔ)屬于并行機(jī)體系結(jié)構(gòu)的范疇,與消息傳遞并消息傳遞是相對(duì)于進(jìn)程間通信方式而言的,與具體并行機(jī)存儲(chǔ)模式無關(guān),任何支持進(jìn)程間通信的并行機(jī),均可支持消息傳遞并行程序設(shè)計(jì)。幾乎所有共享和分布存儲(chǔ)并行計(jì)算環(huán)境均支持進(jìn)程間的消息傳遞通信。共享存儲(chǔ)與分布式存儲(chǔ)(續(xù))

2022/11/1618消息傳遞是相對(duì)于進(jìn)程間通信方式而言的,與具體并行機(jī)存儲(chǔ)模式無MPI并行編程環(huán)境進(jìn)程與消息傳遞

MPI并行程序設(shè)計(jì)入門初步的MPI消息傳遞函數(shù)先進(jìn)的MPI函數(shù)MPI并行程序示例面向性能的程序設(shè)計(jì)2022/11/1619MPI并行編程環(huán)境2022/11/1019MPI并行程序設(shè)計(jì)平臺(tái)由標(biāo)準(zhǔn)消息傳遞函數(shù)及相關(guān)輔助函數(shù)構(gòu)成,多個(gè)進(jìn)程通過調(diào)用這些函數(shù)(類似調(diào)用子程序),進(jìn)行通信。SPMD執(zhí)行模式:一個(gè)程序同時(shí)啟動(dòng)多份,形成多個(gè)獨(dú)立的進(jìn)程,在不同的處理機(jī)上運(yùn)行,擁有獨(dú)立的內(nèi)存空間,進(jìn)程間通信通過調(diào)用MPI函數(shù)來實(shí)現(xiàn)。每個(gè)進(jìn)程開始執(zhí)行時(shí),將獲得一個(gè)唯一的序號(hào)(rank)。例如啟動(dòng)P個(gè)進(jìn)程,序號(hào)依次為0,1,…,P-1。MPI并行程序2022/11/1620MPI并行程序設(shè)計(jì)平臺(tái)由標(biāo)準(zhǔn)消息傳遞函數(shù)及相關(guān)輔助函數(shù)構(gòu)成,MPI并行程序例1進(jìn)程0發(fā)送一個(gè)整數(shù)給進(jìn)程1;進(jìn)程1將該數(shù)加1,傳遞給進(jìn)程2;進(jìn)程2再將該數(shù)加1,再傳遞給進(jìn)程3;依次類推,最后,進(jìn)程P-1將該數(shù)傳遞給進(jìn)程0,由進(jìn)程0負(fù)責(zé)廣播該數(shù)給所有進(jìn)程,并打印輸出。programexample1include“mpif.h”!!MPI系統(tǒng)頭文件

integerstatus(MPI_STATUS_SIZE),my_rank,pintegersource,dest,tag,ierr,datac2022/11/1621MPI并行程序例1進(jìn)程0發(fā)送一個(gè)整數(shù)給進(jìn)程1;進(jìn)程1將該數(shù)MPI并行程序例1(續(xù))c-------進(jìn)入MPI系統(tǒng)

callMPI_Init(ierr)callMPI_Comm_rank(MPI_COMM_WORLD,my_rank,ierr)callMPI_Comm_size(MPI_COMM_WORLD,p,ierr)c-------數(shù)據(jù)交換

data=0tag=5source=my_rank-1if(source.eq.-1)source=p-1dest=my_rank+1if(dest.eq.p)dest=02022/11/1622MPI并行程序例1(續(xù))c-------進(jìn)入MPI系統(tǒng)202

if(my_rank.eq.0)thencallMPI_Send(data,1,MPI_INTEGER,dest,tag,MPI_COMM_WORLD,ierr)callMPI_Recv(data,1,MPI_INTEGER,source,tag,MPI_COMM_WORLD,status,ierr)elsecallMPI_Recv(data,1,MPI_INTEGER,source,tag,MPI_COMM_WORLD,status,ierr)data=data+1callMPI_Send(data,1,MPI_INTEGER,dest,tag,MPI_COMM_WORLD,ierr)endifcMPI并行程序例1(續(xù))2022/11/1623if(my_rank.eq.0)thenMPI并行程序例c-------廣播數(shù)據(jù)

callMPI_Bcast(data,1,MPI_INTEGER,0,MPI_COMM_WORLD,ierr)c------打印輸出

if(my_rank.eq.0)thenif(data.eq.p-1)thenprint*,”Successful,data=”,dataelseprint*,”Failure,data=”,dataendifendifccallMPI_Finalize(ierr)endMPI并行程序例1(續(xù))2022/11/1624c-------廣播數(shù)據(jù)MPI并行程序例1(續(xù))2022/1MPI并行程序的運(yùn)行MPI編譯命令:mpif77-oexam.eexample.f運(yùn)行命令:mpirun–np4exam.e運(yùn)行效果:MPI系統(tǒng)選擇相同或不同的4個(gè)處理機(jī),在每個(gè)處理機(jī)上運(yùn)行程序代碼exam.e。運(yùn)行結(jié)果:Successful,data=32022/11/1625MPI并行程序的運(yùn)行MPI編譯命令:mpif77-o運(yùn)行分析2022/11/1626運(yùn)行分析2022/11/1026MPI重要概念進(jìn)程序號(hào)(rank):各進(jìn)程通過函數(shù)MPI_Comm_rank()獲取各自的序號(hào)。消息號(hào):消息的標(biāo)號(hào)。通信器(Communicator):1)理解為一類進(jìn)程的集合,且在該集合內(nèi),進(jìn)程間可以相互通信;類比:郵局、電話局、國(guó)際網(wǎng);2)任何MPI通信函數(shù)均必須在某個(gè)通信器內(nèi)發(fā)生;3)MPI系統(tǒng)提供省缺的通信器MPI_COMM_WORLD,所有啟動(dòng)的MPI進(jìn)程通過調(diào)用函數(shù)MPI_Init()包含在該通信器內(nèi);4)各進(jìn)程通過函數(shù)MPI_Comm_size()獲取通信器包含的(初始啟動(dòng))的MPI進(jìn)程個(gè)數(shù)。2022/11/1627MPI重要概念進(jìn)程序號(hào)(rank):各進(jìn)程通過函數(shù)MPI_C消息:分為數(shù)據(jù)(data)和包裝(envelope)兩個(gè)部分,其中,包裝由接收進(jìn)程序號(hào)、發(fā)送進(jìn)程序號(hào)、消息標(biāo)號(hào)和通信器四部分組成,數(shù)據(jù)包含用戶將要傳遞的內(nèi)容。進(jìn)程組:一類進(jìn)程的集合,在它的基礎(chǔ)上,可以定義新的通信器。基本數(shù)據(jù)類型:對(duì)應(yīng)于FORTRAN和C語(yǔ)言的內(nèi)部數(shù)據(jù)類型(INTEGER,REAL,DOUBLEPRECISION,COMPLEX,LOGICAL,CHARACTER),MPI系統(tǒng)提供已定義好的對(duì)應(yīng)數(shù)據(jù)類型(MPI_INTEGER,MPI_REAL,MPI_DOUBLE_PRECISION,MPI_COMPLEX,MPI_LOGICAL,MPI_CHARACTER)。MPI重要概念(續(xù))2022/11/1628消息:分為數(shù)據(jù)(data)和包裝(envelope)兩個(gè)部分MPI重要概念(續(xù))自定義數(shù)據(jù)類型:基于基本數(shù)據(jù)類型,用戶自己定義的數(shù)據(jù)類型(后面介紹)。MPI對(duì)象:MPI系統(tǒng)內(nèi)部定義的數(shù)據(jù)結(jié)構(gòu),包括數(shù)據(jù)類型、進(jìn)程組、通信器等,它們對(duì)用戶不透明,在FORTRAN語(yǔ)言中,所有MPI對(duì)象均必須說明為“整型變量INTEGER”。MPI聯(lián)接器(handle):聯(lián)接MPI對(duì)象和用戶的橋梁,用戶可以通過它訪問和參與相應(yīng)MPI對(duì)象的具體操作;例如,MPI系統(tǒng)內(nèi)部提供的通信器MPI_COMM_WORLD;在FORTRAN語(yǔ)言中,所有MPI聯(lián)接器均必須說明為“整型變量INTEGER”。2022/11/1629MPI重要概念(續(xù))自定義數(shù)據(jù)類型:基于基本數(shù)據(jù)類型,用戶自MPI重要概念(續(xù))進(jìn)程拓?fù)浣Y(jié)構(gòu):進(jìn)程組內(nèi)部進(jìn)程之間的一種相互連接結(jié)構(gòu),如33網(wǎng)格,將在后面介紹。 3×3網(wǎng)格拓?fù)浣Y(jié)構(gòu)靜態(tài)進(jìn)程個(gè)數(shù):進(jìn)程數(shù)由命令“mpirun–npxxx”初始確定為xxx個(gè),程序執(zhí)行過程中不能動(dòng)態(tài)改變進(jìn)程的個(gè)數(shù)。2022/11/1630MPI重要概念(續(xù))進(jìn)程拓?fù)浣Y(jié)構(gòu):進(jìn)程組內(nèi)部進(jìn)程之間的一種相MPI重要概念(續(xù))消息緩存區(qū):應(yīng)用程序產(chǎn)生的消息包含的數(shù)據(jù)所處的內(nèi)存空間。標(biāo)準(zhǔn)輸入:所有進(jìn)程的標(biāo)準(zhǔn)輸入read(*,*)均省缺為當(dāng)前終端屏幕,且只能由0號(hào)進(jìn)程執(zhí)行該操作,其他進(jìn)程需要這些輸入?yún)?shù),只能由0號(hào)進(jìn)程執(zhí)行數(shù)據(jù)廣播操作。標(biāo)準(zhǔn)輸出:所有進(jìn)程可以獨(dú)立執(zhí)行標(biāo)準(zhǔn)輸出write(*,*),但其省缺為當(dāng)前終端屏幕。2022/11/1631MPI重要概念(續(xù))消息緩存區(qū):應(yīng)用程序產(chǎn)生的消息包含的數(shù)據(jù)MPI函數(shù)格式FORTAN語(yǔ)言中,最后一個(gè)參數(shù)為該函數(shù)調(diào)用是否成功的標(biāo)志:0表示成功,其它表示各種可能的錯(cuò)誤。C語(yǔ)言中,該標(biāo)志有函數(shù)參數(shù)返回。C:ierr=MPI_Comm_rank(myrank)F:MPI_Comm_rank(myrank,ierr)2022/11/1632MPI函數(shù)格式FORTAN語(yǔ)言中,最后一個(gè)參數(shù)為該函數(shù)調(diào)用MPI函數(shù)的使用查詢

由函數(shù)名查詢:man

函數(shù)名(MPI_Xxxx),注意大小寫,例如manMPI_Comm_rankmanMPI_SendmanMPI_recv2022/11/1633MPI函數(shù)的使用查詢由函數(shù)名查詢:man函數(shù)名(MPI函數(shù)的學(xué)習(xí)與使用

注重MPI函數(shù)的各類功能,由應(yīng)用程序的通信需求出發(fā),尋找匹配的函數(shù)類型,在查找具體函數(shù)名,采用man命令可以查詢?cè)摵瘮?shù)的具體參數(shù)含義和使用方法。2022/11/1634MPI函數(shù)的學(xué)習(xí)與使用注重MPI函數(shù)的各類功能,由應(yīng)用程一般的MPI程序設(shè)計(jì)流程圖程序參數(shù)說明CallMPI_Init()進(jìn)入MPI系統(tǒng),通信器MPI_COMM_WORLD形成

CallMPI_Comm_rank()CallMPI_Comm_size()建立新的通信器、定義新的數(shù)據(jù)類型和進(jìn)程拓?fù)浣Y(jié)構(gòu)2022/11/1635一般的MPI程序設(shè)計(jì)流程圖程序參數(shù)說明CallMPI_I一般的MPI程序設(shè)計(jì)流程圖(續(xù))應(yīng)用程序?qū)嶓w:.計(jì)算控制程序體;.進(jìn)程間通信;CallMPI_Finalize()End退出MPI系統(tǒng)

2022/11/1636一般的MPI程序設(shè)計(jì)流程圖(續(xù))應(yīng)用程序?qū)嶓w:CallMMPI并行編程環(huán)境進(jìn)程與消息傳遞

MPI并行程序設(shè)計(jì)入門初步的MPI消息傳遞函數(shù)先進(jìn)的MPI函數(shù)MPI并行程序示例面向性能的程序設(shè)計(jì)2022/11/1637MPI并行編程環(huán)境2022/11/1037點(diǎn)對(duì)點(diǎn)通信(point-to-point)定義:給定屬于同一通信器內(nèi)的兩個(gè)進(jìn)程,其中一個(gè)發(fā)送消息,一個(gè)接收消息。MPI系統(tǒng)定義的所有通信方式均建立在點(diǎn)對(duì)點(diǎn)通信之上。四種模式:標(biāo)準(zhǔn)模式、緩存區(qū)模式、同步模式、就緒模式。2022/11/1638點(diǎn)對(duì)點(diǎn)通信(point-to-point)定義:給定屬于同標(biāo)準(zhǔn)模式點(diǎn)對(duì)點(diǎn)通信進(jìn)程可以隨意地發(fā)送(接收)消息,與是否存在匹配的消息接收(發(fā)送)進(jìn)程無關(guān)。

發(fā)收匹配:

發(fā)收不匹配:

進(jìn)程0進(jìn)程1進(jìn)程0進(jìn)程1進(jìn)程22022/11/1639標(biāo)準(zhǔn)模式點(diǎn)對(duì)點(diǎn)通信進(jìn)程可以隨意地發(fā)送(接收)消息,與是否存標(biāo)準(zhǔn)模式點(diǎn)對(duì)點(diǎn)通信的分類阻塞式:消息發(fā)送函數(shù)返回,用戶可以對(duì)消息緩存區(qū)進(jìn)行處理,不會(huì)影響已發(fā)送的消息數(shù)據(jù);接收函數(shù)返回,用戶可以使用接收到的消息數(shù)據(jù)。非阻塞式:發(fā)送和接受函數(shù)返回后,必須調(diào)用另一類函數(shù)來確保它們的正確完成。2022/11/1640標(biāo)準(zhǔn)模式點(diǎn)對(duì)點(diǎn)通信的分類阻塞式:消息發(fā)送函數(shù)返回,用戶可以對(duì)標(biāo)準(zhǔn)模式點(diǎn)對(duì)點(diǎn)通信的分類舉例2022/11/1641標(biāo)準(zhǔn)模式點(diǎn)對(duì)點(diǎn)通信的分類舉例2022/11/1041點(diǎn)對(duì)點(diǎn)通信函數(shù)舉例阻塞式標(biāo)準(zhǔn)消息發(fā)送函數(shù)MPI_Send(buf,count,datatype,dest,tag,comm,ierr)Real*8(integer,…)buf:消息發(fā)送緩存區(qū)起始地址(Fortran,用戶的待發(fā)送的第一個(gè)數(shù)據(jù))integercount:buf起始的數(shù)據(jù)單元個(gè)數(shù)integerdatatype:數(shù)據(jù)類型(基本或用戶定義的)integerdest:接收進(jìn)程序號(hào)integertag:消息的標(biāo)號(hào)integercomm:通信器integerierr:函數(shù)調(diào)用返回錯(cuò)誤碼2022/11/1642點(diǎn)對(duì)點(diǎn)通信函數(shù)舉例阻塞式標(biāo)準(zhǔn)消息發(fā)送函數(shù)2022/11/10

real*8a(100,100)integerb(60,60)c-----發(fā)送50個(gè)雙精度數(shù)“a(5,20):a(54,20)”到2號(hào)進(jìn)程callMPI_Send(a(5,20),50,MPI_DOUBLE_PRECISION,2,&99999,MPI_COMM_WORLD,ierr)c-----發(fā)送20個(gè)整型數(shù)“b(20,40):b(39,40)”到5號(hào)進(jìn)程callMPI_Send(b(20,40),20,MPI_DOUBLE_PRECISION,5,&99999,MPI_COMM_WORLD,ierr)阻塞式標(biāo)準(zhǔn)消息發(fā)送函數(shù)舉例2022/11/1643

real*8a(100,100)阻塞式標(biāo)準(zhǔn)消息MPI_Recv(buf,count,datatype,dest,tag,comm,status,ierr)Real*8(integer,…)buf:消息接收緩存區(qū)起始地址(Fortran,用戶用于接受的第一個(gè)數(shù)據(jù))

integercount:buf起始的數(shù)據(jù)單元個(gè)數(shù)

integerdatatype:數(shù)據(jù)類型(基本或用戶定義的)

integerdest:發(fā)送進(jìn)程序號(hào)

integertag:消息的標(biāo)號(hào)

integercomm:通信器

integerstatus(MPI_STATUS_SIZE):接收狀態(tài)數(shù)組;

integerierr:函數(shù)調(diào)用返回錯(cuò)誤碼阻塞式標(biāo)準(zhǔn)消息接收函數(shù)

2022/11/1644MPI_Recv(buf,count,datatype阻塞式標(biāo)準(zhǔn)消息接收函數(shù)舉例

real*8a(100,100)integerb(60,60)c-----從2號(hào)進(jìn)程接收50個(gè)雙精度數(shù)到“a(5,20):a(54,20)”callMPI_Recv(a(5,20),50,MPI_DOUBLE_PRECISION,2,&99999,MPI_COMM_WORLD,status,ierr)c-----從5號(hào)進(jìn)程接收20個(gè)整型數(shù)到“b(20,40):b(39,40)”callMPI_Recv(b(20,40),20,MPI_DOUBLE_PRECISION,5,&99999,MPI_COMM_WORLD,status,ierr)其他點(diǎn)對(duì)點(diǎn)通信函數(shù):參考手冊(cè)。2022/11/1645阻塞式標(biāo)準(zhǔn)消息接收函數(shù)舉例real*8a(100,1聚合通信(CollectiveCommunication)定義:屬于同一通信器的所有MPI進(jìn)程均必須參與的通信操作。參與方式:調(diào)用同一聚合通信函數(shù)。函數(shù)類型:同步通信函數(shù):所有進(jìn)程在某個(gè)程序點(diǎn)上同步。

MPI_Barrier(comm,ierr)全局通信函數(shù)全局規(guī)約函數(shù)

2022/11/1646聚合通信(CollectiveCommunication)全局通信函數(shù)廣播:MPI_Bcast(buf,count,dtype,root,comm,ierr)root發(fā)送other接收收集:MPI_Gather(bufs,bufr,count,dtype,root,comm,ierr)all發(fā)送大小一致的數(shù)據(jù)塊root接收并按序號(hào)連續(xù)存放全收集:MPI_Allgather() all發(fā)送 all接收2022/11/1647全局通信函數(shù)廣播:MPI_Bcast(buf,count,全局通信函數(shù)(續(xù))索引收集:MPI_Gatherv()all發(fā)送大小不等的數(shù)據(jù)塊root接收并按索引間斷存放索引全收集:MPI_Allgatherv()all發(fā)送大小不等的數(shù)據(jù)塊all接收并按索引間斷存放2022/11/1648全局通信函數(shù)(續(xù))索引收集:MPI_Gatherv()20全局通信函數(shù)(續(xù))分散:MPI_Scatter(bufs,bufr,count,dtype,root,comm,ierr)root發(fā)送連續(xù)的大小一致的數(shù)據(jù)塊all接收索引分散:MPI_Scatterv()root發(fā)送間斷的的大小不一致的數(shù)據(jù)塊all接收全交換:MPI_Scatterv()all發(fā)送大小一致數(shù)據(jù)塊到各進(jìn)程all接收大小一致數(shù)據(jù)塊并按序號(hào)連續(xù)存放2022/11/1649全局通信函數(shù)(續(xù))分散:MPI_Scatter(bufs,b全局規(guī)約(globalreduction)函數(shù)規(guī)約:MPI_Reduce(sbuf,rbuf,count,dtype,op,root,comm,ierr)規(guī)約操作類型op:MPI_SUM,MPI_MIN,MPI_MAX,

MPI_PROD等12種。全規(guī)約:MPI_Allreduce()除要求將結(jié)果返回到所有進(jìn)程外,與MPI_Reduce()一致規(guī)約分散:MPI_Reduce_scatter()將規(guī)約結(jié)果分散到各進(jìn)程。

并行前綴計(jì)算:MPI_Scan()2022/11/1650全局規(guī)約(globalreduction)函數(shù)規(guī)約:MPIMPI并行編程環(huán)境進(jìn)程與消息傳遞

MPI并行程序設(shè)計(jì)入門初步的MPI消息傳遞函數(shù)先進(jìn)的MPI函數(shù)MPI并行程序示例面向性能的程序設(shè)計(jì)2022/11/1651MPI并行編程環(huán)境2022/11/1051自定義數(shù)據(jù)類型定義:在MPI系統(tǒng)已定義的基本數(shù)據(jù)類型(MPI_INTEGER,MPI_REAL,MPI_DOUBLE_PRECISION,MPI_CHARACTER等)基礎(chǔ)上,用戶根據(jù)需求,自己定義的數(shù)據(jù)類型。在用戶已定義好的數(shù)據(jù)類型基礎(chǔ)上,還可以進(jìn)一步定義新的數(shù)據(jù)類型。用戶定義的數(shù)據(jù)類型,必須由函數(shù)MPI_Type_Commit()提交給MPI系統(tǒng);此后,就可以象基本數(shù)據(jù)類型一樣,在消息傳遞函數(shù)中重復(fù)使用;并由函數(shù)MPI_Type_free()釋放。具體自定義數(shù)據(jù)類型函數(shù),請(qǐng)參考手冊(cè)。2022/11/1652自定義數(shù)據(jù)類型定義:在MPI系統(tǒng)已定義的基本數(shù)據(jù)類型(MP自定義數(shù)據(jù)類型(續(xù))

reala(1000)

發(fā)送:a(5:9)

callMPI_Send(a(5),5,MPI_REAL,…..)OK發(fā)送:a(5),a(7),a(9),a(11),a(13),a(15)doi=5,15,2callMPI_Send(a(i),1,MPI_REAL,….)OKenddo缺點(diǎn):多次發(fā)送,效率低,程序設(shè)計(jì)繁瑣改進(jìn):用戶定義新的數(shù)據(jù)類型callMPI_Type_vector(5,1,2,MPI_REAL,newtype,ierr)callMPI_Type_commit(newtype,ierr)提交callMPI_Send(a(5),1,newtype,….)callMPI_Type_free(newtype,ierr)釋放2022/11/1653自定義數(shù)據(jù)類型(續(xù)) reala(1000)202進(jìn)程拓?fù)浣Y(jié)構(gòu)

定義:根據(jù)應(yīng)用程序的特征,在進(jìn)程間建立的一種虛擬拓?fù)溥B接方式,以方便并行程序設(shè)計(jì)和提高并行計(jì)算性能。例:二維規(guī)則區(qū)域,3*3區(qū)域分解,9個(gè)進(jìn)程,建立Cartesion坐標(biāo),進(jìn)程(i,j)的相鄰進(jìn)程為(i-1,j),(i+1,j),(i,j-1),(i,j+1)。2022/11/1654進(jìn)程拓?fù)浣Y(jié)構(gòu)定義:根據(jù)應(yīng)用程序的特征,在進(jìn)程間建立的一種虛并行I/O各進(jìn)程可以類似于串行程序獨(dú)立地讀/寫不同的文件。MPICH1.2以上版本支持所有進(jìn)程并行讀寫同一個(gè)文件。2022/11/1655并行I/O各進(jìn)程可以類似于串行程序獨(dú)立地讀/寫不同的文件。MPI并行編程環(huán)境進(jìn)程與消息傳遞

MPI并行程序設(shè)計(jì)入門初步的MPI消息傳遞函數(shù)先進(jìn)的MPI函數(shù)MPI并行程序示例面向性能的程序設(shè)計(jì)2022/11/1656MPI并行編程環(huán)境2022/11/1056MPI并行程序例2矩陣乘積:A為M×N階矩陣,B為N×L階矩陣,C為M×L階矩陣。計(jì)算矩陣乘積C=AB。算法描述:假設(shè)使用nprocs個(gè)MPI進(jìn)程,為簡(jiǎn)單起見假定M和L均為nprocs的倍數(shù)。A和C按行等分成子塊分別存儲(chǔ)在不同的進(jìn)程中,而B則按列等分成子塊分別存儲(chǔ)在不同的進(jìn)程中。A,B和C的子塊大小分別為mloc×N,N×lloc和mloc×L,其中mloc=M/nprocs,lloc=L/nprocs。具體存儲(chǔ)方式為(k=0,…,nprocs-1): 存儲(chǔ)在進(jìn)程k的數(shù)組A中 存儲(chǔ)在進(jìn)程k的數(shù)組B中 存儲(chǔ)在進(jìn)程k的數(shù)組C中2022/11/1657MPI并行程序例2矩陣乘積:A為M×N階矩陣,B為N×L階MPI并行程序例2(續(xù))算法:矩陣A和C的子塊不動(dòng),矩陣B的子塊在各個(gè)進(jìn)程間循環(huán)移動(dòng)。如圖,是當(dāng)nprocs=3時(shí)的計(jì)算流程示意圖。A0A1A2×B0B1B2=A0×B0A0×B1A0×B2C0A1×B0A1×B1A1×B2C1A2×B0A2×B1A2×B2C2A0B0B2B1A1B1B0B2A2B2B1B0進(jìn)程1進(jìn)程2進(jìn)程32022/11/1658MPI并行程序例2(續(xù))算法:矩陣A和C的子塊不動(dòng),矩陣BMPI并行程序例2(續(xù))MPI并行程序:主程序負(fù)責(zé)分配存儲(chǔ)單元并生成矩陣A和B的子塊,然后調(diào)用子程序matmul完成矩陣的乘法運(yùn)算。其中nprocs為MPI進(jìn)程數(shù),myrank為當(dāng)前進(jìn)程的MPI進(jìn)程號(hào)。數(shù)組A,B和C分別存儲(chǔ)矩陣A,B和C的子塊。work為工作數(shù)組,大小與數(shù)組B一樣。乘法子程序使用MPI_Sendrecv_replace。(ex1.f)使用異步通信函數(shù)MPI_Isend/MPI_Irecv,在適當(dāng)?shù)挠布h(huán)境下它可以使得計(jì)算與通信重疊進(jìn)行。(ex2.f)調(diào)用BLAS庫(kù)函數(shù)完成矩陣子塊的乘積。選用適當(dāng)?shù)腂LAS庫(kù)可以大幅度提高程序的實(shí)際運(yùn)行性能。注意,編譯該程序時(shí)必須與BLAS庫(kù)連接。(ex3.f)2022/11/1659MPI并行程序例2(續(xù))MPI并行程序:主程序負(fù)責(zé)分配存儲(chǔ)MPI并行程序例3

一維Dirichlet問題:算法:均勻網(wǎng)格有限差分離散,Jacobi迭代求解。區(qū)域分解:nproc=4,n=21,ns=(n-1)/nproc+1=6源程序:1dpoisson.f2022/11/1660MPI并行程序例3一維Dirichlet問題:2022/1MPI并行編程環(huán)境進(jìn)程與消息傳遞

MPI并行程序設(shè)計(jì)入門初步的MPI消息傳遞函數(shù)先進(jìn)的MPI函數(shù)MPI并行程序示例面向性能的程序設(shè)計(jì)2022/11/1661MPI并行編程環(huán)境2022/11/1061設(shè)計(jì)高性能并行程序的要點(diǎn)與技術(shù)

劃分階段的性能問題在多存儲(chǔ)系統(tǒng)中的數(shù)據(jù)訪問和通信

性能的整合

從處理器角度看到的性能因素

程序設(shè)計(jì)模型的影響

2022/11/1662設(shè)計(jì)高性能并行程序的要點(diǎn)與技術(shù)劃分階段的性能問題2022/在分解和分配步驟中,我們可以將并行計(jì)算機(jī)系統(tǒng)簡(jiǎn)單地看作是一個(gè)相互合作的處理器集合,不用考慮程序設(shè)計(jì)模型和硬件系統(tǒng)組織。我們只需知道在處理器之間的通信開銷是很大的。此時(shí),在算法方面的三個(gè)基本要素是:平衡負(fù)載,減少花在等待同步事件上的時(shí)間減少通信開銷減少由確定和管理分配所帶來的附加工作不幸的是,即使這三種基本目標(biāo)也是相互沖突的,必須進(jìn)行折衷權(quán)衡。

劃分階段的性能問題2022/11/1663在分解和分配步驟中,我們可以將并行計(jì)算機(jī)系統(tǒng)簡(jiǎn)單地看作是一個(gè)平衡負(fù)載和減少同步等待時(shí)間的過程分為四步在分解中識(shí)別足夠的并發(fā)性(數(shù)據(jù)并行和功能并行);決定管理并發(fā)性的方式(靜態(tài)分配和動(dòng)態(tài)分配的對(duì)比);確定并發(fā)性開發(fā)的粒度;降低序列化和同步代價(jià)。2022/11/1664平衡負(fù)載和減少同步等待時(shí)間的過程分為四步在分解中識(shí)別足夠的并在多存儲(chǔ)系統(tǒng)中的數(shù)據(jù)訪問和通信多處理器系統(tǒng)也是多存儲(chǔ)器系統(tǒng),多緩存系統(tǒng)。系統(tǒng)這些組成部分的作用對(duì)程序執(zhí)行性能是十分重要的,并且其重要性與程序設(shè)計(jì)模型無關(guān)(盡管程序設(shè)計(jì)模型可能影響某些性能折衷考慮的特性)。在這里,我們從一種不同的角度來看多處理器系統(tǒng)。多處理器系統(tǒng)看成為擴(kuò)展的存儲(chǔ)層次結(jié)構(gòu)

在擴(kuò)展的存儲(chǔ)層次中的附加通信

用工作集的觀念看人為的通信和數(shù)據(jù)的復(fù)制2022/11/1665在多存儲(chǔ)系統(tǒng)中的數(shù)據(jù)訪問和通信多處理器系統(tǒng)也是多存儲(chǔ)器系統(tǒng),性能的整合減少人為通信:開發(fā)時(shí)間局部性與空間局部性;將通信結(jié)構(gòu)化以降低開銷:通過減少通信開銷和降低延遲,增加帶寬,減少占有度,提供機(jī)制來分散沖突,用計(jì)算和通信來重疊通信。2022/11/1666性能的整合減少人為通信:開發(fā)時(shí)間局部性與空間局部性;202從處理器角度看到的性能因素

在我們通常的分布存儲(chǔ)并行系統(tǒng)結(jié)構(gòu)上,并行執(zhí)行時(shí)間有五個(gè)分量:忙有用:處理器花在執(zhí)行指令上的時(shí)間,那些指令本來在串行程序中也是要執(zhí)行的。假設(shè)一個(gè)直接從串行算法中導(dǎo)出的確定性的并行程序,所有處理器的有用忙時(shí)間之和等于串行執(zhí)行的有用忙時(shí)間。忙開銷:處理器花在執(zhí)行那些在串行程序中不需要的指令上的時(shí)間。這直接對(duì)應(yīng)于并行程序中的額外工作部分。數(shù)據(jù)局部:等待數(shù)據(jù)引用被它自己的存儲(chǔ)系統(tǒng)滿足的時(shí)間;即等待的引用不會(huì)產(chǎn)生和其它節(jié)點(diǎn)的通信。數(shù)據(jù)遠(yuǎn)程:等待數(shù)據(jù)通信的時(shí)間,無論是固有通信還是附加通信。這代表處理器看到的通信代價(jià)。2022/11/1667從處理器角度看到的性能因素在我們通常的分布存儲(chǔ)并行系統(tǒng)結(jié)構(gòu)同步:等待其它進(jìn)程給出某個(gè)事件發(fā)生的信號(hào),有了該信號(hào),本進(jìn)程才能推進(jìn)。這包括負(fù)載不平衡和程序中的串行化現(xiàn)象,還有實(shí)際花在執(zhí)行同步操作和訪問同步變量上的時(shí)間。當(dāng)它等待的時(shí)候,一個(gè)處理器可能重復(fù)檢測(cè)某個(gè)變量的值,直到改變—這就要執(zhí)行指令—或者它停滯等待,這取決于同步的實(shí)現(xiàn)方式。同步、忙開銷、遠(yuǎn)程數(shù)據(jù)訪問分量是由于并行所引入的開銷,在串行程序在單處理器上執(zhí)行沒有。固有通信大多數(shù)包含在遠(yuǎn)程數(shù)據(jù)分量中,它的某些(通常很?。┎糠挚赡芤苍跀?shù)據(jù)局部分量中體現(xiàn)出來。從處理器角度看到的性能因素(續(xù))

2022/11/1668同步:等待其它進(jìn)程給出某個(gè)事件發(fā)生的信號(hào),有了該信號(hào),本進(jìn)程程序設(shè)計(jì)模型的影響經(jīng)驗(yàn)表明,隨著應(yīng)用變得更復(fù)雜和更非規(guī)則,透明命名和復(fù)制的有用性增加,這是傾向于共享存儲(chǔ)的觀點(diǎn)。然而,由于通信自然是細(xì)粒度的(特別是非規(guī)則應(yīng)用),還由于大粒度通信和一致性引起的性能問題,支持共享空間就要求有大膽的通信系統(tǒng)結(jié)構(gòu),用硬件來支持大多數(shù)功能。許多計(jì)算機(jī)公司現(xiàn)在正建造這樣的機(jī)器,作為它們的高端系統(tǒng)。在另一方面,便宜的工作站或者多處理器群也正在逐步流行起來。這些系統(tǒng)通常是消息傳遞程序設(shè)計(jì)的,這是由于消息傳遞的性能模型比較好定義,可以用大消息來分?jǐn)傞_銷,程序員有顯式的控制,以及不同的機(jī)器操作粒度對(duì)性能的相對(duì)影響不大。2022/11/1669程序設(shè)計(jì)模型的影響經(jīng)驗(yàn)表明,隨著應(yīng)用變得更復(fù)雜和更非規(guī)則,透總結(jié)評(píng)述

我們已經(jīng)看到,性能的方方面面是相互制約的,設(shè)計(jì)好的并行程序的藝術(shù)在于在相互矛盾的要求中獲得適當(dāng)?shù)恼壑?。以高性能為目?biāo)的程序設(shè)計(jì)也是一個(gè)逐步求精的過程:在后面所發(fā)現(xiàn)的系統(tǒng)或者程序的特點(diǎn),可能導(dǎo)致在前一個(gè)步驟中作的決定被修改。將性能的潛力都發(fā)揮出來可能需要很大的努力,這取決于應(yīng)用和系統(tǒng)兩個(gè)方面。進(jìn)而,不同技術(shù)一起發(fā)揮作用的程度和方式能夠大大影響表現(xiàn)給系統(tǒng)結(jié)構(gòu)的負(fù)載的特點(diǎn)。

2022/11/1670總結(jié)評(píng)述我們已經(jīng)看到,性能的方方面面是相互制約的,設(shè)計(jì)好的問題討論請(qǐng)聯(lián)系王振海、趙俊峰Tel:88493550-17Email:zhwang@zhaojf_77@2022/11/1671問題討論2022/11/1071Thanks!2022/11/1672Thanks!2022/11/1072基于MPI的并行程序設(shè)計(jì)王振海西北工業(yè)大學(xué)理學(xué)院西北工業(yè)大學(xué)高性能計(jì)算研究與發(fā)展中心2022/11/1673基于MPI的并行程序設(shè)計(jì)王振海2022/11/101MPI并行編程環(huán)境進(jìn)程與消息傳遞

MPI并行程序設(shè)計(jì)入門初步的MPI消息傳遞函數(shù)先進(jìn)的MPI函數(shù)MPI并行程序示例面向性能的程序設(shè)計(jì)

主要內(nèi)容2022/11/1674MPI并行編程環(huán)境主要內(nèi)容2022/11/102目前,高性能并行機(jī)主要可以分為對(duì)稱多處理共享存儲(chǔ)并行機(jī)(SMP,SymmetricMultiProcessor)、分布式共享存儲(chǔ)多處理機(jī)(DSM,DistributiedSharedMemory)、大規(guī)模并行處理機(jī)(MPP,MassivelyParallelProcessor)和微機(jī)機(jī)群(Cluster)等四類。在這些并行機(jī)上,并行程序設(shè)計(jì)平臺(tái)主要可分為消息傳遞、共享存儲(chǔ)和數(shù)據(jù)并行三類,其中消息傳遞具有很好的可移植性,它能被所有這些類型的并行機(jī)所支持,而共享存儲(chǔ)只能在在SMP和DSM并行機(jī)中使用,數(shù)據(jù)并行只能在SMP,DSM和MPP并行機(jī)上使用。并行編程環(huán)境簡(jiǎn)介2022/11/1675目前,高性能并行機(jī)主要可以分為對(duì)稱多處理共享存儲(chǔ)并行機(jī)(SM消息傳遞并行編程環(huán)境(MPI:MessagePassingInterface)是目前國(guó)際上最流行、可移植性和可擴(kuò)展性很好的并行程序設(shè)計(jì)平臺(tái),并被當(dāng)前流行的所有高性能并行機(jī)所支持。它是在標(biāo)準(zhǔn)串行程序設(shè)計(jì)語(yǔ)言(C,F(xiàn)ortran,C++)的基礎(chǔ)上,再加入實(shí)現(xiàn)進(jìn)程間通信的MPI消息傳遞庫(kù)函數(shù),就構(gòu)成了MPI并行程序設(shè)計(jì)所依賴的并行編程環(huán)境。MPI已經(jīng)在Windows系列的非Unix、Linux平臺(tái)上實(shí)現(xiàn),其程序設(shè)計(jì)語(yǔ)言支持C,Fortran和Java。在國(guó)產(chǎn)的三大并行機(jī)系列神威、銀河和曙光上也都實(shí)現(xiàn)了對(duì)MPI和支持。MPI并行編程環(huán)境2022/11/1676消息傳遞并行編程環(huán)境(MPI:MessagePassingMPI并行環(huán)境的應(yīng)用現(xiàn)狀

MPI是全球工業(yè)、政府和科研部門聯(lián)合推出的適合進(jìn)程間進(jìn)行標(biāo)準(zhǔn)消息傳遞的并行程序設(shè)計(jì)平臺(tái),最初版MPI1.0本于1994年6月推出,目前最新的為MPI2.0版,于1998年10月推出。MPI的具體實(shí)現(xiàn):MPICH和LAMMPI,目前均已實(shí)現(xiàn)MPI1.2版,適用于任何并行計(jì)算平臺(tái);部分并行機(jī)已實(shí)現(xiàn)MPI2.0版。MPI是目前應(yīng)用最廣的并行程序設(shè)計(jì)平臺(tái),幾乎被所有并行計(jì)算環(huán)境(共享和分布式存儲(chǔ)并行機(jī)、MPP、機(jī)群系統(tǒng)等)和流行的多進(jìn)程操作系統(tǒng)(UNIX、WindowsNT)所支持,基于它開發(fā)的應(yīng)用程序具有最佳的可移植性。2022/11/1677MPI并行環(huán)境的應(yīng)用現(xiàn)狀MPI是全球工業(yè)、政府和科研部門聯(lián)MPI并行環(huán)境的應(yīng)用現(xiàn)狀(續(xù))

目前高效率的超大規(guī)模并行計(jì)算(1000個(gè)處理器)最可信賴的平臺(tái)。工業(yè)、科學(xué)與工程計(jì)算部門的大量科研和工程軟件(氣象、石油、地震、空氣動(dòng)力學(xué)、核等)目前已經(jīng)移植到MPI平臺(tái),發(fā)揮了重要作用。

MPI的優(yōu)點(diǎn):(1)具有很好的可移植性,幾乎被所有的并行環(huán)境支持;(2)具有很好的可擴(kuò)展性,是目前高效率的大規(guī)模并行計(jì)算最可信賴的平臺(tái);(3)比其它消息傳遞系統(tǒng)好用;(4)有完備的異步通信功能;(5)有精確的定義,從而為并行軟件產(chǎn)業(yè)的發(fā)展提供了必要的條件。2022/11/1678MPI并行環(huán)境的應(yīng)用現(xiàn)狀(續(xù))目前高效率的超大規(guī)模并行計(jì)算MPI并行環(huán)境的應(yīng)用現(xiàn)狀(續(xù))

MPI2.0版在1.0版的基礎(chǔ)上,增加了如下的消息傳遞功能:(1)并行I/O:允許多個(gè)進(jìn)程同時(shí)讀寫同一個(gè)文件;(2)線程安全:允許MPI進(jìn)程的多個(gè)線程執(zhí)行,即支持與OpenMP的混合并行編程;(3)動(dòng)態(tài)進(jìn)程管理:允許并行應(yīng)用程序在執(zhí)行過程中,動(dòng)態(tài)地增加和刪除進(jìn)程個(gè)數(shù);(4)單邊通信:允許某個(gè)進(jìn)程對(duì)其它進(jìn)程的局部?jī)?nèi)存單元直接執(zhí)行讀寫訪問,而步需要對(duì)方進(jìn)程的顯式干預(yù);(5)并行應(yīng)用程序之間的動(dòng)態(tài)互操作:允許各個(gè)MPI并行應(yīng)用程序之間動(dòng)態(tài)地建立和刪除消息傳遞通道。目前,各類并行機(jī),特別式微機(jī)機(jī)群,只實(shí)現(xiàn)了MPI2.0的部分功能。本中心機(jī)群所支持的為MPI1.2.5版本。2022/11/1679MPI并行環(huán)境的應(yīng)用現(xiàn)狀(續(xù))MPI2.0版在1.0版的MPI并行編程環(huán)境進(jìn)程與消息傳遞

MPI并行程序設(shè)計(jì)入門初步的MPI消息傳遞函數(shù)先進(jìn)的MPI函數(shù)MPI并行程序示例面向性能的程序設(shè)計(jì)2022/11/1680MPI并行編程環(huán)境2022/11/108單個(gè)進(jìn)程(process)進(jìn)程是一個(gè)程序,同時(shí)包含它的執(zhí)行環(huán)境(內(nèi)存、寄存器、程序計(jì)數(shù)器等),是操作系統(tǒng)中獨(dú)立存在的可執(zhí)行的基本程序單位。通俗理解:串行應(yīng)用程序編譯形成的可執(zhí)行代碼,分為“指令”和“數(shù)據(jù)”兩個(gè)部分,并在程序執(zhí)行時(shí)“獨(dú)立地申請(qǐng)和占有”內(nèi)存空間,且所有計(jì)算均局限于該內(nèi)存空間。進(jìn)程1內(nèi)存進(jìn)程22022/11/1681單個(gè)進(jìn)程(process)進(jìn)程是一個(gè)程序,同時(shí)包含它的執(zhí)行環(huán)單機(jī)內(nèi)多個(gè)進(jìn)程

多個(gè)進(jìn)程可以同時(shí)存在于單機(jī)內(nèi)同一操作系統(tǒng):由操作系統(tǒng)負(fù)責(zé)調(diào)度分時(shí)共享處理機(jī)資源(CPU、內(nèi)存、存儲(chǔ)、外設(shè)等)。進(jìn)程間相互獨(dú)立(內(nèi)存空間不相交):在操作系統(tǒng)調(diào)度下各自獨(dú)立地運(yùn)行,例如多個(gè)串行應(yīng)用程序在同一臺(tái)計(jì)算機(jī)中運(yùn)行。進(jìn)程間可以相互交換信息:例如數(shù)據(jù)交換、同步等待,消息是這些交換信息的基本單位,消息傳遞是指這些信息在進(jìn)程間的相互交換,是實(shí)現(xiàn)進(jìn)程間通信的唯一方式。2022/11/1682單機(jī)內(nèi)多個(gè)進(jìn)程多個(gè)進(jìn)程可以同時(shí)存在于單機(jī)內(nèi)同一操作系統(tǒng):由最基本的消息傳遞操作:發(fā)送消息(send)、接受消息(receive)、進(jìn)程同步(barrier)、規(guī)約(reduction)。消息傳遞的實(shí)現(xiàn):共享內(nèi)存或信號(hào)量,用戶不必關(guān)心。單機(jī)內(nèi)多個(gè)進(jìn)程(續(xù))2022/11/1683最基本的消息傳遞操作:發(fā)送消息(send)、接受消息(rec包含于通過網(wǎng)絡(luò)聯(lián)接的不同計(jì)算機(jī)的多個(gè)進(jìn)程

進(jìn)程獨(dú)立存在:進(jìn)程位于不同的計(jì)算機(jī),由各自獨(dú)立的操作系統(tǒng)調(diào)度,享有獨(dú)立的CPU和內(nèi)存資源。進(jìn)程間相互信息交換:消息傳遞。消息傳遞的實(shí)現(xiàn):基于網(wǎng)絡(luò)socket機(jī)制,用戶不必關(guān)心。2022/11/1684包含于通過網(wǎng)絡(luò)聯(lián)接的不同計(jì)算機(jī)的多個(gè)進(jìn)程進(jìn)程獨(dú)立存在:進(jìn)程消息傳遞庫(kù)函數(shù)

應(yīng)用程序接口(API):提供給應(yīng)用程序(FORTRAN、C、C++語(yǔ)言)的可直接調(diào)用的完成進(jìn)程間消息傳遞的某項(xiàng)特定功能的函數(shù)。消息傳遞庫(kù):所有定義的消息傳遞函數(shù)編譯形成的軟件庫(kù),調(diào)用其內(nèi)部函數(shù)的應(yīng)用程序,通過與之聯(lián)接,即可成為可并行執(zhí)行的程序。目前流行的消息傳遞函數(shù)庫(kù):PVM3.3.11、MPICH1.2、LAMMPI6.4等。2022/11/1685消息傳遞庫(kù)函數(shù)應(yīng)用程序接口(API):提供給應(yīng)用程序(FO標(biāo)準(zhǔn)消息傳遞界面MPIMPI標(biāo)準(zhǔn):根據(jù)應(yīng)用程序?qū)ο鬟f功能的需求,全球工業(yè)、應(yīng)用和研究部門聯(lián)合推出標(biāo)準(zhǔn)的消息傳遞界面函數(shù),不考慮其具體實(shí)現(xiàn),以保證并行應(yīng)用程序的可移植性。MPI的具體實(shí)現(xiàn):消息傳遞庫(kù)函數(shù),目前有影響的為MPICH和LAMMPI,我們注重MPICH系列。2022/11/1686標(biāo)準(zhǔn)消息傳遞界面MPIMPI標(biāo)準(zhǔn):根據(jù)應(yīng)用程序?qū)ο鬟f功能基于消息傳遞的并行程序執(zhí)行模式

SPMD模式:?jiǎn)纬绦蚨鄶?shù)據(jù)流2022/11/1687基于消息傳遞的并行程序執(zhí)行模式SPMD模式:?jiǎn)纬绦蚨鄶?shù)據(jù)流基于消息傳遞的并行程序執(zhí)行模式(續(xù))

MPM模式:多程序多數(shù)據(jù)流,除初始啟動(dòng)多個(gè)可執(zhí)行代碼,其余與SPMD模式一致。2022/11/1688基于消息傳遞的并行程序執(zhí)行模式(續(xù))MPM模式:多程序多數(shù)共享存儲(chǔ)與分布式存儲(chǔ)

屬于并行機(jī)體系結(jié)構(gòu)的范疇,與消息傳遞并行程序設(shè)計(jì)平臺(tái)無關(guān)。2022/11/1689共享存儲(chǔ)與分布式存儲(chǔ)屬于并行機(jī)體系結(jié)構(gòu)的范疇,與消息傳遞并消息傳遞是相對(duì)于進(jìn)程間通信方式而言的,與具體并行機(jī)存儲(chǔ)模式無關(guān),任何支持進(jìn)程間通信的并行機(jī),均可支持消息傳遞并行程序設(shè)計(jì)。幾乎所有共享和分布存儲(chǔ)并行計(jì)算環(huán)境均支持進(jìn)程間的消息傳遞通信。共享存儲(chǔ)與分布式存儲(chǔ)(續(xù))

2022/11/1690消息傳遞是相對(duì)于進(jìn)程間通信方式而言的,與具體并行機(jī)存儲(chǔ)模式無MPI并行編程環(huán)境進(jìn)程與消息傳遞

MPI并行程序設(shè)計(jì)入門初步的MPI消息傳遞函數(shù)先進(jìn)的MPI函數(shù)MPI并行程序示例面向性能的程序設(shè)計(jì)2022/11/1691MPI并行編程環(huán)境2022/11/1019MPI并行程序設(shè)計(jì)平臺(tái)由標(biāo)準(zhǔn)消息傳遞函數(shù)及相關(guān)輔助函數(shù)構(gòu)成,多個(gè)進(jìn)程通過調(diào)用這些函數(shù)(類似調(diào)用子程序),進(jìn)行通信。SPMD執(zhí)行模式:一個(gè)程序同時(shí)啟動(dòng)多份,形成多個(gè)獨(dú)立的進(jìn)程,在不同的處理機(jī)上運(yùn)行,擁有獨(dú)立的內(nèi)存空間,進(jìn)程間通信通過調(diào)用MPI函數(shù)來實(shí)現(xiàn)。每個(gè)進(jìn)程開始執(zhí)行時(shí),將獲得一個(gè)唯一的序號(hào)(rank)。例如啟動(dòng)P個(gè)進(jìn)程,序號(hào)依次為0,1,…,P-1。MPI并行程序2022/11/1692MPI并行程序設(shè)計(jì)平臺(tái)由標(biāo)準(zhǔn)消息傳遞函數(shù)及相關(guān)輔助函數(shù)構(gòu)成,MPI并行程序例1進(jìn)程0發(fā)送一個(gè)整數(shù)給進(jìn)程1;進(jìn)程1將該數(shù)加1,傳遞給進(jìn)程2;進(jìn)程2再將該數(shù)加1,再傳遞給進(jìn)程3;依次類推,最后,進(jìn)程P-1將該數(shù)傳遞給進(jìn)程0,由進(jìn)程0負(fù)責(zé)廣播該數(shù)給所有進(jìn)程,并打印輸出。programexample1include“mpif.h”!!MPI系統(tǒng)頭文件

integerstatus(MPI_STATUS_SIZE),my_rank,pintegersource,dest,tag,ierr,datac2022/11/1693MPI并行程序例1進(jìn)程0發(fā)送一個(gè)整數(shù)給進(jìn)程1;進(jìn)程1將該數(shù)MPI并行程序例1(續(xù))c-------進(jìn)入MPI系統(tǒng)

callMPI_Init(ierr)callMPI_Comm_rank(MPI_COMM_WORLD,my_rank,ierr)callMPI_Comm_size(MPI_COMM_WORLD,p,ierr)c-------數(shù)據(jù)交換

data=0tag=5source=my_rank-1if(source.eq.-1)source=p-1dest=my_rank+1if(dest.eq.p)dest=02022/11/1694MPI并行程序例1(續(xù))c-------進(jìn)入MPI系統(tǒng)202

if(my_rank.eq.0)thencallMPI_Send(data,1,MPI_INTEGER,dest,tag,MPI_COMM_WORLD,ierr)callMPI_Recv(data,1,MPI_INTEGER,source,tag,MPI_COMM_WORLD,status,ierr)elsecallMPI_Recv(data,1,MPI_INTEGER,source,tag,MPI_COMM_WORLD,status,ierr)data=data+1callMPI_Send(data,1,MPI_INTEGER,dest,tag,MPI_COMM_WORLD,ierr)endifcMPI并行程序例1(續(xù))2022/11/1695if(my_rank.eq.0)thenMPI并行程序例c-------廣播數(shù)據(jù)

callMPI_Bcast(data,1,MPI_INTEGER,0,MPI_COMM_WORLD,ierr)c------打印輸出

if(my_rank.eq.0)thenif(data.eq.p-1)thenprint*,”Successful,data=”,dataelseprint*,”Failure,data=”,dataendifendifccallMPI_Finalize(ierr)endMPI并行程序例1(續(xù))2022/11/1696c-------廣播數(shù)據(jù)MPI并行程序例1(續(xù))2022/1MPI并行程序的運(yùn)行MPI編譯命令:mpif77-oexam.eexample.f運(yùn)行命令:mpirun–np4exam.e運(yùn)行效果:MPI系統(tǒng)選擇相同或不同的4個(gè)處理機(jī),在每個(gè)處理機(jī)上運(yùn)行程序代碼exam.e。運(yùn)行結(jié)果:Successful,data=32022/11/1697MPI并行程序的運(yùn)行MPI編譯命令:mpif77-o運(yùn)行分析2022/11/1698運(yùn)行分析2022/11/1026MPI重要概念進(jìn)程序號(hào)(rank):各進(jìn)程通過函數(shù)MPI_Comm_rank()獲取各自的序號(hào)。消息號(hào):消息的標(biāo)號(hào)。通信器(Communicator):1)理解為一類進(jìn)程的集合,且在該集合內(nèi),進(jìn)程間可以相互通信;類比:郵局、電話局、國(guó)際網(wǎng);2)任何MPI通信函數(shù)均必須在某個(gè)通信器內(nèi)發(fā)生;3)MPI系統(tǒng)提供省缺的通信器MPI_COMM_WORLD,所有啟動(dòng)的MPI進(jìn)程通過調(diào)用函數(shù)MPI_Init()包含在該通信器內(nèi);4)各進(jìn)程通過函數(shù)MPI_Comm_size()獲取通信器包含的(初始啟動(dòng))的MPI進(jìn)程個(gè)數(shù)。2022/11/1699MPI重要概念進(jìn)程序號(hào)(rank):各進(jìn)程通過函數(shù)MPI_C消息:分為數(shù)據(jù)(data)和包裝(envelope)兩個(gè)部分,其中,包裝由接收進(jìn)程序號(hào)、發(fā)送進(jìn)程序號(hào)、消息標(biāo)號(hào)和通信器四部分組成,數(shù)據(jù)包含用戶將要傳遞的內(nèi)容。進(jìn)程組:一類進(jìn)程的集合,在它的基礎(chǔ)上,可以定義新的通信器?;緮?shù)據(jù)類型:對(duì)應(yīng)于FORTRAN和C語(yǔ)言的內(nèi)部數(shù)據(jù)類型(INTEGER,REAL,DOUBLEPRECISION,COMPLEX,LOGICAL,CHARACTER),MPI系統(tǒng)提供已定義好的對(duì)應(yīng)數(shù)據(jù)類型(MPI_INTEGER,MPI_REAL,MPI_DOUBLE_PRECISION,MPI_COMPLEX,MPI_LOGICAL,MPI_CHARACTER)。MPI重要概念(續(xù))2022/11/16100消息:分為數(shù)據(jù)(data)和包裝(envelope)兩個(gè)部分MPI重要概念(續(xù))自定義數(shù)據(jù)類型:基于基本數(shù)據(jù)類型,用戶自己定義的數(shù)據(jù)類型(后面介紹)。MPI對(duì)象:MPI系統(tǒng)內(nèi)部定義的數(shù)據(jù)結(jié)構(gòu),包括數(shù)據(jù)類型、進(jìn)程組、通信器等,它們對(duì)用戶不透明,在FORTRAN語(yǔ)言中,所有MPI對(duì)象均必須說明為“整型變量INTEGER”。MPI聯(lián)接器(handle):聯(lián)接MPI對(duì)象和用戶的橋梁,用戶可以通過它訪問和參與相應(yīng)MPI對(duì)象的具體操作;例如,MPI系統(tǒng)內(nèi)部提供的通信器MPI_COMM_WORLD;在FORTRAN語(yǔ)言中,所有MPI聯(lián)接器均必須說明為“整型變量INTEGER”。2022/11/16101MPI重要概念(續(xù))自定義數(shù)據(jù)類型:基于基本數(shù)據(jù)類型,用戶自MPI重要概念(續(xù))進(jìn)程拓?fù)浣Y(jié)構(gòu):進(jìn)程組內(nèi)部進(jìn)程之間的一種相互連接結(jié)構(gòu),如33網(wǎng)格,將在后面介紹。 3×3網(wǎng)格拓?fù)浣Y(jié)構(gòu)靜態(tài)進(jìn)程個(gè)數(shù):進(jìn)程數(shù)由命令“mpirun–npxxx”初始確定為xxx個(gè),程序執(zhí)行過程中不能動(dòng)態(tài)改變進(jìn)程的個(gè)數(shù)。2022/11/16102MPI重要概念(續(xù))進(jìn)程拓?fù)浣Y(jié)構(gòu):進(jìn)程組內(nèi)部進(jìn)程之間的一種相MPI重要概念(續(xù))消息緩存區(qū):應(yīng)用程序產(chǎn)生的消息包含的數(shù)據(jù)所處的內(nèi)存空間。標(biāo)準(zhǔn)輸入:所有進(jìn)程的標(biāo)準(zhǔn)輸入read(*,*)均省缺為當(dāng)前終端屏幕,且只能由0號(hào)進(jìn)程執(zhí)行該操作,其他進(jìn)程需要這些輸入?yún)?shù),只能由0號(hào)進(jìn)程執(zhí)行數(shù)據(jù)廣播操作。標(biāo)準(zhǔn)輸出:所有進(jìn)程可以獨(dú)立執(zhí)行標(biāo)準(zhǔn)輸出write(*,*),但其省缺為當(dāng)前終端屏幕。2022/11/16103MPI重要概念(續(xù))消息緩存區(qū):應(yīng)用程序產(chǎn)生的消息包含的數(shù)據(jù)MPI函數(shù)格式FORTAN語(yǔ)言中,最后一個(gè)參數(shù)為該函數(shù)調(diào)用是否成功的標(biāo)志:0表示成功,其它表示各種可能的錯(cuò)誤。C語(yǔ)言中,該標(biāo)志有函數(shù)參數(shù)返回。C:ierr=MPI_Comm_rank(myrank)F:MPI_Comm_rank(myrank,ierr)2022/11/16104MPI函數(shù)格式FORTAN語(yǔ)言中,最后一個(gè)參數(shù)為該函數(shù)調(diào)用MPI函數(shù)的使用查詢

由函數(shù)名查詢:man

函數(shù)名(MPI_Xxxx),注意大小寫,例如manMPI_Comm_rankmanMPI_SendmanMPI_recv2022/11/16105MPI函數(shù)的使用查詢由函數(shù)名查詢:man函數(shù)名(MPI函數(shù)的學(xué)習(xí)與使用

注重MPI函數(shù)的各類功能,由應(yīng)用程序的通信需求出發(fā),尋找匹配的函數(shù)類型,在查找具體函數(shù)名,采用man命令可以查詢?cè)摵瘮?shù)的具體參數(shù)含義和使用方法。2022/11/16106MPI函數(shù)的學(xué)習(xí)與使用注重MPI函數(shù)的各類功能,由應(yīng)用程一般的MPI程序設(shè)計(jì)流程圖程序參數(shù)說明CallMPI_Init()進(jìn)入MPI系統(tǒng),通信器MPI_COMM_WORLD形成

CallMPI_Comm_rank()CallMPI_Comm_size()建立新的通信器、定義新的數(shù)據(jù)類型和進(jìn)程拓?fù)浣Y(jié)構(gòu)2022/11/16107一般的MPI程序設(shè)計(jì)流程圖程序參數(shù)說明CallMPI_I一般的MPI程序設(shè)計(jì)流程圖(續(xù))應(yīng)用程序?qū)嶓w:.計(jì)算控制程序體;.進(jìn)程間通信;CallMPI_Finalize()End退出MPI系統(tǒng)

2022/11/16108一般的MPI程序設(shè)計(jì)流程圖(續(xù))應(yīng)用程序?qū)嶓w:CallMMPI并行編程環(huán)境進(jìn)程與消息傳遞

MPI并行程序設(shè)計(jì)入門初步的MPI消息傳遞函數(shù)先進(jìn)的MPI函數(shù)MPI并行程序示例面向性能的程序設(shè)計(jì)2022/11/16109MPI并行編程環(huán)境2022/11/1037點(diǎn)對(duì)點(diǎn)通信(point-to-point)定義:給定屬于同一通信器內(nèi)的兩個(gè)進(jìn)程,其中一個(gè)發(fā)送消息,一個(gè)接收消息。MPI系統(tǒng)定義的所有通信方式均建立在點(diǎn)對(duì)點(diǎn)通信之上。四種模式:標(biāo)準(zhǔn)模式、緩存區(qū)模式、同步模式、就緒模式。2022/11/16110點(diǎn)對(duì)點(diǎn)通信(point-to-point)定義:給定屬于同標(biāo)準(zhǔn)模式點(diǎn)對(duì)點(diǎn)通信進(jìn)程可以隨意地發(fā)送(接收)消息,與是否存在匹配的消息接收(發(fā)送)進(jìn)程無關(guān)。

發(fā)收匹配:

發(fā)收不匹配:

進(jìn)程0進(jìn)程1進(jìn)程0進(jìn)程1進(jìn)程22022/11/16111標(biāo)準(zhǔn)模式點(diǎn)對(duì)點(diǎn)通信進(jìn)程可以隨意地發(fā)送(接收)消息,與是否存標(biāo)準(zhǔn)模式點(diǎn)對(duì)點(diǎn)通信的分類阻塞式:消息發(fā)送函數(shù)返回,用戶可以對(duì)消息緩存區(qū)進(jìn)行處理,不會(huì)影響已發(fā)送的消息數(shù)據(jù);接收函數(shù)返回,用戶可以使用接收到的消息數(shù)據(jù)。非阻塞式:發(fā)送和接受函數(shù)返回后,必須調(diào)用另一類函數(shù)來確保它們的正確完成。2022/11/16112標(biāo)準(zhǔn)模式點(diǎn)對(duì)點(diǎn)通信的分類阻塞式:消息發(fā)送函數(shù)返回,用戶可以對(duì)標(biāo)準(zhǔn)模式點(diǎn)對(duì)點(diǎn)通信的分類舉例2022/11/16113標(biāo)準(zhǔn)模式點(diǎn)對(duì)點(diǎn)通信的分類舉例2022/11/1041點(diǎn)對(duì)點(diǎn)通信函數(shù)舉例阻塞式標(biāo)準(zhǔn)消息發(fā)送函數(shù)MPI_Send(buf,count,datatype,dest,tag,comm,ierr)Real*8(integer,…)buf:消息發(fā)送緩存區(qū)起始地址(Fortran,用戶的待發(fā)送的第一個(gè)數(shù)據(jù))integercount:buf起始的數(shù)據(jù)單元個(gè)數(shù)integerdatatype:數(shù)據(jù)類型(基本或用戶定義的)integerdest:接收進(jìn)程序號(hào)integertag:消息的標(biāo)號(hào)integercomm:通信器integerierr:函數(shù)調(diào)用返回錯(cuò)誤碼2022/11/16114點(diǎn)對(duì)點(diǎn)通信函數(shù)舉例阻塞式標(biāo)準(zhǔn)消息發(fā)送函數(shù)2022/11/10

real*8a(100,100)integerb(60,60)c-----發(fā)送50個(gè)雙精度數(shù)“a(5,20):a(54,20)”到2號(hào)進(jìn)程callMPI_Send(a(5,20),50,MPI_DOUBLE_PRECISION,2,&99999,MPI_COMM_WORLD,ierr)c-----發(fā)送20個(gè)整型數(shù)“b(20,40):b(39,40)”到5號(hào)進(jìn)程callMPI_Send(b(20,40),20,MPI_DOUBLE_PRECISION,5,&99999,MPI_COMM_WORLD,ierr)阻塞式標(biāo)準(zhǔn)消息發(fā)送函數(shù)舉例2022/11/16115

real*8a(100,100)阻塞式標(biāo)準(zhǔn)消息MPI_Recv(buf,count,datatype,dest,tag,comm,status,ierr)Real*8(integer,…)buf:消息接收緩存區(qū)起始地址(Fortran,用戶用于接受的第一個(gè)數(shù)據(jù))

integercount:buf起始的數(shù)據(jù)單元個(gè)數(shù)

integerdatatype:數(shù)據(jù)類型(基本或用戶定義的)

integerdest:發(fā)送進(jìn)程序號(hào)

integertag:消息的標(biāo)號(hào)

integercomm:通信器

integerstatus(MPI_STATUS_SIZE):接收狀態(tài)數(shù)組;

integerierr:函數(shù)調(diào)用返回錯(cuò)誤碼阻塞式標(biāo)準(zhǔn)消息接收函數(shù)

2022/11/16116MPI_Recv(buf,count,datatype阻塞式標(biāo)準(zhǔn)消息接收函數(shù)舉例

real*8a(100,100)integerb(60,60)c-----從2號(hào)進(jìn)程接收50個(gè)雙精度數(shù)到“a(5,20):a(54,20)”callMPI_Recv(a(5,20),50,MPI_DOUBLE_PRECISION,2,&99999,MPI_COMM_WORLD,status,ierr)c-----從5號(hào)進(jìn)程接收20個(gè)整型數(shù)到“b(20,40):b(39,40)”ca

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝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)論