




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
目錄
■第一章并行計算概述
?第二章MPI簡介
■第三章MPI編程
■第四章MPI高級編程
目錄
>第一章并行計算概述
?第二章MPI簡介
■第三章MPI編程
■第四章MPI高級編程
第一章并行計算概述
-為什么要采用并行計算?
■并行計算機的分類
并行算法的分類
4fenoi/o聯(lián)想
串行程序的發(fā)展阻礙
■物理速度漸變發(fā)展
-芯片速度每18月加快一倍
-內(nèi)存?zhèn)鬏斅拭磕昙涌?%
-物理極限無法突破
-芯片晶體管接近原子極限
-傳輸速度不可能突破光速
計算速度如何提升?
5fenoi/o聯(lián)想
下一步?
并行計
6fenoi/o聯(lián)想
為什麼要采用并行計算?
-串行程序速度提升緩慢
■可以加快速度
-更短的時間內(nèi)解決相同的問題
-相同的時間內(nèi)解決更多更復(fù)雜的問題
■可以加大規(guī)模--計算更大規(guī)模的問題
7fenoi/o聯(lián)想
并行計算機的分類:
指令與數(shù)據(jù):
數(shù)
數(shù)
據(jù)
據(jù)
個
個
數(shù)
數(shù)
DD
MSIMDMIMDMSPMDMPMD
SSISDMISDSSPSDMPSD
SM指令個數(shù)ISM程序個數(shù)P
8fenoi/o聯(lián)想
存儲方式
-共享內(nèi)存
?ccNUMA;SMP
-分布式內(nèi)存
?MPP;Cluster
9fenoi/o聯(lián)恕
三種計算模型
legend:processormemorynetwork
(c)
uniprocessordistributedmemory
10fenoi/o聯(lián)想
并行化分解方法
■任務(wù)分解
-多任務(wù)并發(fā)執(zhí)行
■功能分解
-分解被執(zhí)行的計算
■區(qū)域分解
-分解被執(zhí)行的數(shù)據(jù)
11fenoi/o聯(lián)想
分布內(nèi)存并行方式
■任務(wù)并行
-不同參數(shù)的大量工況計算
■區(qū)域分解并行
-大規(guī)模多節(jié)點分塊并行計算
12加nouo聯(lián)想
并行算法的分類
'按運算的基本對象
-數(shù)值并行算法(數(shù)值計算)
-非數(shù)值并行算法(符號計算)
■按進(jìn)程間的依賴關(guān)系
-同步并行算法
-異步并行算法
-純并行算法
'按并行計算任務(wù)的大小
-粗粒度并行算法
-中粒度并行算法
-細(xì)粒度并行算法
13fenoi/o聯(lián)想
目錄
■第一章并行計算概述
>第二章MPI簡介
■第三章MPI編程
■第四章MPI高級編程
第二章MP工簡介
什么是MP工?
MP工的實現(xiàn)
MP工的安裝
MP工的編譯
MP工的運行
15■enouo聯(lián)想
什么是MP工?
MPI(MassagePassing工nt一rfac一)
?1994年5月發(fā)布的一種消息傳遞接口
■MP工是一個庫,而不是一門語言
■MP工是一種標(biāo)準(zhǔn)或規(guī)范的代表
■MP工是一個消息傳遞編程模型
■MP工提供與C和Fortran語言的綁定
16fenoi/o聯(lián)想
MP工的歷史
-MP工初稿:美國并行計算中心工作會議(92年4月)
■MP工-1公布:第一屆MP工大會(93年1月)
■MP工標(biāo)準(zhǔn)正式發(fā)布:1994年5月
■MP工-2發(fā)布:MP工論壇(97年)
17fenoi/o聯(lián)想
MP工的實現(xiàn)
■MPICH:最重要的MP工實現(xiàn)
-與MP工-1規(guī)范同步發(fā)展的版本
-支持部分MP工-2的特征(如動態(tài)生成進(jìn)程等)
-MPICHGM*-支持Myrinet
-MVAPICH*一支持InfiniBand
LAM(LocalAr一aMulticomput一r)
-OhioStat一Univ一rsity開發(fā)
-http://WWW.工am-mpi.org/download/下載
18fenoi/o聯(lián)想
MP工的安裝—MPICH
■步驟一:下載最近的安裝包
?步驟二:解壓縮
-tar-xzvfmpich.tar.gz
19fenoi/o聯(lián)想
MP工的安裝一MPICH
■步驟三:configur一
-幾個重要的配置選項:
?通訊設(shè)備
?編譯器
?支持SMP?
-執(zhí)行:
configur一一with—d一vic^=ch_p4\
-cc=icc-fc=ifc-f90=ifc—c++=icc\
-prefix=/usr/local/mpich-1.2.5
-查看日志文件
20fenoi/o聯(lián)想
MP工的安裝—MPICH
■步驟四:編譯
-執(zhí)行:make>&mak一.log
-查看日志文件
■步驟五:安裝
-執(zhí)行:makeinstall
21fenoi/o聯(lián)想
MP工的編譯
-用MP工的編譯器:
-mpif77-ompi_progmpi_prog.f
-mpicc-ompi_progmpi_proc.c
-mpif90-ompi_progmpi_prof.f90
-mpiCC-ompi_progmpi_prof.C
■用工nt一1編譯器:
-ifc-ompi_progmpi_prog.f
-L/usr/local/mpich-1.2.5/lib-Ifmpich-Impich
22fenoi/o聯(lián)想
MP工的運行
運行過程:
23fenoi/o聯(lián)想
目錄
■第一章并行計算概述
?第二章MPI簡介
>第三章MPI編程
■第四章MPI高級編程
第二早MPI編程
A簡單的MP工編程
■用戶自定義類型
安全的通訊模式
25跖/101/0聯(lián)想
MPI介紹
■MP工是個復(fù)雜的系統(tǒng),它為程序員提供一個并行環(huán)境庫,程序員
通過調(diào)用MP工的庫程序來達(dá)到程序員所要達(dá)到的并行目的
■MP工提供C語言和Fortran語言接口,它包含了129個函數(shù)(根
據(jù)1994年發(fā)布的MP工標(biāo)準(zhǔn)),1997年修訂的標(biāo)準(zhǔn)(MPI-2),
已超過200多個,目前最常用的也有約30個
■可以只使用其中的6個最基本的函數(shù)就能編寫一個完整的MP工程
序去求解很多問題
26fenoi/o聯(lián)想
程序1、第一個FORTRAN77+MP工程序
programmain
includ一*mpif.h'
character*(MPI_MAX_PROCESSOR_NAME)
proc一ssor_nam一
int一g一rmyid,numprocs,nam一1一n,rc,i一rr
callMPI_INIT(ierr)
callMPI_COMM_RANK(MPI_COMM_WORLD,myidri一rr)
callMPI_COMM_SIZE(MPI_COMM_WORLD,numprocsAi一rr)
callMPI_GET_PROCESSOR_NAME(proc一ssor_nam一,
nam一1一n,i一rr)
writ一(*,10)myid,numprocs,proc一ssor_nam一
FORMAT(*HelloWorld!Process\12,*of',[1,*on
I20A)
callMPI_FINALIZE(rc)
end
27fenoi/o聯(lián)想
程序1在一臺機器上執(zhí)行的結(jié)果:
HelloWorld!Process1of4oncOlOl
HelloWorld!Process0of4oncOlOl
HelloWorld!Process2of4oncOlOl
HelloWorld!Process3of4oncOlOl
程序1在四臺機器上執(zhí)行的結(jié)果:
HelloWorld!Process3of4onc0104
HelloWorld!Process0of4oncOlOl
HelloWorld!Process2of4onc0103
HelloWorld!Process1of4onc0102
28fenoi/o聯(lián)想
,t?,HelloWorldM<I
MPI_F1NALIZEMPLFINAL1ZE
▼
“HelloWorld”秩序結(jié)束
程序2、簡單C+MP工的例子
#inclucl一、'mpi.h〃
main(intargc,char**argv)
(
intnumprocs,myrankfifj,k;
MPI_Statusstatus;
charmsg[20];
MP(&argc,Sargv);
MP1_Comm_siz一(MPH_COMM_WORLD,Snumprocs);
MPI_Comm_rank(MPI_COMM_WORLD,Smyrank);
30fenoi/o聯(lián)想
程序2、簡單C+MP工的例子
if(myrank==0)
(
strcpy(msg,,AHelloWorld");
MP工_S一nd(msg,strl一n(msg)+1,MPI_CHAR,
1,99,MPI_COMM_WORLD);
}
一Is一if(myrank==1)
{
MP工_R一cv(msg,20,MPI_CHAR,0,99,
MPI_COMM_WORLD,&status);
printf(、'R一c一iv一message=%s\n〃,msg);
}
MP工—Finalize();
31fenoi/o聯(lián)想
MP工程序的一般結(jié)構(gòu)
MP工程序結(jié)構(gòu)
■讀文件只用一個進(jìn)程來讀
■并行程序中關(guān)鍵的是if語句,決定每個進(jìn)程做什么
33fenoi/o聯(lián)想
頭文件
MP工程序要求:所有包含MP工調(diào)用的程序文件頭應(yīng)加入:
C包含文件Fortran包含文件
#include"mpi.h"Include"mpif.h5
34fenoi/o聯(lián)想
MP工函數(shù)一并行環(huán)境管理函數(shù)
■MPI_Init()
FORTRAN:MPI_INIT(IERR)
MPI_Init(*argcz*argv)
-MP工的初始化例行函數(shù),用于初始化MP工運行環(huán)境
-必須調(diào)用;首先調(diào)用;調(diào)用一次
MP工_Finaliz一()
FORTRAN:MPI_FINALIZED(IERR)
C:intMPI_Finalize(void)
-結(jié)束MP工執(zhí)行環(huán)境。該函數(shù)一旦被應(yīng)用程序調(diào)用時,就不
能調(diào)用MP工的其它例行函數(shù)(包括MP工」nit)
35后noi/o聯(lián)想
MP工函數(shù)一并行環(huán)境管理函數(shù)
■MPialized()
FORTRAN:MPI_INITIALIZED(flag,ierr)
C:intMPialized(intflag)
參數(shù)說明:
Outflag,如果MP工—工nit被調(diào)用,返回值為tru一,否貝Ll為flas一
-若程序中不確定是否已經(jīng)調(diào)用了MP工—工nit,可以使用
MPIJnitializ一d來檢查
-唯一的可以在調(diào)用MP工—工nit之前使用的函數(shù)
-唯一的可以在任何位置調(diào)用的函數(shù)
36fenoi/o聯(lián)想
MP工函數(shù)一進(jìn)程組操作函數(shù)
MPI_Comm_group()
FORTRAN:MPI_COMM_GROUP(COMM,GROUP,IERR)
INTEGER::COMM,GROUP,IERR
C:intMPI_Comm_group(MPI_commcomm,
MP工_Group*group)
參數(shù)說明:
INCOMM,通信因子
OUTGROUP,對應(yīng)COMM的進(jìn)程組
-用來建立一個通信因子對應(yīng)的新進(jìn)程組,之后就可以對此進(jìn)
程組進(jìn)行需要的操作。
37fenoi/o聯(lián)想
通信因子和組
-MP工通過指定通信因子和組來對進(jìn)程進(jìn)行一種邏輯上的劃分,通
訊因子定義了進(jìn)程組內(nèi)或組間通訊的上下文(具體就是指明通訊
鏈路的數(shù)據(jù)結(jié)構(gòu)指針)。
■MP工_COMM_WORLD通信因子是在MP工環(huán)境初始化過程中倉ll建
Process0Process1Process2Process3Process4
Process5Process6Process7Process8
MPI_COMM_WORLD
38fenoi/o聯(lián)想
MP工函數(shù)一進(jìn)程組操作函數(shù)
■MP工_Group_fr一一()
FORTRAN:MPI_GROUP_FREE(GROUP,IERR)
INTEGER::GROUP,IERR
C:intMPI_Group_free(MPI_Group*group)
參數(shù)說明:
工NOUTGROUP,釋放進(jìn)程組并返回MP工_GROUP_NULL
-MP工_Group_fr一一被調(diào)用后,任何關(guān)于此進(jìn)程組的操作
將被視為無效。
39fenoi/o聯(lián)想
MP工函數(shù)一進(jìn)程組操作函數(shù)
■MPI_Group_size()
FORTRAN:MPI_GROUP_SIZE(GROUP,SIZE,IERR)
INTEGER::GROUP,SIZE,IERR
C:intMPI_Group_size(MPI_Group*group,int*size)
參數(shù)說明:
INGROUP,進(jìn)程組
OUTSIZE,進(jìn)程組中的進(jìn)程個數(shù)
-如果進(jìn)程組MP工_GROUP_EMPTY,貝U返回值S工ZE為0。
40fenoi/o聯(lián)想
MP工函數(shù)一進(jìn)程組操作函數(shù)
■MPI_Group_rank()
FORTRAN:MPI_GROUP_RANK(GROUP,RANK,IERR)
INTEGER::GROUP,RANK,IERR
C:intMPI_Group_rank(MPI_Group*group,int*rank)
參數(shù)說明:
INGROUP,進(jìn)程組
OUTRANK,進(jìn)程在進(jìn)程組中的編號_________________
-如果進(jìn)程不是進(jìn)程組的成員,則返回值RANK為
MPIUNDEFINDEDo
41fenoi/o聯(lián)想
MP工函數(shù)一進(jìn)程組操作函數(shù)
■MP工Grouptranslaterank()_________________________
FORTRAN:MPI_GROUP_TRANSLATE_RANK(GROUP1ANARANKS1A
GROUP2,RANKS2AIERR)
INTEGER::GROUPl.N,RANKS1(*),GROUP2,RANKS2(*),工ERF
C:intMPI_Group_translate_rank(MPI_Group*group」
,intn,int*rankslrMPI_Group*group2,int*ranks2)
參數(shù)說明:
INGROUPlz進(jìn)程組1一
INN,RANKS1和RANKS2中數(shù)組元素個數(shù)
INRANKS1,進(jìn)程組1中有效編號組成的數(shù)組
INGROUP2z進(jìn)程組2一
OUTRANKS2,RANKS1中的元素在GROUP2中的對應(yīng)編號
-如果屬于進(jìn)程組1的某個進(jìn)程可以在RANKS1中找到,而這個進(jìn)
程不屬于進(jìn)程組2,則RANKS2中對應(yīng)RANKS1的位置返回值為
MPIUNDEFINDEDo
42fenoi/o聯(lián)想
MP工函數(shù)一進(jìn)程組操作函數(shù)
■MPI_Group_incl()
FORTRAN:MPI_GROUP_INCL(GROUP,RANKSzNEWGROUPAIERR)
INTEGER::GROUP,N,RANKS(*),NEWGROUP,IERR
C:intMPI_Group_incl(MPI_Group*group,intn,
int*rankszMPI_Group*newgroup)
參數(shù)說明:
INGROUP,進(jìn)程組
INN,RANKS中數(shù)組元素的個數(shù)和新進(jìn)程組的大小
INRANKS,將在新進(jìn)程組中出現(xiàn)的舊進(jìn)程組中的編號
OUTNEWGROUP由RANKS定義的順序?qū)С龅男逻M(jìn)程組
-構(gòu)造新的進(jìn)程組
43fenoi/o聯(lián)想
MP工函數(shù)一進(jìn)程組操作函數(shù)
■MPI_Group_excl()
FORTRAN:MPI_GROUP_EXCL(GROUP,RANKSzNEWGROUPAIERR)
INTEGER::GROUP,N,RANKS(*),NEWGROUP,工ERR
C:intMPI_Group_excl(MPI_Group*group,intn,
int*rankszMPI_Group*newgroup)
參數(shù)說明:
INGROUP,進(jìn)程組
INN,RANKS中數(shù)組元素的個數(shù)
INRANKS,在新進(jìn)程組中不出現(xiàn)的舊進(jìn)程組中的編號
OUTNEWGROUP舊進(jìn)程中不在RANKS里的元素組成的新進(jìn)程組
-構(gòu)造新的進(jìn)程組
44fenoi/o聯(lián)想
MP工函數(shù)一進(jìn)程組操作函數(shù)
MPI_Group_union()
FORTRAN:MPI_GROUP_UNION(GROUP1,GROUP2,NEWGROUP,IERR)
INTEGER::GROUP1AGROUP2ANEWGROUPrIERR
C:intMPI_Group_union(MPI_Group*groupl,
MP工_Group*group2,MPI_Group*newgroup)
參數(shù)說明:
INGROUPlz進(jìn)程組1
INGROUP2,進(jìn)程組2
OUTNEWGROUP,進(jìn)程組1和進(jìn)程組2的并
-構(gòu)造新的進(jìn)程組
45fenoi/o聯(lián)想
MP工函數(shù)一進(jìn)程組操作函數(shù)
MP工_Group_int一re一ction()
FORTRAN:MPI_GROUP_INTERSECTION(GROUP1,GROUP2,
NEWGROUP,IERR)
INTEGER::GROUP1AGROUP2ANEWGROUPzIERR
C:intMPI_Group_intersection(MPI_Group*groupl,
MP工_Group*group2,MPI_Group*nawgroup)
參數(shù)說明:
INGROUP1A進(jìn)程組1
INGROUP2,進(jìn)程組2
OUTNEWGROUP,進(jìn)程組1和進(jìn)程組2的交
-構(gòu)造新的進(jìn)程組
46fenoi/o聯(lián)想
MP工函數(shù)一進(jìn)程組操作函數(shù)
MP工_Group_diff一r一nc一()
FORTRAN:MPI_GROUP_DIFFERENCE(GROUP1,GROUP2,
NEWGROUP,IERR)
INTEGER::GROUP1AGROUP2ANEWGROUPzIERR
C:intMPI_Group_difference(MPI_Group*groupl,
MP工_Group*group2,MPI_Group*n一wgroup)
參數(shù)說明:
INGROUP1A進(jìn)程組1
INGROUP2,進(jìn)程組2
OUTNEWGROUP,進(jìn)程組1和進(jìn)程組2的差
-構(gòu)造新的進(jìn)程組
47fenoi/o聯(lián)想
MP工函數(shù)一通信子操作
■MP工_Comm_siz一()
FORTRAN:MPI_Comm_size(comm,sizezi一rr)
int一g一r::comm,siz一,i一rr
C:intMPI_Comm_size(MPI_commcomm,int*size)
參數(shù)說明:
INCOMM,通信因子
OUTSIZE,通信因子中的進(jìn)程個數(shù)
-該函數(shù)返回與該組通信因子相關(guān)的進(jìn)程數(shù)。
48fenoi/o聯(lián)想
MP工函數(shù)一通信子操作
MPI_Comm_rank()
FORTRAN:MPI_Comm_rank(comm,rank,ierr)
integer::comm,rank,ierr
C:intMPI_Comm_rank(MPI_commcomm,int*rank)
參數(shù)說明:
INCOMM,通信因子
OUTRANK,通信因子中的進(jìn)程編號
-該函數(shù)返回該進(jìn)程在指定通信因子中的進(jìn)程號(0?進(jìn)程數(shù)-1),
個進(jìn)程在不同通信因子中的進(jìn)程號可能不同。
49fenoi/o聯(lián)想
MP工函數(shù)一通信子操作
MPI_Comm_dup()
FORTRAN:MPI_COMM_DUP(COMM,NEWCOMM,IERR)
INTEGER::COMM,NEWCOMM,工ERR
C:intMPI_Comm_dup(MPI_commcomm,
MPI_comm*nawcomm)
參數(shù)說明:
INCOMM,通信因子
OUTNEWCOMM,COMM通信因子的復(fù)缶lj
-若復(fù)制的COMM被破壞,原COMM仍保存
50fenoi/o聯(lián)想
MP工函數(shù)一通信子操作
MPH_Comm_cr一at一()
FORTRAN:MPI_COMM_CREATE(COMM,GROUP,NEWCOMM,IERR)
INTEGER::COMM,GROUP,NEWCOMM,IERR
C:intMPI_Comm_create(MPI_commcommAMPI_Group
group,MPI_comm*nawcomm)
參數(shù)說明:
INCOMM,通信因子
INGROUP,通信因子COMM的一個子集
OUTNEWCOMM,對應(yīng)GROUP的新通信因子
51fenoi/o聯(lián)想
MP工函數(shù)一通信子操作
MPI_Comm_split()
FORTRAN:MPI_COMM_SPLIT(COMM,COLOR,KEY,NEWCOMM,IERR)
INTEGER::COMM,COLOR,KEY,NEWCOMM,工ERR
C:intMPI_Comm_split(MPI_commcomm,intcolor
intkeyAMPI_comm*n一wcomm)
參數(shù)說明:
INCOMM,通信因子
INCOLOR子集控制值
INGROUP,子集中進(jìn)程編號的順序
OUTNEWCOMM,由此產(chǎn)生的新通信因子
-這個函數(shù)劃分COMM所對應(yīng)的進(jìn)程組為不相交的字進(jìn)程組,每個進(jìn)程組
中包含COLOR相同的所有進(jìn)程
52fenoi/o聯(lián)想
MP工函數(shù)一通信子操作
MP工r一一()
FORTRAN:MPI_COMM_FREE(COMM,IERR)
INTEGER::COMM,IERR
C:intMPI_Comm_free(MPI_comm*comm)
參數(shù)說明:
INOUTCOMM,通信因子
53fenoi/o聯(lián)想
MP工函數(shù)一點到點通信函數(shù)
■MP工_S一nd()
FORTRAN:MPI_SEND(bufAcount,datatyp一,dast,tag,
comm,ierr)
〈typ一〉buf(*)
integer::count,i一rr,d一st,tag,comm
C:intMPI_Send(void*bufAintcountr
MP工_Datatyp一datatyp一,intd一st,
inttag,MPI_Commcomm)
-該函數(shù)將發(fā)送緩沖區(qū)中的count個datatyp一數(shù)據(jù)類型的數(shù)據(jù)
發(fā)送到目的進(jìn)程
54fenoi/o聯(lián)想
MP工函數(shù)一點到點通信函數(shù)
MP工_S一nd()
參數(shù)說明:
INBUF,所要發(fā)送消息數(shù)據(jù)的首地址
INCOUNT,發(fā)送消息數(shù)組元素的個數(shù)
INDATATYPE,發(fā)送消息的數(shù)據(jù)類型
INDEST,接收消息的進(jìn)程編號
INTAG,消息標(biāo)簽
INCOMM,通信因子
55fenoi/o聯(lián)想
MP工函數(shù)一點到點通信函數(shù)
MP工_R一cv()
FORTRAN:MPI_RECV(bufzcount,datatype,sourcer
tagzcomm,statuszierr)
<type>buf(*)
integer::countAierrAsourceAtagA
comm,status(MPI_STATUS_SIZE)
C:intMPI_Recv(void*buf,intcountr
MPI_Datatypedatatyp一,intsource,
inttagzMPI_CommcommAMPI_Status*status)
-該函數(shù)從指定的進(jìn)程sourc一接收消息,并且該消息的數(shù)據(jù)類型
和消息標(biāo)識和本接收進(jìn)程指定的數(shù)據(jù)類型和消息標(biāo)識相一致,
收到的消息所包含的數(shù)據(jù)元素的個數(shù)最多不能超過count.
56fenoi/o聯(lián)想
MP工函數(shù)一點到點通信函數(shù)
MP工_R一cv()
參數(shù)說明:
OUTBUF,接收消息數(shù)據(jù)的首地址
INCOUNT,接收消息數(shù)組元素的最大個數(shù)
INDATATYPE,接收消息的數(shù)據(jù)類型
INSOURCE,發(fā)送消息的進(jìn)程編號
INTAG,消息標(biāo)簽
INCOMM,通信因子
OUTSTATUS,接收消息時返回的狀態(tài)
-接收函數(shù)可以不指定SOURCE和TAG,而分別用
MP工_ANY_SOURCE和MP工_ANY_TAG來代替
57fenoi/o聯(lián)想
阻塞通信
-發(fā)送和接收是
成對出現(xiàn)的
■忽略這個原則
很可能會產(chǎn)生
死鎖
■通信和同步是
成對出現(xiàn)的
58fenoi/o聯(lián)想
參數(shù)說明
■緩沖區(qū)(buffer):指應(yīng)用程序定義地用于發(fā)送或接收數(shù)據(jù)的
消息緩沖區(qū)
■數(shù)據(jù)個數(shù)(count):指發(fā)送或接收指定數(shù)據(jù)類型的個數(shù)。
-數(shù)據(jù)類型的長度*數(shù)據(jù)個數(shù)的值為用戶實際傳遞的消息長度
■數(shù)據(jù)類型(type):MP工定義了一些缺省的數(shù)據(jù)類型,用戶也
可以根據(jù)需要建立自己的數(shù)據(jù)類型。
■目的地(dest):發(fā)送進(jìn)程指定的接收該消息的目的進(jìn)程,也
就是接收進(jìn)程的進(jìn)程號(注意組間通訊的情況)。
59fenoi/o聯(lián)想
參數(shù)說明
■源(source):接收進(jìn)程指定的發(fā)送該消息的源進(jìn)程,也就是
發(fā)送進(jìn)程的進(jìn)程號。如果該值為MPJANY_SOURCE表示接收任
意源進(jìn)程發(fā)來的消息
■標(biāo)識符(tag):由程序員指定地為標(biāo)識一個消息的唯一非負(fù)整
數(shù)值(0-32767),發(fā)送操作和接收操作的標(biāo)識符一定要匹配,
但對于接收操作來說,如果tag指定為MP工_ANY_TAG貝I」可與任
何發(fā)送操作的tag相匹配。
■通信因子(comm):包含源與目的進(jìn)程的一組上下文相關(guān)的進(jìn)
程集合,除非用戶自己定義(創(chuàng)建)了新的通信因子,否則一般
使用系統(tǒng)預(yù)先定義的全局通信因子MP工_COMM_WORLD
60fenoi/o聯(lián)想
參數(shù)說明
■狀態(tài)(status):對于接收操作,包含了接收消息的源進(jìn)程
(source)和消息的標(biāo)識符(tag)等。
■C:3個域FORTRAN:3個數(shù)組
^status.MPI_SOURCE^status(MPI_SOURCE)
^status.MPI_TAG^status(MPI_TAG)
/status,MP工_ERROR^status(MPI_ERROR)
61fenoi/o聯(lián)想
進(jìn)程號(rank)
■在一個通信因子中,每個進(jìn)程都有一個唯一的整數(shù)標(biāo)識符,稱作
''進(jìn)程工D〃,進(jìn)程號是從0開始的連續(xù)整數(shù)。
if(rank==0){
第。進(jìn)程運行的程序段
}一1s一if(rank==1){
第1進(jìn)程運行的程序段
62fenoi/o聯(lián)想
MP工消息
-MP工消息包括信封和數(shù)據(jù)兩個部分,信封指出了發(fā)送或接收消息
的對象及相關(guān)信息,而數(shù)據(jù)是本消息將要傳遞的內(nèi)容
■數(shù)據(jù):〈起始地址,數(shù)據(jù)個數(shù),數(shù)據(jù)類型〉
■信封:〈源/目,標(biāo)識,通信域〉
63fenoi/o聯(lián)想
MPI_Send(buf,count,datatype,dest,tag,comm)
消息數(shù)據(jù)消息信封
MPI_Recv(buf,count,datatype,source,tag,comm,status)
消息數(shù)據(jù)消息信封
64fenoi/o聯(lián)想
程序3、環(huán)形的消息傳遞
假設(shè)一共有P個進(jìn)程,在進(jìn)程編號為myid(myid=O,…,p-1)的
進(jìn)程中有一■個整數(shù)m,把m傳送到進(jìn)程(myid+1)modp中
65fenoi/o聯(lián)想
程序3、環(huán)形的消息傳遞
programring
include'mpif.h'
integermyid,pzmycomm,ierr,m,
&status(mpi_status_size),next,front,mod,n
callMPI_INIT(ierr)
callMPI_COMM_DUP(MPI_COMM_WORLD,mycomm,ierr)
callMPI_COMM_RANK(mycomm,myid,ierr)
callMPI_COMM_SIZE(mycomm,p,ierr)
m=myid
front=mod(p+myid-1,p)
n一xt=mod(myid+1,p)
66fenoi/o聯(lián)想
程序3、環(huán)形的消息傳遞
if(myid.eq.O)then
callMPI_RECV(n,1,MPI_INTEGER,front,1,mycomm,status,ierr)
callMPI_SEND(m,l,MPI_INTEGER,next,1,mycomm,ierr)
m=n
一Is一
callMPI_SEND(m,1,MPI_INTEGER,next,1,mycomm,ierr)
callMPI_RECV(n,1,MPI_INTEGER,front,1,mycomm,status,ierr)
endif
print*'Thevalueofmis',m,'onProcess\myid
callMPI_COMM_FREE(mycomm,ierr)
callMPIFINALIZED(ierr)
end
67fenoi/o聯(lián)想
MP工函數(shù)一點到點通信函數(shù)
■MPI_GET_COUNT
FORTRAN:MPI_GET_COUNT(statuszdatatyp一,count,ierr)
integer::status(MPI_STATUS_SIZE),
count,datatype,i一rr
C:intMPI_Get_count(MPI_Status*statusz
MPI_Datatypedatatype,int*count)
參數(shù)說明:
INSTATUS,接收消息時返回的狀態(tài)
INDATATYPE,接收消息的數(shù)據(jù)類型
OUTCOUNT,接收消息數(shù)組元素的個數(shù)
-MPI_GET_COUNT返回以指定的數(shù)據(jù)類型為單位,接收操作
接收到的數(shù)據(jù)的個數(shù),接收消息時使用的是最大個數(shù),該函
數(shù)能準(zhǔn)確知道接收消息的個數(shù)
68fenoi/o聯(lián)想
MP工函數(shù)一點到點通信函數(shù)
MP工_S一ndr一cv()
FORTRAN:MPI_SENDRECV(SENDBUFrSENDCOUNT,SENDTYPE,
DEST,SENDTAG,RECVBUF,RECVCOUNT,RECVTYPE,
SOURCE,RECVTAG,COMM,STATUS,IERR)
<type>SENDBUF(*),RECVBUF(*)
INTEGER::SENDCOUNT,SENDTYPE,DEST,SENDTAG,
RECVCOUNT,RECVTYPE,SOURCEARECVTAG,COMM,STATUS,IERR
C:intMPI_Sendrecv(void*s一ndbuf,intsendcountr
MP工_Datatyp一$一ndtyp一,intcl一st,int$一ndtag,
viod*recvbufAintrecvcount,
MPI_Datatyper一cvtyp一,intsource,intr一cvtag,
MP工_Commcomm,MP工_Status*status)
-這是發(fā)送和接收消息組合在一起的一個函數(shù),好處是不用考慮
先發(fā)送還是先接收消息,從而可以避免死鎖
69fenoi/o聯(lián)想
MP工函數(shù)一點到點通信函數(shù)
MP工_S一ndr一cv()
參數(shù)說明:
INSENDBUF,所要發(fā)送消息數(shù)據(jù)的首地址
INSENDCOUNT,發(fā)送消息數(shù)組兀素的個數(shù)
INSENDTYPE,發(fā)送消息的數(shù)據(jù)類型
INDEST,接收消息的進(jìn)程編號
INSENDTAG,發(fā)送消息標(biāo)簽
OUTRECVBUF,接收消息數(shù)據(jù)的首地址
INRECVCOUNT,接收消息數(shù)組兀素的最大個數(shù)
INRECVTYPE,接收消息的數(shù)據(jù)類型
INSOURCE,發(fā)送消息的進(jìn)程編號
INRECVTAG,接收消息標(biāo)簽
INCOMM,通信因子
OUTSTATUS,接收消息時返回的狀態(tài)
70fenoi/o聯(lián)想
MPJSendrecv示例
■原通信部分
callMPI_RECV(n,1,MPI_INTEGER,front,1,mycomm,status,ierr)
callMPI_SEND(m,1,MPI_INTEGER,next,1,mycomm,ierr)
m=n
■可用如下函數(shù)實現(xiàn)
callMPI_SENDRECV(m,l,MPIINTEGER,next,1,n,l,
MPIINTEGER,front,1,mycomm,status,ierr)
m=n
71fenoi/o聯(lián)想
MP工函數(shù)一點到點通信函數(shù)
MP工_S一ndr一cv_r一plac一()
FORTRAN:MPI_SENDRECV_REPLACE(BUF,COUNT,DATATYPEA
DEST,SENDTAG,SOURCEzRECVTAG,COMM,STATUS,IERR)
<type>BUF(*)
INTEGER::COUNT,DATATYPEADESTzSENDTAG,
SOURCE,RECVTAG,COMM,STATUS,IERR
C:intMPI_Sendrecv_replace(void*buf,intcount,
MP工_Datatyp一datatyp一,intcl一st,intsendtagz
intsource^intrecvtag,MPI_Commcomm,
MPI_Status*status)
-發(fā)送和接收使用同一個消息緩沖區(qū),但是沒有MP工_S一ndr一cv
效率高
72fenoi/o聯(lián)想
MP工函數(shù)一點到點通信函數(shù)
MP工_S一ndr一cv_r一plac一()
參數(shù)說明:
OUTBUF,發(fā)送和接收消息數(shù)據(jù)的首地址
INCOUNT,發(fā)送和接收消息數(shù)組元素的個數(shù)
INDATATYPE,發(fā)送和接收消息的數(shù)據(jù)類型
INDEST,接收消息的進(jìn)程編號
INSENDTAG,發(fā)送消息標(biāo)簽
INSOURCE,發(fā)送消息的進(jìn)程編號
INRECVTAG,接收消息標(biāo)簽
INCOMM,通信因子
OUTSTATUS,接收消息時返回的狀態(tài)
-在進(jìn)行環(huán)形通信時,使用MP工_Sendr一cv_r一plac一非常方便
73fenoi/o聯(lián)想
MPI_Sendrecv_replace^^!|
:原通信部分
callMPIRECV(n,1,MPI_INTEGER,front,1,mycomm,status,ierr)
callMPI_SEND(m,l,MPI_INTEGER,next,1,mycomm,ierr)
m=n
■可用如下函數(shù)來實現(xiàn)
callMPI_SENDRECV_REPLACE(m,1,MPI_INTEGER,next,1,
front,1,mycomm,status,ierr)
74fenoi/o聯(lián)想
MP工函數(shù)一點到點通信函數(shù)
■另外,MP工還定義了一個空進(jìn)程MP工_PROC_NULL,如果通信采用這
個進(jìn)程將不起任何作用
if(myid.eq.O)front=MPIPROCKNULL
if(myid.eq.p-l)next=MPIPROCKNULL
callMPI_SENDRECV_REPLACE(m,1,MPI_INTEGER,next,1,
front,1,mycomm,status,ierr)
75fenoi/o聯(lián)想
MP工函數(shù)一點到點通信函數(shù)
MP工_Prob一()
FORTRAN:MPI_PROBE(SOURCE,TAGzCOMM,STATUS,IERR)
INTEGER::SOURCE,TAG,COMM,STATUS,工ERR
C:intMPI_Probe(intsource,inttag,
MPI_Commcomm^MPI_Status*status)
參數(shù)說明:
INSOURCE,發(fā)送消息的進(jìn)程編號
INTAG,接收消息標(biāo)簽
INCOMM,通信因子
OUTSTATUS,返回到達(dá)消息的狀態(tài)
-檢查要接收的消息是否到達(dá)
-消息到達(dá)了才能返回
76fenoi/o聯(lián)想
程序4、n的計算
I1/1、兀
dx二arctan(x)|;=arctan(l)-arctan(O)=arctan(l)=—
1+x2
4
令函數(shù)f(x)=4/(l+x2)
則有jf(x)dx=71
(
,
+
L
)2+■
a.o
2x/-11W
71Zf(x——H
x
Z=12xNN)
]i-0.5
xu.
Ni=\N
1
o.X:0
程序4、兀的計算—send(recv)
#include、'mpi.h〃
#include<stdio.h>
#include<math.h>
doublef(doublex);/*定義函數(shù)f(x)*/
{
return(4.0/(1.0+x*x));
}
intmain(intargc,char*argv[])
{
intdon一=0,n,myid,numprocs,i;
doublePI25DT=3.141592653589793238462643;
doublemypi,pi,h,sum,x;
doubl一startwtim一=0.0,一ndwtim一;
intnam一1一n;
charprocessor_name[MPI_MAX_PROCESSOR_NAME];
MP工_Statusstatus;
78fenoi/o聯(lián)想
MPI_Init(&argc,Sargv);
MP1_Comm_siz一(MP1_C0MM_W0RLD,&numprocs);
MPI_Comm_rank(M
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 游戲異常處理與故障排查考核試卷
- 民間非營利組織新舊會計制度有關(guān)銜接問題的處理規(guī)定2025
- 3.20國際幸福日幸福其實并不遙遠(yuǎn)幸福可以很簡單課件
- 四川省內(nèi)江市東興區(qū)2025屆小升初常考易錯數(shù)學(xué)檢測卷含解析
- 湘潭理工學(xué)院《新媒體產(chǎn)品設(shè)計與項目管理》2023-2024學(xué)年第二學(xué)期期末試卷
- 雅安市重點中學(xué)2024-2025學(xué)年初三5月聯(lián)合調(diào)研數(shù)學(xué)試題試卷含解析
- 江西省2024-2025學(xué)年高三1月物理試題含解析
- 遼寧特殊教育師范高等專科學(xué)校《心理咨詢技術(shù)與實務(wù)》2023-2024學(xué)年第二學(xué)期期末試卷
- 臺州科技職業(yè)學(xué)院《管理會計應(yīng)用指引》2023-2024學(xué)年第二學(xué)期期末試卷
- 西安航空職業(yè)技術(shù)學(xué)院《生物多樣性》2023-2024學(xué)年第二學(xué)期期末試卷
- 電工電子技術(shù)及應(yīng)用全套課件
- 護(hù)理管理學(xué)練習(xí)題題庫
- DB33T 1233-2021 基坑工程地下連續(xù)墻技術(shù)規(guī)程
- 8.生發(fā)項目ppt課件(66頁PPT)
- 手榴彈使用教案
- 《新農(nóng)技推廣法解讀》ppt課件
- 車載式輪椅升降裝置的結(jié)構(gòu)設(shè)計-畢業(yè)設(shè)計說明書
- 社區(qū)家庭病床護(hù)理記錄文本匯總
- 劍橋BEC中級真題第四輯TEST1
- 畢業(yè)設(shè)計(論文)-CK6150總體及縱向進(jìn)給和尾座部件的設(shè)計
- 施工項目人員任命書(范本)
評論
0/150
提交評論