MPI并行程序設(shè)計(jì)自學(xué)教程.ppt_第1頁(yè)
MPI并行程序設(shè)計(jì)自學(xué)教程.ppt_第2頁(yè)
MPI并行程序設(shè)計(jì)自學(xué)教程.ppt_第3頁(yè)
MPI并行程序設(shè)計(jì)自學(xué)教程.ppt_第4頁(yè)
MPI并行程序設(shè)計(jì)自學(xué)教程.ppt_第5頁(yè)
免費(fèi)預(yù)覽已結(jié)束,剩余47頁(yè)可下載查看

下載本文檔

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

文檔簡(jiǎn)介

1、2020年9月,1/55,并行程序設(shè)計(jì)簡(jiǎn)介,曙光信息產(chǎn)業(yè)(北京)有限公司,2020年9月,2/55,講座內(nèi)容提示,基本概念 基本的MPI 點(diǎn)到點(diǎn)通信(Point to point) MPI中API的主要內(nèi)容,為MPI最基本,最重要的內(nèi)容 MPI程序的編譯和運(yùn)行 實(shí)例,2020年9月,3/55,參考文獻(xiàn),MPI-the complete reference. Marc Snir, MIT Press, 1998. ISBN 0262692155, 0262692163. Using MPI : portable parallel programming with the message-pass

2、ing interface, William Gropp, MIT Press, 1999. 2nd edition. ISBN 0262571323. Using MPI-2 : advanced features of the message-passing interface. William Gropp, MIT Press, 1999. ISBN 0262571331. 高性能計(jì)算并行編程技術(shù)-MPI并行程序設(shè)計(jì),都志輝,清華大學(xué)出版社, 2001年8月。,2020年9月,4/55,多線程庫(kù)標(biāo)準(zhǔn) Win32 API. POSIX threads. 編譯制導(dǎo)標(biāo)準(zhǔn) OpenMP 可移植共

3、享存儲(chǔ)并行編程標(biāo)準(zhǔn). 消息傳遞庫(kù)標(biāo)準(zhǔn) MPI PVM,并行編程標(biāo)準(zhǔn),本討論的重點(diǎn),2020年9月,5/55,消息傳遞并行程序設(shè)計(jì),消息傳遞并行程序設(shè)計(jì) 指用戶(hù)必須通過(guò)顯式地發(fā)送和接收消息來(lái)實(shí)現(xiàn)處理機(jī)間的數(shù)據(jù)交換。 在這種并行編程中,每個(gè)并行進(jìn)程均有自己獨(dú)立的地址空間,相互之間訪問(wèn)不能直接進(jìn)行,必須通過(guò)顯式的消息傳遞來(lái)實(shí)現(xiàn)。 這種編程方式是大規(guī)模并行處理機(jī)(MPP)和機(jī)群(Cluster)采用的主要編程方式。 并行計(jì)算粒度大,特別適合于大規(guī)??蓴U(kuò)展并行算法 由于消息傳遞程序設(shè)計(jì)要求用戶(hù)很好地分解問(wèn)題,組織不同進(jìn)程間的數(shù)據(jù)交換,并行計(jì)算粒度大,特別適合于大規(guī)??蓴U(kuò)展并行算法. 消息傳遞是當(dāng)前并行計(jì)

4、算領(lǐng)域的一個(gè)非常重要的并行程序設(shè)計(jì)方式,2020年9月,6/55,什么是MPI?,Massage Passing Interface:是消息傳遞函數(shù)庫(kù)的標(biāo)準(zhǔn)規(guī)范,由MPI論壇開(kāi)發(fā),支持Fortran和C 一種新的庫(kù)描述,不是一種語(yǔ)言。共有上百個(gè)函數(shù)調(diào)用接口,在Fortran和C語(yǔ)言中可以直接對(duì)這些函數(shù)進(jìn)行調(diào)用 MPI是一種標(biāo)準(zhǔn)或規(guī)范的代表,而不是特指某一個(gè)對(duì)它的具體實(shí)現(xiàn) MPI是一種消息傳遞編程模型,并成為這種編程模型的代表和事實(shí)上的標(biāo)準(zhǔn),2020年9月,7/55,MPI的發(fā)展過(guò)程,發(fā)展的兩個(gè)階段 MPI 1.1: 1995 MPICH:是MPI最流行的非專(zhuān)利實(shí)現(xiàn),由Argonne國(guó)家實(shí)驗(yàn)室和

