中科曙光HPC培訓(xùn)教程匯總:D30-并行編程—MPI程序設(shè)計(jì)_第1頁(yè)
中科曙光HPC培訓(xùn)教程匯總:D30-并行編程—MPI程序設(shè)計(jì)_第2頁(yè)
中科曙光HPC培訓(xùn)教程匯總:D30-并行編程—MPI程序設(shè)計(jì)_第3頁(yè)
中科曙光HPC培訓(xùn)教程匯總:D30-并行編程—MPI程序設(shè)計(jì)_第4頁(yè)
中科曙光HPC培訓(xùn)教程匯總:D30-并行編程—MPI程序設(shè)計(jì)_第5頁(yè)
已閱讀5頁(yè),還剩70頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、MPI并行程序設(shè)計(jì)(C版,曙光信息產(chǎn)業(yè)(北京)有限公司 高性能產(chǎn)品事業(yè)部,對(duì)本文檔的任何使用都被視為完全理解并接受本文檔列舉的所有法律條款。 本文檔的所有權(quán)利歸作者所有,作者保留所有權(quán)利。 未經(jīng)作者書(shū)面同意,禁止任何形式的商業(yè)使用。商業(yè)使用形式包括但不限于出版、復(fù)制、傳播、展示、引用、編輯。 本文檔允許以學(xué)術(shù)研究、技術(shù)交流為目的使用。復(fù)制、傳播過(guò)程中不得對(duì)本文檔作任何增減編輯,引用時(shí)需注明出處。 實(shí)施任何侵權(quán)行為的法人或自然人都必須向作者支付賠償金,賠償金計(jì)算方法為: 賠償金 = 涉案人次涉案時(shí)長(zhǎng)(天)涉案文檔份數(shù)受眾人次100元人民幣,涉案人次、涉案時(shí)長(zhǎng)、涉案文檔份數(shù)、受眾人次小于1時(shí),按1

2、計(jì)算。 對(duì)舉報(bào)侵權(quán)行為、提供有價(jià)值證據(jù)的自然人或法人,作者承諾獎(jiǎng)勵(lì)案件實(shí)際賠償金的50%. 涉及本文檔的法律糾紛由作者所在地法院裁決。 本文檔所列舉法律條款的最終解釋權(quán)歸作者所有,法律條款,目錄,并行計(jì)算定義 并行計(jì)算是指,在并行機(jī)上,將一個(gè)應(yīng)用分解成多個(gè)子任務(wù),分配給不同的處理器,各個(gè)處理器之間相互協(xié)同,并行的執(zhí)行子任務(wù),從而達(dá)到加速求解速度的目的。 并行計(jì)算條件 開(kāi)展并行計(jì)算必須具備三個(gè)基本條件: 1、并行機(jī)(硬件) 2、應(yīng)用問(wèn)題必須具有并行度(應(yīng)用) 3、并行程序(軟件,并行計(jì)算簡(jiǎn)介,并行層次,CPU單核并行 指令級(jí)并行 SIMD、超線程 多核并行 共享內(nèi)存OpenMP,加速器 nVid

3、ia GPU AMD GPU Intel Xeon Phi 專為并行計(jì)算設(shè)計(jì),超級(jí)計(jì)算機(jī) 多節(jié)點(diǎn)、異構(gòu) 成千上萬(wàn)核心 成熟的并行技術(shù),并行計(jì)算系統(tǒng)-分類 MPP SMP Cluster CPU和GPU的混合系統(tǒng) 星群系統(tǒng),并行計(jì)算簡(jiǎn)介,并行計(jì)算簡(jiǎn)介,并行計(jì)算簡(jiǎn)介,并行計(jì)算簡(jiǎn)介,并行計(jì)算簡(jiǎn)介,并行計(jì)算簡(jiǎn)介,目錄,MPI簡(jiǎn)介-什么是MPI: MPI(Message-Passing Interface)是一種標(biāo)準(zhǔn),最初是1991年在奧地利的學(xué)術(shù)和工業(yè)界的一些研究人員一塊商議制定的。 標(biāo)準(zhǔn)的實(shí)現(xiàn): MPICH argonne natiaonal laboratory and Mississippi S

4、tate University LAM/MPI Ohio Supercomputer Center Openmpi LAM/MPI和其他一些早期MPI產(chǎn)品的整合 Mvapich MPI over infiniband Ohio Supercomputer Center 其他MPI產(chǎn)品 HP、Intel和Microsoft(MPICH和LAM/MPI的衍生產(chǎn)品,MPI并行編程,MPI簡(jiǎn)介-MPI發(fā)展歷程 MPI 1.1: 1995 MPICH:是MPI最流行的非專利實(shí)現(xiàn),由Argonne國(guó)家實(shí)驗(yàn)室和密西西比州立大學(xué)聯(lián)合開(kāi)發(fā),具有更好的可移植性. MPI 1.2-2.0 動(dòng)態(tài)進(jìn)程、并行I/O、遠(yuǎn)程

5、存儲(chǔ)訪問(wèn)、支持F90和C+(1997). MPI 2.2 2009年 MPI 3.02012年9月21日,MPI并行編程,MPI簡(jiǎn)介-標(biāo)準(zhǔn)的實(shí)現(xiàn),MPI并行編程,MPI簡(jiǎn)介-MPI分布式并行: 各節(jié)點(diǎn)內(nèi)存相互獨(dú)立 一個(gè)任務(wù)分成多個(gè)子任務(wù), 每個(gè)節(jié)點(diǎn)啟動(dòng)若干進(jìn)程,各自承擔(dān)一個(gè)子任務(wù) 內(nèi)存總?cè)萘繜o(wú)上限、計(jì)算時(shí)間無(wú)限壓縮 子任務(wù)間需要通信 適應(yīng)多種網(wǎng)絡(luò)介質(zhì)、協(xié)議、操作系統(tǒng)、編譯器 硬件環(huán)境(CPU、數(shù)據(jù)類型的長(zhǎng)度、大端小端、不同公司網(wǎng)卡,MPI并行編程,MPI程序基礎(chǔ)架構(gòu) 1、進(jìn)入mpi環(huán)境。產(chǎn)生通訊子、進(jìn)程號(hào)、進(jìn)程數(shù)。 2、程序主體。實(shí)現(xiàn)計(jì)算的全部?jī)?nèi)容。 3、退出mpi環(huán)境。不能再使用mpi環(huán)境,

6、MPI并行編程,進(jìn)程0,進(jìn)程1,進(jìn)程2,進(jìn)程3,計(jì)算,send,計(jì)算,send,計(jì)算,send,計(jì)算,send,recv,recv,recv,recv,計(jì)算,計(jì)算,計(jì)算,計(jì)算,初始化,初始化,初始化,初始化,bcast,bcast,bcast,bcast,銷毀,銷毀,銷毀,銷毀,掃尾,MPI并行編程,MPI程序基礎(chǔ)架構(gòu),C 必須包含mpi.h. MPI 函數(shù)返回出錯(cuò)代碼或 MPI_SUCCESS成功標(biāo)志. MPI_前綴,且只有MPI以及MPI_標(biāo)志后的第一個(gè)字母大寫(xiě),其余小寫(xiě). Fortran 必須包含mpif.h(fortran77), use mpi (fortran95 ) 通過(guò)子函數(shù)形

7、式調(diào)用MPI,函數(shù)最后一個(gè)參數(shù)為返回值,C和Fortran中MPI函數(shù)約定,include #include int main(int argc,char* argv) int myid; int numprocs; MPI_Init(,MPI程序基礎(chǔ)架構(gòu),MPI并行編程,MPI程序中,一個(gè)獨(dú)立參與通信的個(gè)體稱為一個(gè)進(jìn)程(process) 一個(gè)MPI進(jìn)程通常對(duì)應(yīng)于一個(gè)普通的進(jìn)程或線程 在共享內(nèi)存/消息傳遞混合模式程序中,一個(gè)MPI進(jìn)程可能代表一組UNIX線程 部分或全部進(jìn)程構(gòu)成的一個(gè)有序集合稱為一個(gè)進(jìn)程組。 進(jìn)程組中的每個(gè)進(jìn)程都被賦于一個(gè)唯一的序號(hào)(rank),稱為進(jìn)程號(hào),從0開(kāi)始編號(hào) 一個(gè)進(jìn)

8、程組及其相關(guān)屬性(進(jìn)程拓?fù)溥B接關(guān)系等),稱為一個(gè)通信器(communicator) 兩個(gè)內(nèi)置通信器,MPI_COMM_WORLD包含所有進(jìn)程,MPI_COMM_SELF只包含進(jìn)程自身,MPI并行編程,MPI基礎(chǔ)函數(shù) MPI_Init(); MPI_Comm_rank(); MPI_Comm_size(); MPI_Finalize(,MPI并行編程,啟動(dòng)、結(jié)束MPI環(huán)境 最先被調(diào)用的MPI函數(shù),完成MPI程序的所有初始化工作。啟動(dòng)MPI環(huán)境,標(biāo)志并行代碼的開(kāi)始. 參數(shù)argc和argv遇main函數(shù)傳來(lái),從而main必須帶參數(shù)運(yùn)行 參數(shù)用來(lái)初始化并行環(huán)境(進(jìn)程數(shù)、計(jì)算結(jié)點(diǎn)名、通信協(xié)議等) 最后

9、調(diào)后的MPI函數(shù),清除MPI并行環(huán)境,轉(zhuǎn)為串行 此后,MPI語(yǔ)句的運(yùn)行結(jié)果是不可預(yù)知的 之后串行代碼仍可在主進(jìn)程(rank = 0)上運(yùn)行(如果必須,MPI并行編程,基本的MPI通信域函數(shù) 獲得通信域comm/COMM內(nèi)的進(jìn)程數(shù)目,保存于size/SIZE中 獲得該進(jìn)程在通信域comm/COMM內(nèi)的進(jìn)程序號(hào),保存于rank/RANK中,MPI并行編程,基本的MPI點(diǎn)對(duì)點(diǎn)通信函數(shù) 將發(fā)送緩沖區(qū)中的count個(gè)datatype數(shù)據(jù)類型的數(shù)據(jù)發(fā)送到目的進(jìn)程 從指定的進(jìn)程source接收消息,并且該消息的數(shù)據(jù)類型和消息標(biāo)識(shí)和本接收進(jìn)程指定的數(shù)據(jù)類型和消息標(biāo)識(shí)相一致,收到的消息所包含的數(shù)據(jù)元素的個(gè)數(shù)最多

10、不能超過(guò)count,MPI并行編程,基本的MPI通信域函數(shù)-hello world,MPI并行編程,MPI并行編程 Hello World(c,include #include ”mpi.h” int main(int argc, char* argv) int numprocs; /*進(jìn)程數(shù),該變量為各處理器中的同名變量*/ int myid; /*本進(jìn)程ID,存儲(chǔ)也是分布的*/ MPI_Status status;/*消息接收狀態(tài)變量,存儲(chǔ)也是分布的*/ char message100;/*消息buffer,存儲(chǔ)也是分布的*/ int source MPI_Init,MPI并行編程 Hel

11、lo World(c,if(myid != 0)/*建立消息*/ sprintf(message, Hello World from process %d/%d!, myid, numprocs); /* 發(fā)送長(zhǎng)度取strlen(message)+1,使0也一同發(fā)送出去*/ MPI_Send(message, 100, MPI_CHAR, 0, 99, MPI_COMM_WORLD); else /* myid = 0 */ for(source = 1; source numprocs; source+) MPI_Recv(message, 100, MPI_CHAR, source, 99

12、, MPI_COMM_WORLD, /* End main *,MPI并行編程, source /public/software/profile.d/ompi-1.6-gnu.sh $ mpicc -o hello hello.c $ ./hello () 0 Aborting program! Could not create p4 procgroup. Possible missing fileor program started without mpirun. $ mpirun -np 4 hello () “Hello World” from process 1/4! “Hello W

13、orld” from process 2/4! “Hello World” from process 3/4! ,計(jì)算機(jī)打印字符,我們輸入的命令,hello是如何被執(zhí)行的? SPMD: Single Program Multiple Data 單程序多數(shù)據(jù),MPI并行編程,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 argc,

14、char *argv ) MPI_Init(,include mpi.h #include main( int argc, char *argv ) MPI_Init(,hello hello hello hello,include mpi.h #include main( int argc, char *argv ) MPI_Init(,rshssh,MPI原生數(shù)據(jù)類型,Broadcast - 數(shù)據(jù)廣播,數(shù)據(jù) . MPI_Bcast();,數(shù)據(jù) . MPI_Bcast();,進(jìn)程 0 myrank = 0,進(jìn)程1 myrank = 1,進(jìn)程p-1 myrank = p-1,int MPI_B

15、cast ( void *buffer,/*發(fā)送/接收buf*/ int count, /*元素個(gè)數(shù)*/ MPI_Datatype datatype, int root, /*指定根進(jìn)程*/ MPI_Comm comm) 根進(jìn)程既是發(fā)送緩沖區(qū)也是接收緩沖區(qū),數(shù)據(jù) . MPI_Bcast();,進(jìn)程2 myrank = 2,include #includempi.h using namespace std; int main(int argc, char *argv) int array2; int myrank; MPI_Init(,bcast示例, mpirun -np 4 ./bcast.

16、exe b rank 0: 0 0 a rank 0: 0 0 b rank 3: 3 3 b rank 1: 1 1 a rank 1: 0 0 b rank 2: 2 2 a rank 2: 0 0 a rank 3: 0 0,int MPI_Gather(void* sendbuf, int sendcount, MPI_Datatype sendtype, void* recvbuf, int recvcount, MPI_Datatype recvtype, int root, MPI_Comm comm,數(shù)據(jù)收集-gather,include #includempi.h using

17、 namespace std; int main(int argc, char *argv) MPI_Init,Gather示例,int root = 0; int *rbuf; if(myrank = root) rbuf = new intgsize*2; MPI_Gather(sendarray, 2, MPI_INT, rbuf, 2, MPI_INT, root, MPI_COMM_WORLD); if(myrank = root) cout sendarray = endl; for(int i=0; i gsize; i+) cout rbufi*2 rbufi*2 +1 ; c

18、out endl; delete rbuf; MPI_Finalize(); return 0;, mpirun -np 4 ./gather.exe rank 0: 0 0 rank 2: 2 2 rank 1: 1 1 rank 3: 3 3 sendarray = 0 0 1 1 2 2 3 3,Gather算例輸出,更強(qiáng)收集 MPI_Gatherv,根進(jìn)程從組中的每個(gè)其他進(jìn)程收集100個(gè)整型數(shù)據(jù),每個(gè)數(shù)據(jù)集之間按一定步長(zhǎng)分開(kāi)存放,根進(jìn)程從100*150的數(shù)組中收集第0列,每個(gè)數(shù)據(jù)集之間按一定步長(zhǎng)分開(kāi)存放,根進(jìn)程從100*150的數(shù)組中收集第i列的100-i個(gè)整型數(shù)據(jù),每個(gè)數(shù)據(jù)集之間按一

19、定步長(zhǎng)分開(kāi)存放,根進(jìn)程從100*150的數(shù)組中收集第i列的100-i個(gè)整型數(shù)據(jù),每個(gè)數(shù)據(jù)集之間按步長(zhǎng)stridei分開(kāi)存放,MPI_SCATTER(sendbuf, sendcount, sendtype, recvbuf, recvcount, recvtype, root, comm) sendbuf 待發(fā)送數(shù)據(jù)首地址 sendcounts 待發(fā)送數(shù)據(jù)數(shù)量 sendtype 待發(fā)送數(shù)據(jù)的類型 recvbuf 接收到數(shù)據(jù)的存放位置 recvcount 接收的數(shù)據(jù)數(shù)量 recvtype 接收數(shù)據(jù)的類型 root 根進(jìn)程號(hào) comm 通信器名字,數(shù)據(jù)散發(fā)-scatter,int MPI_Scat

20、ter(void* sendbuf, int sendcount, MPI_Datatype sendtype, void* recvbuf, int recvcount, MPI_Datatype recvtype, int root, MPI_Comm comm,scatter C接口,include #includempi.h using namespace std; int main(int argc, char *argv) int myrank, gsize, *sendbuf; MPI_Init(,MPI_Scatter(sendbuf, 2, MPI_INT, rbuf, 2,

21、 MPI_INT, root, MPI_COMM_WORLD); cout Arank myrank : rbuf0 rbuf1 endl; if(myrank = root) delete sendbuf; MPI_Finalize(); return 0;, mpirun -np 4 ./scatter.exe rank0:0 0 Arank0:100 100 rank1:1 1 Arank1:100 100 rank2:2 2 Arank2:100 100 rank3:3 3 Arank3:100 100,更強(qiáng)分發(fā)-scatterv,根進(jìn)程分散100*150數(shù)組的第i列中100-i個(gè)整型

22、數(shù)據(jù)塊.發(fā)送端的步長(zhǎng)分別為stridei,根進(jìn)程分散100個(gè)整型數(shù)據(jù),在分散時(shí)按步長(zhǎng)stride取數(shù)據(jù),通信域中所有進(jìn)程從其他進(jìn)程收集數(shù)據(jù),同時(shí)將自己的數(shù)據(jù)散發(fā)給其他進(jìn)程. int MPI_Alltoall( void *sendbuf, int sendcount, MPI_Datatype sendtype, void *recvbuf, int recvcnt, MPI_Datatype recvtype, MPI_Comm comm,Alltoall - 數(shù)據(jù)轉(zhuǎn)置,對(duì)組中所有進(jìn)程的發(fā)送緩沖區(qū)中的數(shù)據(jù)用OP參數(shù)指定的操作進(jìn)行運(yùn)算,并將結(jié)果送回到根進(jìn)程的接收緩沖區(qū)中. int MPI_Re

23、duce ( void *sendbuf, void *recvbuf, int count, MPI_Datatype datatype, MPI_Op op, int root, MPI_Comm comm,全局歸約reduce,data . MPI_Scatter();,data . MPI_ Scatter();,data . MPI_ Scatter();,Process 0 myrank = 0,Process 1 myrank = 1,Process p-1 myrank = p-1,buf,支持的歸約操作運(yùn)算,兩個(gè)長(zhǎng)度為N的向量ai、bi 作內(nèi)積: S=a0*b0 + a1*b

24、1 + + aN-1*bN-1 向量a:和b:分布在多個(gè)進(jìn)程上,示例:向量?jī)?nèi)積,include #include #include #includempi.h using namespace std; int main(int argc, char *argv) int myrank, gsize, *sendbuf; MPI_Init,for(int i=0; i10; i+) ai = (random()%10); bi = (random()%4); sum_part += ai*bi; cout sum_part = sum_part endl; int root =0; MPI_Re

25、duce(, mpirun -np 4 ./reduce.exe sum_part = 50 sum_part = 49 sum_part = 76 sum_part = 93 sum = 268,實(shí)例: 求,include using namespace std; double f(double a) return (4.0/(1.0+a*a); int main(void) int n = 100; double h, x, pi, sum=0.0; h=1.0/(double)n; for(int i=1; i=n; i+) x=h*(double)i - 0.5); sum += f(

26、x); pi=h*sum; cout pi = pi endl; return 0;,串行代碼,include #include mpi.h using namespace std; double f( double a) return (4.0 / (1.0 + a*a); int main(int argc, char *argv) int n, myrank, nprocs; double PI25DT = 3.141592653589793238; double mypi, pi, h, sum, x; double startwtime=0.0, endwtime; MPI_Init

27、,并行代碼,MPI_Bcast(,MPI編譯工具安裝-OpenMPI,穩(wěn)定版1.6,/software/ompi/v1.6/ $ tar zxvf openmpi-1.6.tar.gz $ cd openmpi-1.6 $ ./configure -prefix=/public/software/mpi/ompi-1.6-gnu CC=gcc CXX=g+ FC=gfortran F77=gfortran $ make -j 8 $ make install intel編譯器版 $ ./configure CC=icc CXX=icc F77=ifo

28、rt FC=ifort,創(chuàng)建環(huán)境變量文件/public/software/profile.d/ompi-1.6-gnu.sh #!/bin/bash MPI_HOME=/public/software/mpi/openmpi-1.6-gnu export PATH=$MPI_HOME/bin:$PATH export LD_LIBRARY_PATH=$MPI_HOME/lib:$LD_LIBRARY_PATH export MANPATH=$MPI_HOME/share/man:$MANPATH unset MPI_HOME,OpenMPI編譯命令,mpirun用法, mpirun -np 4

29、 -hostfile hostfile program -np X:運(yùn)行X個(gè)進(jìn)程 -hostfile:指定計(jì)算節(jié)點(diǎn),hostfile形式一:每行一個(gè)結(jié)點(diǎn) node1 node1 node2 node2,hostfile形式二:指定重復(fù)次數(shù) node1 slots=2 node2 slots=2,選擇通信網(wǎng)絡(luò),節(jié)點(diǎn)內(nèi)使用共享內(nèi)存,節(jié)點(diǎn)間使用InfiniBand通信 $ mpirun -np 12 -hostfile hosts -mca btl self,sm,openib ./program,mvapich2簡(jiǎn)介,包裝mpich2,兼容性好 添加支持InfiniBand 最新版本1.8,支持M

30、PI2.2標(biāo)準(zhǔn) 支持GPU通信,結(jié)點(diǎn)內(nèi)、跨結(jié)點(diǎn) 包含多個(gè)模塊,Mvapich2安裝,同時(shí)編譯IB版和TCP/IP版 $ tar zxvf mvapich2-1.7rc1.tgz $ cd mvapich2-1.7rc1 $ ./configure -prefix=/public/software/mpi/mvapich2-17rc1-gnu CC=gcc CXX=g+ FC=gfortran F77=gfortran -with-device=ch3:nemesis:ib,tcp $ make & make install,編譯IB版(顯式選擇) $ ./configure -with-device=ch3:mrail -with-rdma=gen2 編譯IB版(默認(rèn)選擇) $ ./configure,編譯IB+GPU版 $ ./configure -enable-cuda,編譯TCP/IP版 $ ./configure -with-device=ch3:sock,Mvapich2安裝(2,編譯IB+GPU+PGI編譯器 $ ./configure CC=pgcc CXX=pgCC FC=pgf90 F77=pgf77 -enable-cuda CPPFLAGS=-D_x86_64 -

溫馨提示

  • 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ù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 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)論