![并行程序設計簡介_第1頁](http://file4.renrendoc.com/view/7fee4bbdea16314afa58f18d49b82743/7fee4bbdea16314afa58f18d49b827431.gif)
![并行程序設計簡介_第2頁](http://file4.renrendoc.com/view/7fee4bbdea16314afa58f18d49b82743/7fee4bbdea16314afa58f18d49b827432.gif)
![并行程序設計簡介_第3頁](http://file4.renrendoc.com/view/7fee4bbdea16314afa58f18d49b82743/7fee4bbdea16314afa58f18d49b827433.gif)
![并行程序設計簡介_第4頁](http://file4.renrendoc.com/view/7fee4bbdea16314afa58f18d49b82743/7fee4bbdea16314afa58f18d49b827434.gif)
![并行程序設計簡介_第5頁](http://file4.renrendoc.com/view/7fee4bbdea16314afa58f18d49b82743/7fee4bbdea16314afa58f18d49b827435.gif)
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領
文檔簡介
1、七月 221/55并行程序設計簡介曙光信息產(chǎn)業(yè)(北京)有限公司七月 222/55講座內(nèi)容提示基本概念基本的MPI點到點通信(Point to point)MPI中API的主要內(nèi)容,為MPI最基本,最重要的內(nèi)容MPI程序的編譯和運行實例七月 223/55參考文獻MPI-the complete reference. Marc Snir, MIT Press, 1998. ISBN 0262692155, 0262692163.Using MPI : portable parallel programming with the message-passing interface, William
2、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.高性能計算并行編程技術(shù)-MPI并行程序設計,都志輝,清華大學出版社, 2001年8月。七月 224/55多線程庫標準 Win32 API. POSIX threads.編譯制導標準 OpenMP 可移植共享存儲并行編程標準.消息傳遞庫標準 MPI PVM并行編程標準
3、本討論的重點七月 225/55消息傳遞并行程序設計消息傳遞并行程序設計指用戶必須通過顯式地發(fā)送和接收消息來實現(xiàn)處理機間的數(shù)據(jù)交換。在這種并行編程中,每個并行進程均有自己獨立的地址空間,相互之間訪問不能直接進行,必須通過顯式的消息傳遞來實現(xiàn)。這種編程方式是大規(guī)模并行處理機(MPP)和機群(Cluster)采用的主要編程方式。并行計算粒度大,特別適合于大規(guī)??蓴U展并行算法由于消息傳遞程序設計要求用戶很好地分解問題,組織不同進程間的數(shù)據(jù)交換,并行計算粒度大,特別適合于大規(guī)??蓴U展并行算法.消息傳遞是當前并行計算領域的一個非常重要的并行程序設計方式七月 226/55什么是MPI?Massage Pas
4、sing Interface:是消息傳遞函數(shù)庫的標準規(guī)范,由MPI論壇開發(fā),支持Fortran和C一種新的庫描述,不是一種語言。共有上百個函數(shù)調(diào)用接口,在Fortran和C語言中可以直接對這些函數(shù)進行調(diào)用MPI是一種標準或規(guī)范的代表,而不是特指某一個對它的具體實現(xiàn)MPI是一種消息傳遞編程模型,并成為這種編程模型的代表和事實上的標準七月 227/55MPI的發(fā)展過程發(fā)展的兩個階段MPI 1.1: 1995MPICH:是MPI最流行的非專利實現(xiàn),由Argonne國家實驗室和密西西比州立大學聯(lián)合開發(fā),具有更好的可移植性.MPI 1.22.0:動態(tài)進程, 并行 I/O, 遠程存儲訪問、支持F90和C+
5、(1997).七月 228/55為什么要用MPI?高可移植性MPI已在IBM PC機上、MS Windows上、所有主要的Unix工作站上和所有主流的并行機上得到實現(xiàn)。使用MPI作消息傳遞的C或Fortran并行程序可不加改變地運行在IBM PC、MS Windows、Unix工作站、以及各種并行機上。七月 229/55:從簡單入手Init和Finalize下面我們首先分別以C語言和Fortran語言的形式給出一個最簡單的MPI并行程序Hello (下頁).該程序在終端打印出Hello World!字樣.“Hello World”:一聲來自新生兒的問候. 七月 2210/55Hello wor
6、ld(C)#include #include mpi.h“main( int argc, char *argv ) MPI_Init( &argc, &argv ); printf( Hello, world!n ); MPI_Finalize();七月 2211/55Hello world(Fortran)program maininclude mpif.hinteger ierrcall MPI_INIT( ierr )print *, Hello, world!call MPI_FINALIZE( ierr )end七月 2212/55C和Fortran中MPI函數(shù)約定C必須包含mpi.
7、h.MPI 函數(shù)返回出錯代碼或 MPI_SUCCESS成功標志.MPI-前綴,且只有MPI以及MPI_標志后的第一個字母大寫,其余小寫.Fortran必須包含mpif.h.通過子函數(shù)形式調(diào)用MPI,函數(shù)最后一個參數(shù)為返回值.MPI-前綴,且函數(shù)名全部為大寫.MPI函數(shù)的參數(shù)被標志為以下三種類型:IN:參數(shù)在例程的調(diào)用中不會被修正.OUT:參數(shù)在例程的調(diào)用中可能會被修正.INOUT:參數(shù)有初始值,且在例程的調(diào)用中可能會被修正七月 2213/55MPI初始化-MPI_INITint MPI_Init(int *argc, char *argv)MPI_INIT(IERROR)MPI_INIT是MP
8、I程序的第一個調(diào)用,它完成MPI程序的所有初始化工作。所有的MPI程序的第一條可執(zhí)行語句都是這條語句。啟動MPI環(huán)境,標志并行代碼的開始.并行代碼之前,第一個mpi函數(shù)(除MPI_Initialized()外).要求main必須帶參數(shù)運行,否則出錯.七月 2214/55MPI結(jié)束-MPI_FINALIZEint MPI_Finalize(void)MPI_FINALIZE(IERROR)MPI_FINALIZE是MPI程序的最后一個調(diào)用,它結(jié)束MPI程序的運行,它是MPI程序的最后一條可執(zhí)行語句,否則程序的運行結(jié)果是不可預知的。標志并行代碼的結(jié)束,結(jié)束除主進程外其它進程.之后串行代碼仍可在主進
9、程(rank = 0)上運行(如果必須).七月 2215/55MPI程序的的編譯與運行mpif77 hello.f 或 mpicc hello.c 默認生成a.out的可執(zhí)行代碼.mpif77 o hello hello.f 或mpicc o hello hello.c生成hello的可執(zhí)行代碼.mpirun np 4 a.outmpirun np 4 hello4 指定np的實參,表示進程數(shù),由用戶指定.a.out / hello 要運行的MPI并行程序.%小寫onp:The number of process.七月 2216/55:運行我們的MPI程序!dairnode01 $ mpicc
10、 -o hello hello.cdairnode01 $ ./hello () 0 Aborting program ! Could not create p4 procgroup. Possible missing fileor program started without mpirun.dairnode01 $ mpirun -np 4 hello () Hello World! Hello World! Hello World! Hello World!dairnode01 $ 計算機打印字符我們輸入的命令七月 2217/55:Hello是如何被執(zhí)行的?SPMD: Single Pr
11、ogram Multiple Data(SIMD) :#include mpi.h#include main( int argc, char *argv ) MPI_Init( &argc, &argv ); printf( Hello, world!n ); MPI_Finalize();#include mpi.h#include main( int argc, char *argv ) MPI_Init( &argc, &argv ); printf( Hello, world!n ); MPI_Finalize();#include mpi.h#include main( int ar
12、gc, char *argv ) MPI_Init( &argc, &argv ); printf( Hello, world!n ); MPI_Finalize();#include mpi.h#include main( int argc, char *argv ) MPI_Init( &argc, &argv ); printf( Hello, world!n ); MPI_Finalize();Hello World!Hello World!Hello World!Hello World!#include mpi.h#include main( int argc, char *argv
13、 ) MPI_Init( &argc, &argv ); printf( Hello, world!n ); MPI_Finalize();rshssh七月 2218/55:開始寫MPI并行程序 Comm_size和Comm_rank在寫MPI程序時,我們常需要知道以下兩個問題的答案:任務由多少個進程來進行并行計算?我是哪一個進程? 七月 2219/55MPI 提供了下列函數(shù)來回答這些問題:用MPI_Comm_size 獲得進程個數(shù) p int MPI_Comm_size(MPI_Comm comm, int *size);用MPI_Comm_rank 獲得進程的一個叫rank的值,該 ran
14、k值為0到p-1間的整數(shù),相當于進程的IDint MPI_Comm_rank(MPI_Comm comm, int *rank);七月 2220/55更新的Hello World(c)#include #include mpi.hmain( int argc, char *argv ) int myid, numprocs; MPI_Init( &argc, &argv ); MPI_Comm_rank( MPI_COMM_WORLD, &myid ); MPI_Comm_size( MPI_COMM_WORLD, &numprocs ); printf(“I am %d of %dn, my
15、id, numprocs ); MPI_Finalize();七月 2221/55更新的Hello World(F77)program maininclude mpif.hinteger ierr, myid, numprocscall 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, numprocscall MPI_FINALIZE( ierr )end七月 2
16、222/55:運行結(jié)果dairnode01 $ mpicc o hello1 hello1.cdairnode01 $ mpirun -np 4 hello1I am 0 of 4I am 1 of 4I am 2 of 4I am 3 of 4dairnode01 $計算機打印字符我們輸入的命令七月 2223/55:寫MPI并行通信程序-Send和RecvGreeting執(zhí)行過程七月 2224/55有消息傳遞greetings(c)#include #include mpi.hmain(int argc, char* argv) int numprocs, myid, source; MPI
17、_Status status; char message100; MPI_Init(&argc, &argv); MPI_Comm_rank(MPI_COMM_WORLD, &myid); MPI_Comm_size(MPI_COMM_WORLD, &numprocs);七月 2225/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 */ f
18、or (source = 1; source numprocs; source+) MPI_Recv(message, 100, MPI_CHAR, source, 99, MPI_COMM_WORLD, &status); printf(%sn, message); MPI_Finalize(); /* end main */七月 2226/55解剖greetings程序頭文件: mpi.h/ MPI_Init(int *argc, char *argv) 啟動MPI環(huán)境,標志并行代碼的開始.并行代碼之前,第一個mpi函數(shù)(除MPI_Initialize()外).要求ma
19、in必須帶參數(shù)運行,否則出錯.通信域(通信空間): MPI_COMM_WORLD:一個通信空間是一個進程組和一個上下文的組合.上下文可看作為組的超級標簽,用于區(qū)分不同的通信域.在執(zhí)行函數(shù)MPI_Init之后,一個MPI程序的所有進程形成一個缺省的組,這個組的通信域即被寫作MPI_COMM_WORLD.該參數(shù)是MPI通信操作函數(shù)中必不可少的參數(shù),用于限定參加通信的進程的范圍.七月 2227/55解剖greetings程序int MPI_Comm_size ( MPI_Comm comm, int *size )獲得通信空間comm中規(guī)定的組包含的進程的數(shù)量.指定一個communicator,也指
20、定了一組共享該空間的進程, 這些進程組成該communicator的 MPI_Comm_rank ( MPI_Comm comm, int *rank ) 得到本進程在通信空間中的rank值,即在組中的邏輯編號(從0開始).int MPI_Finalize() 標志并行代碼的結(jié)束,結(jié)束除主進程外其它進程.之后串行代碼仍可在主進程(rank = 0)上運行(如果必須).七月 2228/55講座內(nèi)容提示基本的MPI基本概念點到點通信(Point to point)MPI中API的主要內(nèi)容,為MPI最基本,最重要的內(nèi)容MPI程序的編譯和運行深入MPI用戶自定義(/派生)數(shù)據(jù)類型(U
21、ser-defined(Derived) data type)事實上MPI的所有數(shù)據(jù)類型均為MPI自定義類型支持異構(gòu)系統(tǒng)允許消息來自不連續(xù)的或類型不一致的存儲區(qū)(結(jié)構(gòu),數(shù)組散元)集合通信(Collective)數(shù)據(jù)移動,數(shù)據(jù)聚集,同步基于point to point 構(gòu)建MPI環(huán)境管理函數(shù)組,上下文和通信空間/通信域的管理實例七月 2229/55Point to Point通信單個進程對單個進程的通信,重要且復雜術(shù)語Blocking(阻塞) :一個例程須等待操作完成才返回,返回后用戶可以重新使用調(diào)用中所占用的資源. Non-blocking(非阻塞):一個例程不必等待操作完成便可返回,但這并不
22、意味著所占用的資源可被重用. Local(本地):過程的完成僅依賴于本地正在執(zhí)行的進程。Non-local(非本地):如果過程的完成要求其他進程的 MPI 過程完成。七月 2230/55Blocking Sendint MPI_Send(void* buf, int count, MPI_Datatype datatype, int dest, int tag, MPI_Comm comm); IN buf 發(fā)送緩沖區(qū)的起始地址 IN count 要發(fā)送信息的元素個數(shù) IN datatype 發(fā)送信息的數(shù)據(jù)類型 IN dest 目標進程的rank值 IN tag 消息標簽 IN comm 通信
23、域七月 2231/55Blocking Receiveint 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ā)送信息的元素個數(shù) IN datatype 發(fā)送信息的數(shù)據(jù)類型 IN dest 目標進程的rank值 IN tag 消息標簽 IN comm 通信域OUT statusstatus對象,包含實際接收到的消息的有關信息七月 2232/55MPI消息MPI消息包
24、括信封和數(shù)據(jù)兩個部分,信封指出了發(fā)送或接收消息的對象及相關信息,而數(shù)據(jù)是本消息將要傳遞的內(nèi)容數(shù)據(jù):信封:七月 2233/55七月 2234/55消息數(shù)據(jù)由count個類型為datatype的連續(xù)數(shù)據(jù)空間組成, 起始地址為buf不是以字節(jié)數(shù), 而是以元素的個數(shù)指定消息的長度count可以是零, 這種情況下消息的數(shù)據(jù)部分是空的MPI基本數(shù)據(jù)類型相應于宿主語言的基本數(shù)據(jù)類型 七月 2235/55MPI基本數(shù)據(jù)類型七月 2236/55MPI標識一條消息的信息包含四個域:Source: 發(fā)送進程隱式確定,由進程的rank值唯一標識Destination: Send函數(shù)參數(shù)確定Tag: Send函數(shù)參數(shù)確
25、定,用于識別不同的消息 (0,UB),UB:MPI_TAG_UB=32767.Communicator: 缺省MPI_COMM_WORLDGroup:有限/N,有序/Rank 0,1,2,N-1Contex:Super_tag,用于標識該通訊空間.消息信封七月 2237/55status參數(shù)當使用MPI_ANY_SOURCE或/和MPI_ANY_TAG接收消息時如何確定消息的來源source 和 tag值呢?在C中,結(jié)構(gòu),status.MPI_SOURCE, status.MPI_TAG.在Fortran中,數(shù)組,source=status(MPI_SOURCE), tag=status(MP
26、I_TAG).Status還可用于返回實際接收到消息的長度int MPI_Get_count(MPI_Status status, MPI_Datatype datatype,int* count)IN status 接收操作的返回值.IN datatype 接收緩沖區(qū)中元素的數(shù)據(jù)類型.OUT count 接收消息中的元素個數(shù).七月 2238/55消息匹配接收buffer必須至少可以容納count個由datatype參數(shù)指明類型的數(shù)據(jù). 如果接收buf太小, 將導致溢出、出錯.消息匹配參數(shù)匹配 dest,tag,comm/ source,tag,commSource = MPI_ANY_SOU
27、RCE:接收任意處理器來的數(shù)據(jù)(任意消息來源).Tag = MPI_ANY_TAG:匹配任意tag值的消息(任意tag消息).Source = destination 是允許的, 但是不安全的, 可能導致死鎖。消息傳送被限制在同一個communicator.在send函數(shù)中必須指定唯一的接收者(Push/pull通訊機制).七月 2239/55分析greetings#include #include mpi.h“main(int argc, char* argv) int numprocs; /*進程數(shù),該變量為各處理器中的同名變量, 存儲是分布的*/int myid;/*我的進程ID,存儲也
28、是分布的*/ MPI_Status status; /*消息接收狀態(tài)變量,存儲也是分布的*/ char message100;/*消息buffer,存儲也是分布的*/ /*初始化MPI*/MPI_Init(&argc, &argv); /*該函數(shù)被各進程各調(diào)用一次,得到自己的進程rank值*/MPI_Comm_rank(MPI_COMM_WORLD, &myid);/*該函數(shù)被各進程各調(diào)用一次,得到進程數(shù)*/MPI_Comm_size(MPI_COMM_WORLD, &numprocs);七月 2240/55分析greetingsif (myid != 0) /*建立消息*/ sprintf(
29、message, Greetings from process %d!,myid); /* 發(fā)送長度取strlen(message)+1,使0也一同發(fā)送出去*/ MPI_Send(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,&status); printf(“%sn, mes
30、sage); /*關閉MPI,標志并行代碼段的結(jié)束*/ MPI_Finalize(); /* End main */七月 2241/55Greetings執(zhí)行過程 假設進程數(shù)為3 (進程0) (進程1) (進程2) (rank=0) (rank=1) (rank=2).Recv();.Recv();.Send();.Send().問題:進程1和2誰先開始發(fā)送消息?誰先完成發(fā)送??%七月 2242/55運行g(shù)reetingsdairnode01 $ mpicc o greeting greeting.cdairnode01 $ mpirun -np 4 greeting Greetings fr
31、om process 1! Greetings from process 2! Greetings from process 3!dairnode01 $ 計算機打印字符我們輸入的命令七月 2243/55最基本的MPIMPI調(diào)用借口的總數(shù)雖然龐大,但根據(jù)實際編寫MPI的經(jīng)驗,常用的MPI調(diào)用的個數(shù)非常有限。上面介紹的是6個最基本的MPI函數(shù)。MPI_Init();MPI_Comm_size();MPI_Comm_rank();MPI_Send();MPI_Recv();MPI_Finalize();MPI_Init();并行代碼;MPI_Fainalize();只能有串行代碼;七月 2244/
32、55現(xiàn)在您已經(jīng)能夠用MPI進行并行編程了!七月 2245/55實例分析:求PI七月 2246/55串行代碼h=1.0/(double)n;sum=0.0;for (i=1; i=n; i+) x=h*(double)i 0.5);sum += f(x);pi=h*sum;double f(double a)return (4.0/(1.0+a*a);七月 2247/55并行代碼h=1.0/(double)n;sum=0.0;for (i=myid+1; i=n; i+=numprocs) x=h*(double)i 0.5);sum += f(x);mypi=h*sum; MPI_Reduce(&mypi, &pi, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD);double f(double a)return (4.0/(1.0+a*a);七月 2248/55cpi.c#include mpi.h#include #include double f( double );double
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 現(xiàn)代企業(yè)如何通過公關活動吸引目標客戶
- 理論與實踐在文化傳承中尋求創(chuàng)新發(fā)展
- 國慶節(jié)鮮奶活動方案策劃
- Module5 Unit1 He is playing the suona,but the phone rings(說課稿)-2023-2024學年外研版(三起)英語六年級下冊
- 8《上課了》說課稿-2023-2024學年道德與法治一年級上冊統(tǒng)編版001
- 2023九年級數(shù)學上冊 第23章 圖形的相似23.4 中位線說課稿 (新版)華東師大版
- 9 知法守法 依法維權(quán) 說課稿 -2023-2024學年道德與法治六年級上冊(統(tǒng)編版)
- 2024年四年級英語上冊 Module 4 The world around us Unit 11 Shapes說課稿 牛津滬教版(三起)
- Unit8 I can do this for you 第三課時(說課稿)-2024-2025學年譯林版(三起)(2024)英語三年級上冊
- 3 光的傳播會遇到阻礙嗎 說課稿-2024-2025學年科學五年級上冊教科版
- 城市基礎設施修繕工程的重點與應對措施
- GB 12710-2024焦化安全規(guī)范
- 2022年中考化學模擬卷1(南京專用)
- 【??途W(wǎng)】2024秋季校園招聘白皮書
- 2024-2025銀行對公業(yè)務場景金融創(chuàng)新報告
- 新加坡小學二年級英語試卷practice 2
- 小學五年級英語20篇英文閱讀理解(答案附在最后)
- 2023年遼寧鐵道職業(yè)技術(shù)學院高職單招(英語)試題庫含答案解析
- GB/T 23800-2009有機熱載體熱穩(wěn)定性測定法
- T-SFSF 000012-2021 食品生產(chǎn)企業(yè)有害生物風險管理指南
- 水庫工程施工組織設計
評論
0/150
提交評論