5、密西西比州立大學(xué)聯(lián)合開(kāi)發(fā),具有更好的可移植性. MPI 1.22.0:動(dòng)態(tài)進(jìn)程, 并行 I/O, 遠(yuǎn)程存儲(chǔ)訪問(wèn)、支持F90和C+(1997).,2020年9月,8/55,為什么要用MPI?,高可移植性 MPI已在IBM PC機(jī)上、MS Windows上、所有主要的Unix工作站上和所有主流的并行機(jī)上得到實(shí)現(xiàn)。使用MPI作消息傳遞的C或Fortran并行程序可不加改變地運(yùn)行在IBM PC、MS Windows、Unix工作站、以及各種并行機(jī)上。,2020年9月,9/55,:從簡(jiǎn)單入手Init和Finalize,下面我們首先分別以C語(yǔ)言和Fortran語(yǔ)言的形式給出一個(gè)最簡(jiǎn)單的MPI并行程序Hel

6、lo (下頁(yè)). 該程序在終端打印出Hello World!字樣. “Hello World”:一聲來(lái)自新生兒的問(wèn)候.,2020年9月,10/55,Hello world(C),#include #include mpi.h“ main( int argc, char *argv ) MPI_Init( ,2020年9月,11/55,Hello world(Fortran),program main include mpif.h integer ierr call MPI_INIT( ierr ) print *, Hello, world! call MPI_FINALIZE( ierr )

7、 end,2020年9月,12/55,C和Fortran中MPI函數(shù)約定,C 必須包含mpi.h. MPI 函數(shù)返回出錯(cuò)代碼或 MPI_SUCCESS成功標(biāo)志. MPI-前綴,且只有MPI以及MPI_標(biāo)志后的第一個(gè)字母大寫(xiě),其余小寫(xiě). Fortran 必須包含mpif.h. 通過(guò)子函數(shù)形式調(diào)用MPI,函數(shù)最后一個(gè)參數(shù)為返回值. MPI-前綴,且函數(shù)名全部為大寫(xiě). MPI函數(shù)的參數(shù)被標(biāo)志為以下三種類(lèi)型: IN:參數(shù)在例程的調(diào)用中不會(huì)被修正. OUT:參數(shù)在例程的調(diào)用中可能會(huì)被修正. INOUT:參數(shù)有初始值,且在例程的調(diào)用中可能會(huì)被修正,2020年9月,13/55,MPI初始化-MPI_INIT

8、,int MPI_Init(int *argc, char *argv) MPI_INIT(IERROR) MPI_INIT是MPI程序的第一個(gè)調(diào)用,它完成MPI程序的所有初始化工作。所有的MPI程序的第一條可執(zhí)行語(yǔ)句都是這條語(yǔ)句。 啟動(dòng)MPI環(huán)境,標(biāo)志并行代碼的開(kāi)始. 并行代碼之前,第一個(gè)mpi函數(shù)(除MPI_Initialized()外). 要求main必須帶參數(shù)運(yùn)行,否則出錯(cuò).,2020年9月,14/55,MPI結(jié)束-MPI_FINALIZE,int MPI_Finalize(void) MPI_FINALIZE(IERROR) MPI_FINALIZE是MPI程序的最后一個(gè)調(diào)用,它結(jié)束

9、MPI程序的運(yùn)行,它是MPI程序的最后一條可執(zhí)行語(yǔ)句,否則程序的運(yùn)行結(jié)果是不可預(yù)知的。 標(biāo)志并行代碼的結(jié)束,結(jié)束除主進(jìn)程外其它進(jìn)程. 之后串行代碼仍可在主進(jìn)程(rank = 0)上運(yùn)行(如果必須).,2020年9月,15/55,MPI程序的的編譯與運(yùn)行,mpif77 hello.f 或 mpicc hello.c 默認(rèn)生成a.out的可執(zhí)行代碼. mpif77 o hello hello.f 或 mpicc o hello hello.c 生成hello的可執(zhí)行代碼. mpirun np 4 a.out mpirun np 4 hello 4 指定np的實(shí)參,表示進(jìn)程數(shù),由用戶(hù)指定. a.ou

10、t / hello 要運(yùn)行的MPI并行程序.,%小寫(xiě)o,np: The number of process.,2020年9月,16/55,:運(yùn)行我們的MPI程序!,dairnode01 $ mpicc -o hello hello.c dairnode01 $ ./hello () 0 Aborting program ! Could not create p4 procgroup. Possible missing fileor program started without mpirun. dairnode01 $ mpirun -np 4 hello () Hello World! He

