




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、MPI并行程序設計(C版,曙光信息產(chǎn)業(yè)(北京)有限公司 高性能產(chǎn)品事業(yè)部,對本文檔的任何使用都被視為完全理解并接受本文檔列舉的所有法律條款。 本文檔的所有權利歸作者所有,作者保留所有權利。 未經(jīng)作者書面同意,禁止任何形式的商業(yè)使用。商業(yè)使用形式包括但不限于出版、復制、傳播、展示、引用、編輯。 本文檔允許以學術研究、技術交流為目的使用。復制、傳播過程中不得對本文檔作任何增減編輯,引用時需注明出處。 實施任何侵權行為的法人或自然人都必須向作者支付賠償金,賠償金計算方法為: 賠償金 = 涉案人次涉案時長(天)涉案文檔份數(shù)受眾人次100元人民幣,涉案人次、涉案時長、涉案文檔份數(shù)、受眾人次小于1時,按1
2、計算。 對舉報侵權行為、提供有價值證據(jù)的自然人或法人,作者承諾獎勵案件實際賠償金的50%. 涉及本文檔的法律糾紛由作者所在地法院裁決。 本文檔所列舉法律條款的最終解釋權歸作者所有,法律條款,目錄,并行計算定義 并行計算是指,在并行機上,將一個應用分解成多個子任務,分配給不同的處理器,各個處理器之間相互協(xié)同,并行的執(zhí)行子任務,從而達到加速求解速度的目的。 并行計算條件 開展并行計算必須具備三個基本條件: 1、并行機(硬件) 2、應用問題必須具有并行度(應用) 3、并行程序(軟件,并行計算簡介,并行層次,CPU單核并行 指令級并行 SIMD、超線程 多核并行 共享內存OpenMP,加速器 nVid
3、ia GPU AMD GPU Intel Xeon Phi 專為并行計算設計,超級計算機 多節(jié)點、異構 成千上萬核心 成熟的并行技術,并行計算系統(tǒng)-分類 MPP SMP Cluster CPU和GPU的混合系統(tǒng) 星群系統(tǒng),并行計算簡介,并行計算簡介,并行計算簡介,并行計算簡介,并行計算簡介,并行計算簡介,目錄,MPI簡介-什么是MPI: MPI(Message-Passing Interface)是一種標準,最初是1991年在奧地利的學術和工業(yè)界的一些研究人員一塊商議制定的。 標準的實現(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簡介-MPI發(fā)展歷程 MPI 1.1: 1995 MPICH:是MPI最流行的非專利實現(xiàn),由Argonne國家實驗室和密西西比州立大學聯(lián)合開發(fā),具有更好的可移植性. MPI 1.2-2.0 動態(tài)進程、并行I/O、遠程
5、存儲訪問、支持F90和C+(1997). MPI 2.2 2009年 MPI 3.02012年9月21日,MPI并行編程,MPI簡介-標準的實現(xiàn),MPI并行編程,MPI簡介-MPI分布式并行: 各節(jié)點內存相互獨立 一個任務分成多個子任務, 每個節(jié)點啟動若干進程,各自承擔一個子任務 內存總容量無上限、計算時間無限壓縮 子任務間需要通信 適應多種網(wǎng)絡介質、協(xié)議、操作系統(tǒng)、編譯器 硬件環(huán)境(CPU、數(shù)據(jù)類型的長度、大端小端、不同公司網(wǎng)卡,MPI并行編程,MPI程序基礎架構 1、進入mpi環(huán)境。產(chǎn)生通訊子、進程號、進程數(shù)。 2、程序主體。實現(xiàn)計算的全部內容。 3、退出mpi環(huán)境。不能再使用mpi環(huán)境,
6、MPI并行編程,進程0,進程1,進程2,進程3,計算,send,計算,send,計算,send,計算,send,recv,recv,recv,recv,計算,計算,計算,計算,初始化,初始化,初始化,初始化,bcast,bcast,bcast,bcast,銷毀,銷毀,銷毀,銷毀,掃尾,MPI并行編程,MPI程序基礎架構,C 必須包含mpi.h. MPI 函數(shù)返回出錯代碼或 MPI_SUCCESS成功標志. MPI_前綴,且只有MPI以及MPI_標志后的第一個字母大寫,其余小寫. Fortran 必須包含mpif.h(fortran77), use mpi (fortran95 ) 通過子函數(shù)形
7、式調用MPI,函數(shù)最后一個參數(shù)為返回值,C和Fortran中MPI函數(shù)約定,include #include int main(int argc,char* argv) int myid; int numprocs; MPI_Init(,MPI程序基礎架構,MPI并行編程,MPI程序中,一個獨立參與通信的個體稱為一個進程(process) 一個MPI進程通常對應于一個普通的進程或線程 在共享內存/消息傳遞混合模式程序中,一個MPI進程可能代表一組UNIX線程 部分或全部進程構成的一個有序集合稱為一個進程組。 進程組中的每個進程都被賦于一個唯一的序號(rank),稱為進程號,從0開始編號 一個進
8、程組及其相關屬性(進程拓撲連接關系等),稱為一個通信器(communicator) 兩個內置通信器,MPI_COMM_WORLD包含所有進程,MPI_COMM_SELF只包含進程自身,MPI并行編程,MPI基礎函數(shù) MPI_Init(); MPI_Comm_rank(); MPI_Comm_size(); MPI_Finalize(,MPI并行編程,啟動、結束MPI環(huán)境 最先被調用的MPI函數(shù),完成MPI程序的所有初始化工作。啟動MPI環(huán)境,標志并行代碼的開始. 參數(shù)argc和argv遇main函數(shù)傳來,從而main必須帶參數(shù)運行 參數(shù)用來初始化并行環(huán)境(進程數(shù)、計算結點名、通信協(xié)議等) 最后
9、調后的MPI函數(shù),清除MPI并行環(huán)境,轉為串行 此后,MPI語句的運行結果是不可預知的 之后串行代碼仍可在主進程(rank = 0)上運行(如果必須,MPI并行編程,基本的MPI通信域函數(shù) 獲得通信域comm/COMM內的進程數(shù)目,保存于size/SIZE中 獲得該進程在通信域comm/COMM內的進程序號,保存于rank/RANK中,MPI并行編程,基本的MPI點對點通信函數(shù) 將發(fā)送緩沖區(qū)中的count個datatype數(shù)據(jù)類型的數(shù)據(jù)發(fā)送到目的進程 從指定的進程source接收消息,并且該消息的數(shù)據(jù)類型和消息標識和本接收進程指定的數(shù)據(jù)類型和消息標識相一致,收到的消息所包含的數(shù)據(jù)元素的個數(shù)最多
10、不能超過count,MPI并行編程,基本的MPI通信域函數(shù)-hello world,MPI并行編程,MPI并行編程 Hello World(c,include #include ”mpi.h” int main(int argc, char* argv) int numprocs; /*進程數(shù),該變量為各處理器中的同名變量*/ int myid; /*本進程ID,存儲也是分布的*/ MPI_Status status;/*消息接收狀態(tài)變量,存儲也是分布的*/ char message100;/*消息buffer,存儲也是分布的*/ int source MPI_Init,MPI并行編程 Hel
11、lo World(c,if(myid != 0)/*建立消息*/ sprintf(message, Hello World from process %d/%d!, myid, numprocs); /* 發(fā)送長度取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! ,計算機打印字符,我們輸入的命令,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();,進程 0 myrank = 0,進程1 myrank = 1,進程p-1 myrank = p-1,int MPI_B
15、cast ( void *buffer,/*發(fā)送/接收buf*/ int count, /*元素個數(shù)*/ MPI_Datatype datatype, int root, /*指定根進程*/ MPI_Comm comm) 根進程既是發(fā)送緩沖區(qū)也是接收緩沖區(qū),數(shù)據(jù) . MPI_Bcast();,進程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算例輸出,更強收集 MPI_Gatherv,根進程從組中的每個其他進程收集100個整型數(shù)據(jù),每個數(shù)據(jù)集之間按一定步長分開存放,根進程從100*150的數(shù)組中收集第0列,每個數(shù)據(jù)集之間按一定步長分開存放,根進程從100*150的數(shù)組中收集第i列的100-i個整型數(shù)據(jù),每個數(shù)據(jù)集之間按一
19、定步長分開存放,根進程從100*150的數(shù)組中收集第i列的100-i個整型數(shù)據(jù),每個數(shù)據(jù)集之間按步長stridei分開存放,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 根進程號 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,更強分發(fā)-scatterv,根進程分散100*150數(shù)組的第i列中100-i個整型
22、數(shù)據(jù)塊.發(fā)送端的步長分別為stridei,根進程分散100個整型數(shù)據(jù),在分散時按步長stride取數(shù)據(jù),通信域中所有進程從其他進程收集數(shù)據(jù),同時將自己的數(shù)據(jù)散發(fā)給其他進程. int MPI_Alltoall( void *sendbuf, int sendcount, MPI_Datatype sendtype, void *recvbuf, int recvcnt, MPI_Datatype recvtype, MPI_Comm comm,Alltoall - 數(shù)據(jù)轉置,對組中所有進程的發(fā)送緩沖區(qū)中的數(shù)據(jù)用OP參數(shù)指定的操作進行運算,并將結果送回到根進程的接收緩沖區(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,支持的歸約操作運算,兩個長度為N的向量ai、bi 作內積: S=a0*b0 + a1*b
24、1 + + aN-1*bN-1 向量a:和b:分布在多個進程上,示例:向量內積,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,實例: 求,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:運行X個進程 -hostfile:指定計算節(jié)點,hostfile形式一:每行一個結點 node1 node1 node2 node2,hostfile形式二:指定重復次數(shù) node1 slots=2 node2 slots=2,選擇通信網(wǎng)絡,節(jié)點內使用共享內存,節(jié)點間使用InfiniBand通信 $ mpirun -np 12 -hostfile hosts -mca btl self,sm,openib ./program,mvapich2簡介,包裝mpich2,兼容性好 添加支持InfiniBand 最新版本1.8,支持M
30、PI2.2標準 支持GPU通信,結點內、跨結點 包含多個模塊,Mvapich2安裝,同時編譯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版(默認選擇) $ ./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. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 中俄外貿(mào)合同樣本
- 2025年廣州市合同范本
- 冷物流運輸合同標準文本
- 公司窗外保潔服務合同標準文本
- 幼兒園教育公平性的探索與實踐計劃
- 舉升機租賃合同樣本
- 農(nóng)村工程維護合同樣本
- 學校教學任務分配方案計劃
- 農(nóng)戶馬鈴薯訂單合同樣本
- 兼職招商顧問合同樣本
- HG-T 2643-2023 非金屬化工設備 丙烯腈-丁二烯-苯乙烯、聚氯乙烯、均聚聚丙烯、聚偏氟乙烯和玻璃纖維增強聚丙烯隔膜閥
- 污水排入城鎮(zhèn)污水管網(wǎng)排放口設置技術規(guī)范
- 醫(yī)護人員職業(yè)倦怠與心理健康研究
- 寵物分期付款協(xié)議書
- 精密超精密加工
- 10月自考現(xiàn)代語言學(00830)試題及答案解析與評分標準
- 倉庫搬運工安全操作培訓課程
- 《怪老頭兒》名著導讀
- 外研社一年級起點英語-四年級上冊各單元知識點
- 老年人的口腔知識講座
- NB-T 47013.1-2015 承壓設備無損檢測 第1部分-通用要求
評論
0/150
提交評論