聯(lián)想高性能服務(wù)器事業(yè)部 - 中科院化學(xué)所理論與計算化學(xué)平臺_第1頁
聯(lián)想高性能服務(wù)器事業(yè)部 - 中科院化學(xué)所理論與計算化學(xué)平臺_第2頁
聯(lián)想高性能服務(wù)器事業(yè)部 - 中科院化學(xué)所理論與計算化學(xué)平臺_第3頁
聯(lián)想高性能服務(wù)器事業(yè)部 - 中科院化學(xué)所理論與計算化學(xué)平臺_第4頁
聯(lián)想高性能服務(wù)器事業(yè)部 - 中科院化學(xué)所理論與計算化學(xué)平臺_第5頁
已閱讀5頁,還剩229頁未讀 繼續(xù)免費閱讀

下載本文檔

版權(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論