11、llo World! Hello World! Hello World! dairnode01 $,計(jì)算機(jī)打印字符,我們輸入的命令,2020年9月,17/55,:Hello是如何被執(zhí)行的?,SPMD: Single Program Multiple Data(SIMD) :,#include mpi.h #include main( int argc, char *argv ) MPI_Init( ,#include mpi.h #include main( int argc, char *argv ) MPI_Init( ,#include mpi.h #include main( int

12、argc, char *argv ) MPI_Init( ,#include mpi.h #include main( int argc, char *argv ) MPI_Init( ,Hello World! Hello World! Hello World! Hello World!,#include mpi.h #include main( int argc, char *argv ) MPI_Init( ,rshssh,2020年9月,18/55,:開(kāi)始寫(xiě)MPI并行程序 Comm_size和Comm_rank,在寫(xiě)MPI程序時(shí),我們常需要知道以下兩個(gè)問(wèn)題的答案: 任務(wù)由多少個(gè)進(jìn)程來(lái)進(jìn)

13、行并行計(jì)算? 我是哪一個(gè)進(jìn)程?,2020年9月,19/55,MPI 提供了下列函數(shù)來(lái)回答這些問(wèn)題: 用MPI_Comm_size 獲得進(jìn)程個(gè)數(shù) p int MPI_Comm_size(MPI_Comm comm, int *size); 用MPI_Comm_rank 獲得進(jìn)程的一個(gè)叫rank的值,該 rank值為0到p-1間的整數(shù),相當(dāng)于進(jìn)程的ID int MPI_Comm_rank(MPI_Comm comm, int *rank);,2020年9月,20/55,更新的Hello World(c),#include #include mpi.h main( int argc, char *a

14、rgv ) int myid, numprocs; MPI_Init( ,2020年9月,21/55,更新的Hello World(F77),program main include mpif.h integer ierr, myid, numprocs call MPI_INIT( ierr ) call MPI_COMM_RANK( MPI_COMM_WORLD, myid, ierr ) call MPI_COMM_SIZE( MPI_COMM_WORLD, numprocs, ierr ) print *, I am, myid, of, numprocs call MPI_FINAL

15、IZE( ierr ) end,2020年9月,22/55,:運(yùn)行結(jié)果,dairnode01 $ mpicc o hello1 hello1.c dairnode01 $ mpirun -np 4 hello1 I am 0 of 4 I am 1 of 4 I am 2 of 4 I am 3 of 4 dairnode01 $,計(jì)算機(jī)打印字符,我們輸入的命令,2020年9月,23/55,:寫(xiě)MPI并行通信程序-Send和Recv,Greeting執(zhí)行過(guò)程,2020年9月,24/55,有消息傳遞greetings(c),#include #include mpi.h main(int arg

16、c, char* argv) int numprocs, myid, source; MPI_Status status; char message100; MPI_Init(,2020年9月,25/55,有消息傳遞greetings(c),if (myid != 0) strcpy(message, Hello World!); MPI_Send(message,strlen(message)+1, MPI_CHAR, 0,99, MPI_COMM_WORLD); else /* myid = 0 */ for (source = 1; source numprocs; source+) M

17、PI_Recv(message, 100, MPI_CHAR, source, 99, MPI_COMM_WORLD, /* end main */,2020年9月,26/55,解剖greetings程序,頭文件: mpi.h/mpif.h. int MPI_Init(int *argc, char *argv) 啟動(dòng)MPI環(huán)境,標(biāo)志并行代碼的開(kāi)始. 并行代碼之前,第一個(gè)mpi函數(shù)(除MPI_Initialize()外). 要求main必須帶參數(shù)運(yùn)行,否則出錯(cuò). 通信域(通信空間): MPI_COMM_WORLD: 一個(gè)通信空間是一個(gè)進(jìn)程組和一個(gè)上下文的組合.上下文可看作為組的超級(jí)標(biāo)簽,用于區(qū)

18、分不同的通信域. 在執(zhí)行函數(shù)MPI_Init之后,一個(gè)MPI程序的所有進(jìn)程形成一個(gè)缺省的組,這個(gè)組的通信域即被寫(xiě)作MPI_COMM_WORLD. 該參數(shù)是MPI通信操作函數(shù)中必不可少的參數(shù),用于限定參加通信的進(jìn)程的范圍.,2020年9月,27/55,解剖greetings程序,int MPI_Comm_size ( MPI_Comm comm, int *size ) 獲得通信空間comm中規(guī)定的組包含的進(jìn)程的數(shù)量. 指定一個(gè)communicator,也指定了一組共享該空間的進(jìn)程, 這些進(jìn)程組成該communicator的group. int MPI_Comm_rank ( MPI_Comm

19、comm, int *rank ) 得到本進(jìn)程在通信空間中的rank值,即在組中的邏輯編號(hào)(從0開(kāi)始). int MPI_Finalize() 標(biāo)志并行代碼的結(jié)束,結(jié)束除主進(jìn)程外其它進(jìn)程. 之后串行代碼仍可在主進(jìn)程(rank = 0)上運(yùn)行(如果必須).,2020年9月,28/55,講座內(nèi)容提示,基本的MPI 基本概念 點(diǎn)到點(diǎn)通信(Point to point) MPI中API的主要內(nèi)容,為MPI最基本,最重要的內(nèi)容 MPI程序的編譯和運(yùn)行 深入MPI 用戶(hù)自定義(/派生)數(shù)據(jù)類(lèi)型(User-defined(Derived) data type) 事實(shí)上MPI的所有數(shù)據(jù)類(lèi)型均為MPI自定義類(lèi)型

20、 支持異構(gòu)系統(tǒng) 允許消息來(lái)自不連續(xù)的或類(lèi)型不一致的存儲(chǔ)區(qū)(結(jié)構(gòu),數(shù)組散元) 集合通信(Collective) 數(shù)據(jù)移動(dòng),數(shù)據(jù)聚集,同步 基于point to point 構(gòu)建 MPI環(huán)境管理函數(shù) 組,上下文和通信空間/通信域的管理 實(shí)例,2020年9月,29/55,Point to Point通信,單個(gè)進(jìn)程對(duì)單個(gè)進(jìn)程的通信,重要且復(fù)雜 術(shù)語(yǔ) Blocking(阻塞) :一個(gè)例程須等待操作完成才返回,返回后用戶(hù)可以重新使用調(diào)用中所占用的資源. Non-blocking(非阻塞):一個(gè)例程不必等待操作完成便可返回,但這并不意味著所占用的資源可被重用. Local(本地):過(guò)程的完成僅依賴(lài)于本地正在

21、執(zhí)行的進(jìn)程。 Non-local(非本地):如果過(guò)程的完成要求其他進(jìn)程的 MPI 過(guò)程完成。,2020年9月,30/55,Blocking Send,int MPI_Send(void* buf, int count, MPI_Datatype datatype, int dest, int tag, MPI_Comm comm); IN buf 發(fā)送緩沖區(qū)的起始地址 IN count 要發(fā)送信息的元素個(gè)數(shù) IN datatype 發(fā)送信息的數(shù)據(jù)類(lèi)型 IN dest 目標(biāo)進(jìn)程的rank值 IN tag 消息標(biāo)簽 IN comm 通信域,2020年9月,31/55,Blocking Receiv

22、e,int MPI_Recv(void* buf, int count, MPI_Datatype datatype, int source, int tag, MPI_Comm comm, MPI_Status *status); OUT buf 發(fā)送緩沖區(qū)的起始地址 IN count 要發(fā)送信息的元素個(gè)數(shù) IN datatype 發(fā)送信息的數(shù)據(jù)類(lèi)型 IN dest 目標(biāo)進(jìn)程的rank值 IN tag 消息標(biāo)簽 IN comm 通信域 OUT statusstatus對(duì)象,包含實(shí)際接收到的消息的有關(guān)信息,2020年9月,32/55,MPI消息,MPI消息包括信封和數(shù)據(jù)兩個(gè)部分,信封指出了發(fā)送

23、或接收消息的對(duì)象及相關(guān)信息,而數(shù)據(jù)是本消息將要傳遞的內(nèi)容 數(shù)據(jù): 信封:,2020年9月,33/55,2020年9月,34/55,消息數(shù)據(jù),由count個(gè)類(lèi)型為datatype的連續(xù)數(shù)據(jù)空間組成, 起始地址為buf 不是以字節(jié)數(shù), 而是以元素的個(gè)數(shù)指定消息的長(zhǎng)度 count可以是零, 這種情況下消息的數(shù)據(jù)部分是空的 MPI基本數(shù)據(jù)類(lèi)型相應(yīng)于宿主語(yǔ)言的基本數(shù)據(jù)類(lèi)型,2020年9月,35/55,MPI基本數(shù)據(jù)類(lèi)型,2020年9月,36/55,MPI標(biāo)識(shí)一條消息的信息包含四個(gè)域: Source: 發(fā)送進(jìn)程隱式確定,由進(jìn)程的rank值唯一標(biāo)識(shí) Destination: Send函數(shù)參數(shù)確定 Tag:

24、Send函數(shù)參數(shù)確定,用于識(shí)別不同的消息 (0,UB),UB:MPI_TAG_UB=32767. Communicator: 缺省MPI_COMM_WORLD Group:有限/N,有序/Rank 0,1,2,N-1 Contex:Super_tag,用于標(biāo)識(shí)該通訊空間.,消息信封,2020年9月,37/55,status參數(shù),當(dāng)使用MPI_ANY_SOURCE或/和MPI_ANY_TAG接收消息時(shí)如何確定消息的來(lái)源source 和 tag值呢? 在C中,結(jié)構(gòu),status.MPI_SOURCE, status.MPI_TAG. 在Fortran中,數(shù)組,source=status(MPI_S

25、OURCE), tag=status(MPI_TAG). Status還可用于返回實(shí)際接收到消息的長(zhǎng)度 int MPI_Get_count(MPI_Status status, MPI_Datatype datatype,int* count) IN status 接收操作的返回值. IN datatype 接收緩沖區(qū)中元素的數(shù)據(jù)類(lèi)型. OUT count 接收消息中的元素個(gè)數(shù).,2020年9月,38/55,消息匹配,接收buffer必須至少可以容納count個(gè)由datatype參數(shù)指明類(lèi)型的數(shù)據(jù). 如果接收buf太小, 將導(dǎo)致溢出、出錯(cuò). 消息匹配 參數(shù)匹配 dest,tag,comm/ s

26、ource,tag,comm Source = MPI_ANY_SOURCE:接收任意處理器來(lái)的數(shù)據(jù)(任意消息來(lái)源). Tag = MPI_ANY_TAG:匹配任意tag值的消息(任意tag消息). Source = destination 是允許的, 但是不安全的, 可能導(dǎo)致死鎖。 消息傳送被限制在同一個(gè)communicator. 在send函數(shù)中必須指定唯一的接收者(Push/pull通訊機(jī)制).,2020年9月,39/55,分析greetings,#include #include mpi.h“ main(int argc, char* argv) int numprocs; /*進(jìn)程數(shù)

27、,該變量為各處理器中的同名變量, 存儲(chǔ)是分布的*/ int myid;/*我的進(jìn)程ID,存儲(chǔ)也是分布的*/ MPI_Status status; /*消息接收狀態(tài)變量,存儲(chǔ)也是分布的*/ char message100;/*消息buffer,存儲(chǔ)也是分布的*/ /*初始化MPI*/ MPI_Init(,2020年9月,40/55,分析greetings,if (myid != 0) /*建立消息*/ sprintf(message, Greetings from process %d!,myid); /* 發(fā)送長(zhǎng)度取strlen(message)+1,使0也一同發(fā)送出去*/ MPI_Send(

28、message,strlen(message)+1, MPI_CHAR, 0,99,MPI_COMM_WORLD); else /* my_rank = 0 */ for (source = 1; source numprocs; source+) MPI_Recv(message, 100, MPI_CHAR, source, 99, MPI_COMM_WORLD, /* End main */,2020年9月,41/55,Greetings執(zhí)行過(guò)程,假設(shè)進(jìn)程數(shù)為3 (進(jìn)程0) (進(jìn)程1) (進(jìn)程2) (rank=0) (rank=1) (rank=2),. . Recv(); . . Re

29、cv(); . .,. . . Send(); . . .,. . . Send() . . .,問(wèn)題:進(jìn)程1和2誰(shuí)先開(kāi)始發(fā)送消息?誰(shuí)先完成發(fā)送?,?,%,2020年9月,42/55,運(yùn)行g(shù)reetings,dairnode01 $ mpicc o greeting greeting.c dairnode01 $ mpirun -np 4 greeting Greetings from process 1! Greetings from process 2! Greetings from process 3! dairnode01 $,計(jì)算機(jī)打印字符,我們輸入的命令,2020年9月,43/55,最基本的MPI,MPI調(diào)用借口的總數(shù)雖然龐大,但根據(jù)實(shí)際編寫(xiě)MPI的經(jīng)驗(yàn),常用的MPI調(diào)用的個(gè)數(shù)非常有限。上面介紹的是6個(gè)最基本的MPI函數(shù)。 MPI_Init(); MPI_Comm_size(); MPI_Comm_rank(); MPI_Send(); MPI_Recv(); MPI_Finalize();,MPI_Init(); 并行代碼; MPI_Fainalize(); 只能有串行代碼;,2020年9月,44/55,現(xiàn)在您已經(jīng)能夠用MPI進(jìn)行并行編程了!,2020年9月,45/55,實(shí)例分析:求PI,2020年9月,46/55,串行代碼,h=1.0/(double)n; sum

溫馨提示

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

最新文檔

評(píng)論

0/150

提交評(píng)論