并行計算簡介_第1頁
并行計算簡介_第2頁
并行計算簡介_第3頁
并行計算簡介_第4頁
并行計算簡介_第5頁
已閱讀5頁,還剩144頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、并行計算簡介高性能事業(yè)部:曹振南 2004.42004年4月1講座主要內(nèi)容提示并行計算簡介編譯環(huán)境數(shù)學(xué)庫并行計算機體系結(jié)構(gòu)并行軟件環(huán)境并行計算機性能評測MPI 、PVM、OpenMP2004年4月2并行計算-高性能計算并行計算(Parallel Computing) 高端計算(High-end Parallel Computing) 高性能計算(High Performance Computing) 超級計算(Super Computing)任何高性能計算和超級計算都離不開使用并行技術(shù)計算科學(xué)與傳統(tǒng)的兩種科學(xué),即理論科學(xué)和實驗科學(xué),并立被認為是人類認識自然的三大支柱,他們彼此相輔相成地推動科學(xué)

2、發(fā)展與社會進步。在許多情況下,或者是理論模型復(fù)雜甚至理論尚未建立,或者實驗費用昂貴甚至無法進行時,計算就成了求解問題的唯一或主要的手段。2004年4月3并行:古老的思想!“.并行計算并不是什么新的思想,只是將它擴展應(yīng)用于計算機而已”. 作者也不認為這種擴展應(yīng)用會存在什么無法克服的困難. 但也不要期待有效的并行編程方法與技術(shù)能夠在一夜之間誕生. 期間還需要有許多的工作和實驗要做. 畢竟, 今天的編程技術(shù)(串行)是若干年來艱苦的探索才取得的. 現(xiàn)在編程工作似乎成了一種令人單調(diào)乏味的工作,事實上,并行編程的出現(xiàn)將會使重新恢復(fù)編程工作者們的探索精神 .” (Gill, S. (1958), “Para

3、llel Programming” The Computer Journal, vol. 1, April, pp. 2-10.)Parallel Programming with MPIby Peter Pacheco(2000)2004年4月4什么是并行計算?并行計算: 由運行在多個部件上的小任務(wù)合作來求解一個規(guī)模很大的計算問題的一種方法例: 在曙光2000上用8個節(jié)點計算的Mandelbrot集結(jié)果(Mandelbrot為分形理論創(chuàng)始人)2004年4月5現(xiàn)代計算機的共同特點: 并行性2004年4月6現(xiàn)代計算機的共同特點: 并行性2004年4月7為什么要做并行計算? 應(yīng)用需求2004年4月

4、8為什么要做并行計算?人類對計算及性能的要求是無止境的從系統(tǒng)的角度:集成系統(tǒng)資源,以滿足不斷增長的對性能和功能的要求從應(yīng)用的角度:適當(dāng)分解應(yīng)用,以實現(xiàn)更大規(guī)?;蚋氈碌挠嬎?004年4月9為什么要做并行計算?問題: 科學(xué)和工程問題的數(shù)值模擬與仿真計算密集數(shù)據(jù)密集網(wǎng)絡(luò)密集三種混合要求:在合理的時限內(nèi)完成計算任務(wù)秒級制造業(yè)分鐘級短時天氣預(yù)報(當(dāng)天)小時級中期天氣預(yù)報(310日)盡可能快長期天氣預(yù)報(氣候)可計算湍流模擬2004年4月102004年4月11并行計算的功能降低單個問題求解的時間增加問題求解規(guī)模、提高問題求解精度(多機同時執(zhí)行多個串行程序)容錯、更高的可用性、提高吞吐率2004年4月12

5、如何實現(xiàn)并行計算?分而治之!2004年4月13分而治之并行化的主要方法:分而治之根據(jù)問題的求解過程,把任務(wù)分成若干子任務(wù)(任務(wù)級并行或功能并行)根據(jù)處理數(shù)據(jù)的方式,形成多個相對獨立的數(shù)據(jù)區(qū),由不同的處理器分別處理(數(shù)據(jù)并行)2004年4月14講座主要內(nèi)容提示并行計算簡介編譯環(huán)境常用編譯器編譯優(yōu)化如何編譯數(shù)學(xué)庫并行計算機體系結(jié)構(gòu)并行軟件環(huán)境并行計算機性能評測MPI 、PVM、OpenMP2004年4月15GNU CompilerGNU Compiler自由軟件,一般操作系統(tǒng)都自帶支持C/C+、Fortran77、Java、COBAL等等許多語言支持大部分硬件平臺高性能計算中常用的:C/C+:GC

6、C (GNU C/C+ Compiler)Fortran 77:G77不支持Fortran 90/ 95不支持OpenMP是最常用的編譯器,性能一般(相對于一些針對特定平臺優(yōu)化的編譯器)由于缺少對Fortran 90/ 95,限制了其在高性能計算中的使用2004年4月16PGI CompilerPGI Compiler由Portland公司開發(fā)的編譯器支持AMD Opteron/Althon處理器、Intel Xeon處理器等,在Opteron上同時支持32-bit和64-bit()支持Linux、Windows支持C/C+(pgcc)、Fortran77(pgf77)、Fortran90/9

7、5(pgf90)、HPF(High Performance Fortran)支持多線程和OpenMP最新版本:5.1需要購買,但可以從網(wǎng)上得到15天試用版本 http:/ 2004年4月17Intel CompilerIntel Compiler由Intel公司針對Intel處理器開發(fā)(Xeon、Pentium)支持Linux、Windows支持C/C+(icc:Intel C/C+ Compiler)、Fortran77/90/95(ifc: Intel Fortran Compiler)支持多線程和OpenMP最新版本:8.0需要購買,但可以從網(wǎng)上得到30天試用版本 /software 2

8、004年4月18編譯優(yōu)化編譯優(yōu)化對于計算密集型程序的性能提高非常幫助優(yōu)化消耗CPU資源最多的那部分,即計算密集部分一般采用-O2、-O3可以采用SIMD指令集,eg: Intel和AMD處理器的MMX、SSE1、SSE2具體編譯優(yōu)化的選項和編譯器以及CPU相關(guān),參見編譯器手冊對于有些應(yīng)用程序,過分的優(yōu)化會導(dǎo)致計算結(jié)果錯誤2004年4月19編譯優(yōu)化在雙路Intel Xeon平臺上,采用SSE2優(yōu)化和不采用SSE2優(yōu)化,所獲得的HPL性能。在這種情況下,采用SSE2技術(shù)得到的性能高出近90 2004年4月20編譯簡介在Linux系統(tǒng)中,可執(zhí)行文件沒有統(tǒng)一的后綴,系統(tǒng)從文件的屬性來區(qū)分可執(zhí)行文件和不

9、可執(zhí)行文件大部分編譯器通過后綴來區(qū)別輸入文件的類別,下面來介紹常用的一些后綴.c:C語言源代碼文件.f:Fortran 77語言源代碼文件.o:編譯后的目標(biāo)文件.a:由目標(biāo)文件構(gòu)成的檔案庫文件.C、.cc、.cxx:C+源代碼文件.f90:Fortran 90語言源代碼文件.h:程序所包含的頭文件2004年4月21基本的用法cc/f77/f90 options filenames 編譯器名 編譯參數(shù) 編譯文件其中options就是編譯器所需要的參數(shù),filenames給出相關(guān)的文件名稱2004年4月22常用編譯參數(shù)-c:只編譯,不連接成為可執(zhí)行文件,編譯器只是由輸入的.c/.f等源代碼文件生成

10、.o為后綴的目標(biāo)文件,通常用于編譯不包含主程序的子程序文件。-o output_filename:確定輸出文件的名稱為output_filename,同時這個名稱不能和源文件同名。如果不給出這個選項,就給出預(yù)設(shè)的可執(zhí)行文件a.out-g:產(chǎn)生符號調(diào)試工具所必要的符號資訊,要想對源代碼進行調(diào)試,我們就必須加入這個選項。-O:對程序進行優(yōu)化編譯、連接,采用這個選項,整個源代碼會在編譯、連接過程中進行優(yōu)化處理,這樣產(chǎn)生的可執(zhí)行文件的執(zhí)行效率可以提高,但是,編譯、連接的速度就相應(yīng)地要慢一些。-O2、-O3、-O4:比-O更好的優(yōu)化編譯、連接,當(dāng)然整個編譯、連接過程會更慢。(具體和編譯器相關(guān))2004年

11、4月23常用編譯參數(shù)-Idirname:將dirname所指出的目錄加入到程序頭文件目錄列表中,是在預(yù)編譯過程中使用的參數(shù)。C程序中的頭文件包含兩種情況:A)#include B)#include “myinc.h” 其中,A類使用尖括號(),B類使用雙引號(“ ”)。對于A類,預(yù)處理程序cpp在系統(tǒng)預(yù)設(shè)包含文件目錄(如/usr/include)中搜尋相應(yīng)的文件,而對于B類,cpp在當(dāng)前目錄中搜尋頭文件,這個選項的作用是告訴cpp,如果在當(dāng)前目錄中沒有找到需要的文件,就到指定的dirname目錄中去尋找。在程序設(shè)計中,如果我們需要的這種包含文件分別分布在不同的目錄中,就需要逐個使用-I選項給出

12、搜索路徑。2004年4月24常用編譯參數(shù)-Ldirname:將dirname所指出的目錄加入到程序函數(shù)檔案庫文件的目錄列表中,是在連接過程中使用的參數(shù)。在預(yù)設(shè)狀態(tài)下,連接程序ld在系統(tǒng)的預(yù)設(shè)路徑中(如/usr/lib)尋找所需要的檔案庫文件,這個選項告訴連接程序,首先到-L指定的目錄中去尋找,然后到系統(tǒng)預(yù)設(shè)路徑中尋找,如果函數(shù)庫存放在多個目錄下,就需要依次使用這個選項,給出相應(yīng)的存放目錄。-lname:在連接時,裝載名字為“l(fā)ibname.a”的函數(shù)庫,該函數(shù)庫位于系統(tǒng)預(yù)設(shè)的目錄或者由-L選項確定的目錄下。例如,-lm表示連接名為“l(fā)ibm.a”的數(shù)學(xué)函數(shù)庫。 上面我們簡要介紹了編譯器最常用的

13、功能和主要參數(shù)選項,更為詳盡的資料可以參看Linux系統(tǒng)的聯(lián)機幫助。2004年4月25GCC應(yīng)用舉例1.gcc hello.c生成a.out2. gcc o hello helo.c生成hello3. gcc O o hello hello.c 生成hello4. gcc O2 o hello hello.c 生成hello5. gcc c hello.c生成hello.o gcc o hello hello.o生成hello6. gcc c hello1.c生成hello1.o gcc c hello2.c生成hello2.o gcc o hello hello1.o hello2.o 生成

14、hello7. gcc o test test1.o lm I/home/czn/include2004年4月26Make簡介在開發(fā)大系統(tǒng)時,經(jīng)常要將程序劃分為許多模塊。各個模塊之間存在著各種各樣的依賴關(guān)系,在Linux中通常使用 Makefile來管理由于各個模塊間不可避免存在關(guān)聯(lián),所以當(dāng)一個模塊改動后,其他模塊也許會有所更新,當(dāng)然對小系統(tǒng)來說,手工編譯連接是沒問題,但是如果是一個大系統(tǒng),存在很多個模塊,那么手工編譯的方法就不適用了。為此,在Linux系統(tǒng)中,專門提供了一個make命令來自動維護目標(biāo)文件。與手工編譯和連接相比,make命令的優(yōu)點在于他只更新修改過的文件,而對沒修改的文件則置之

15、不理,并且make命令不會漏掉一個需要更新的文件2004年4月27一個簡單的例子先舉一個例子: a.c b.c兩個程序a.c extern void p(char *); main() p(hello world); b.c void p(char *str) printf(%sn,str); Makefile hello: a.c b.c gcc a.c b.c -o hello 注意這里是一個Tab 執(zhí)行makegcc a.c b.c -o hello 產(chǎn)生一個叫hello的可執(zhí)行程序2004年4月28書寫makefile文件Makefile時由規(guī)則來組成的,每一條規(guī)則都有三部分組成:目標(biāo)

16、(object),依賴(dependency)和命令(command).在上面的例子中, Makefile只有一條規(guī)則,其目標(biāo)為hello,期依賴為a.c b.c,其命令為gcc a.c b.c -o hello依賴可以是另一條規(guī)則的目標(biāo),也可以是文件.每一條規(guī)則被這樣處理.如目標(biāo)是一個文件是:當(dāng)它的依賴是文件時,如果依賴的時間比目標(biāo)要新, 則運行規(guī)則所包含的命令來更新目標(biāo); 如果依賴是另一個目標(biāo)則用同樣的方法先來處理這個目標(biāo).如目標(biāo)不是一個存在的文件時,則一定執(zhí)行.2004年4月29一個簡單的makefile文件例如: Makefile hello: a.o b.o gcc a.o b.o

17、-o hello a.o: a.c gcc c a.c b.o: b.c gcc c b.c當(dāng)運行make時,可以接一目標(biāo)名(eg:make hello)作為參數(shù),表示要處理改目標(biāo)。如沒有參數(shù),則處理第一個目標(biāo)。對上述例子執(zhí)行make,則是處理hello這個目標(biāo)。hello依賴于文件目標(biāo)a.o和b.o,則先去處理a.o,調(diào)用gcc c a.c來更新a.o,之后更新b.o,最后調(diào)用gcc a.c b.o -o hello 來更新hello2004年4月30Make中的宏(macro)在make中是用宏,要先定義,然后在makefile中引用。宏的定義格式為: 宏名 = 宏的值 (宏名一般習(xí)慣用大

18、寫字母)例: CC = gcc hello: a.o b.o $(CC) a.o b.o -o hello a.o: a.c $(CC) c a.c b.o: b.c $(CC) c b.c2004年4月31系統(tǒng)定義的宏還有一些設(shè)定好的內(nèi)部變量,它們根據(jù)每一個規(guī)則內(nèi)容定義。$ 當(dāng)前規(guī)則的目的文件名$ 依靠列表中的第一個依靠文件$ 整個依靠的列表(除掉了里面所有重復(fù)的文件名)。$? 依賴中所有新于目標(biāo)的以用變量做許多其它的事情,特別是當(dāng)你把它們和函數(shù)混合 使用的時候。如果需要更進一步的了解,請參考 GNU Make 手冊。 (man make, man makefile)2004年4月32修改原

19、先的makefile CC = gcc CFLAGS = -O2 OBJS = a.o b.o hello: $(OBJS)$(CC) $ -o $ a.o: a.c$(CC) $(CFLAGS) -c $ b.o: b.c $(CC) $(CFLAGS) -c $ clean:rm f *.o hello2004年4月33隱含規(guī)則請注意在上面的例子里,幾個產(chǎn)生.o文件的命令都是一樣的,都是從.c文件和相關(guān)文件里產(chǎn)生.o文件,這是一個標(biāo)準(zhǔn)的步驟。其實make已經(jīng)知道怎么做它有一些叫做隱含規(guī)則的內(nèi)置的規(guī)則,這些規(guī)則告訴它當(dāng)你沒有給出某些命令的時候,應(yīng)該怎么辦。如果你把生成a.o和b.o的命令從它

20、們的規(guī)則中刪除,make將會查找它的隱含規(guī)則,然后會找到一個適當(dāng)?shù)拿?。它的命令會使用一些變量,因此你可以按照你的想法來設(shè)定它:它使用變量CC做為編譯器,并且傳遞變量CFLAGS,CPPFLAGS,TARGET_ARCH,然后它加入 -c ,后面跟變量$,然后是 -o跟變量$。一個編譯的具體命令將會是: $(CC) $(CFLAGS) $(CPPFLAGS) $(TARGET_ARCH) -c $1/f實際上并行加速不僅受限于程序串行分量,還受并行程序運行時的額外開銷影響 s1/(f+Wo/W)Gustafson定律:適用于可擴放問題很多大型計算,精度要求很高,而計算時間固定不變?yōu)樘岣呔?,?/p>

21、須加大計算量,相應(yīng)的必須增加處理器數(shù)S=(Ws+pWp)/(WsWp)=f+p(1-f)=p+f(1-p)=p-f(p-1)Sun和Ni定律:受限于存儲器只要存儲空間許可,應(yīng)盡量增大問題規(guī)模以產(chǎn)生更好、更精確的解S=(f+(1-f)G(p)/(f+(1-f)G(p)/p) G(p)=1 :Amdahl; G(p)=p,Gustafson2004年4月101可擴放性可擴放性(Scalability): 確定的應(yīng)用背景下,計算系統(tǒng)(或算法或編程等)的性能隨著處理器的數(shù)目的增加而按比例的提高的能力可擴放性時算法和結(jié)構(gòu)的組合,研究可擴放性時,總是將并行算法和體系結(jié)構(gòu)一并考慮算法的可擴放性: 該算法針對

22、某一特定機器的可擴放性體系結(jié)構(gòu)的可擴放性: 該體系結(jié)構(gòu)的機器的某一并行算法的可擴放性一般情況下,增加處理器數(shù),會增加額外開銷和降低處理器利用率;所以對于一個特定的并行系統(tǒng)、并行算法或并行程序,它們能否有效的利用不斷增加的處理器的能力應(yīng)是受限的研究可擴放性的目的確定某類問題用哪種并行算法與哪種并行體系結(jié)構(gòu)結(jié)合,可以有效地利用大量處理器運行于某種體系結(jié)構(gòu)的并行機上的某種算法,根據(jù)在小規(guī)模機器上的運行性能,預(yù)測在大規(guī)模機器上的性能對固定的問題規(guī)模,確定最有的處理機數(shù)和加速比指導(dǎo)改進算法、體系結(jié)構(gòu),以利用可擴充的大量處理器2004年4月102可擴放性評測標(biāo)準(zhǔn)等效率度量標(biāo)準(zhǔn): 若問題規(guī)模w不變,隨著處理

23、器數(shù)P的增加會導(dǎo)致開銷To隨之增加,效率E下降。為了保持E不變,則在增加p的同時相應(yīng)的增加問題規(guī)模W,以抵消由于p增加而導(dǎo)致的To的增加,從而保持效率不變隨著系統(tǒng)規(guī)模的增加(處理器數(shù)目的增加) ,測量增加多少運算量會保持效率不變增加越少表明可擴放性越好E1/(1+To/W) To: 額外開銷時間之和曲線1表示的算法具有很好的可擴放性,曲線2次之,曲線3最差2004年4月103可擴放性評測標(biāo)準(zhǔn)等速度度量標(biāo)準(zhǔn)系統(tǒng)規(guī)模增加時,若保持平均速度(每個處理器的速度)不變,每個處理器增加浮點操作的量速度常以每秒多少次浮點運算(Flops)來表示等計算時間/通信開銷比率度量標(biāo)準(zhǔn)系統(tǒng)規(guī)模增加時,保持計/通比不變

24、所需要增加的問題規(guī)模計算時間/通信開銷比率并行計算時間與系統(tǒng)開銷之比2004年4月104講座主要內(nèi)容提示并行計算簡介編譯環(huán)境數(shù)學(xué)庫并行計算機體系結(jié)構(gòu)并行軟件環(huán)境并行計算機性能評測MPI、PVM、OpenMP2004年4月105消息傳遞并行程序設(shè)計消息傳遞并行程序設(shè)計指用戶必須通過顯式地發(fā)送和接收消息來實現(xiàn)處理機間的數(shù)據(jù)交換。在這種并行編程中,每個并行進程均有自己獨立的地址空間,相互之間訪問不能直接進行,必須通過顯式的消息傳遞來實現(xiàn)。這種編程方式是大規(guī)模并行處理機(MPP)和機群(Cluster)采用的主要編程方式。并行計算粒度大,特別適合于大規(guī)??蓴U展并行算法由于消息傳遞程序設(shè)計要求用戶很好地

25、分解問題,組織不同進程間的數(shù)據(jù)交換,并行計算粒度大,特別適合于大規(guī)??蓴U展并行算法.消息傳遞是當(dāng)前并行計算領(lǐng)域的一個非常重要的并行程序設(shè)計方式2004年4月106什么是MPI?Massage Passing Interface:是消息傳遞函數(shù)庫的標(biāo)準(zhǔn)規(guī)范,由MPI論壇開發(fā),支持Fortran和C一種新的庫描述,不是一種語言。共有上百個函數(shù)調(diào)用接口,在Fortran和C語言中可以直接對這些函數(shù)進行調(diào)用MPI是一種標(biāo)準(zhǔn)或規(guī)范的代表,而不是特指某一個對它的具體實現(xiàn)MPI是一種消息傳遞編程模型,并成為這種編程模型的代表和事實上的標(biāo)準(zhǔn)2004年4月107MPI的發(fā)展過程發(fā)展的兩個階段MPI 1.1: 1

26、995MPICH:是MPI最流行的非專利實現(xiàn),由Argonne國家實驗室和密西西比州立大學(xué)聯(lián)合開發(fā),具有更好的可移植性.MPI 1.22.0:動態(tài)進程, 并行 I/O, 支持F90和C+(1997).2004年4月108為什么要用MPI?高可移植性MPI已在IBM PC機上、MS Windows上、所有主要的Unix工作站上和所有主流的并行機上得到實現(xiàn)。使用MPI作消息傳遞的C或Fortran并行程序可不加改變地運行在IBM PC、MS Windows、Unix工作站、以及各種并行機上。2004年4月109從簡單入手!下面我們首先分別以C語言和Fortran語言的形式給出一個最簡單的MPI并行

27、程序Hello (下頁).該程序在終端打印出Hello World!字樣.“Hello World”:一聲來自新生兒的問候. 2004年4月110Hello world(C)#include #include mpi.h“main( int argc, char *argv ) MPI_Init( &argc, &argv ); printf( Hello, world!n ); MPI_Finalize();2004年4月111Hello world(Fortran)program maininclude mpif.hinteger ierrcall MPI_INIT( ierr )prin

28、t *, Hello, world!call MPI_FINALIZE( ierr )end2004年4月112C和Fortran中MPI函數(shù)約定C必須包含mpi.h.MPI 函數(shù)返回出錯代碼或 MPI_SUCCESS成功標(biāo)志.MPI-前綴,且只有MPI以及MPI_標(biāo)志后的第一個字母大寫,其余小寫.Fortran必須包含mpif.h.通過子函數(shù)形式調(diào)用MPI,函數(shù)最后一個參數(shù)為返回值.MPI-前綴,且函數(shù)名全部為大寫.MPI函數(shù)的參數(shù)被標(biāo)志為以下三種類型:IN:參數(shù)在例程的調(diào)用中不會被修正.OUT:參數(shù)在例程的調(diào)用中可能會被修正.INOUT:參數(shù)在一些例程中為IN,而在另一些例程中為OUT.2

29、004年4月113MPI初始化-MPI_INITint MPI_Init(int *argc, char *argv)MPI_INIT(IERROR)MPI_INIT是MPI程序的第一個調(diào)用,它完成MPI程序的所有初始化工作。所有的MPI程序的第一條可執(zhí)行語句都是這條語句。啟動MPI環(huán)境,標(biāo)志并行代碼的開始.并行代碼之前,第一個mpi函數(shù)(除MPI_Initialize()外).要求main必須帶參數(shù)運行,否則出錯.2004年4月114MPI結(jié)束-MPI_FINALIZEint MPI_Finalize(void)MPI_FINALIZE(IERROR)MPI_FINALIZE是MPI程序的最

30、后一個調(diào)用,它結(jié)束MPI程序的運行,它是MPI程序的最后一條可執(zhí)行語句,否則程序的運行結(jié)果是不可預(yù)知的。標(biāo)志并行代碼的結(jié)束,結(jié)束除主進程外其它進程.之后串行代碼仍可在主進程(rank = 0)上運行(如果必須)2004年4月115MPI程序的的編譯與運行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 / hel

31、lo 要運行的MPI并行程序.%小寫onp:The number of process.2004年4月116:運行我們的MPI程序!server0czn17: mpicc -o hello hello.cserver0czn18: ./hello () 0 Aborting program ! Could not create p4 procgroup. Possible missing fileor program started without mpirun.server0czn19: mpirun -np 4 hello () Hello World! Hello World! Hell

32、o World! Hello World!server0czn20:計算機打印字符我們輸入的命令2004年4月117:Hello是如何被執(zhí)行的?SPMD: Single Program Multiple Data(MIMD) :#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

33、, &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 argc, char *argv ) MPI_Init( &argc, &argv ); printf( Hello, world!n ); MPI_Finalize();Hello Worl

34、d!Hello World!Hello World!Hello World!#include mpi.h#include main( int argc, char *argv ) MPI_Init( &argc, &argv ); printf( Hello, world!n ); MPI_Finalize();2004年4月118:開始寫MPI并行程序在寫MPI程序時,我們常需要知道以下兩個問題的答案:任務(wù)由多少個進程來進行并行計算?我是哪一個進程? 2004年4月119:開始寫MPI并行程序MPI 提供了下列函數(shù)來回答這些問題:用MPI_Comm_size 獲得進程個數(shù) p int MPI

35、_Comm_size(MPI_Comm comm, int *size);用MPI_Comm_rank 獲得進程的一個叫rank的值,該 rank值為0到p-1間的整數(shù),相當(dāng)于進程的IDint MPI_Comm_rank(MPI_Comm comm, int *rank);2004年4月120更新的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 )

36、; MPI_Comm_size( MPI_COMM_WORLD, &numprocs ); printf(“I am %d of %dn, myid, numprocs ); MPI_Finalize();2004年4月121更新的Hello World(Fortran)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, numpr

37、ocs, ierr )print *, I am, myid, of, numprocscall MPI_FINALIZE( ierr )end2004年4月122:運行結(jié)果server0czn22: mpicc o hello1 hello1.cserver0czn23: mpirun -np 4 hello1I am 0 of 4I am 1 of 4I am 2 of 4I am 3 of 4server0czn24:計算機打印字符我們輸入的命令2004年4月123有消息傳遞 greetings(c)#include #include mpi.hmain(int argc, char*

38、argv) int numprocs, myid, source; MPI_Status status; char message100; MPI_Init(&argc, &argv); MPI_Comm_rank(MPI_COMM_WORLD, &myid); MPI_Comm_size(MPI_COMM_WORLD, &numprocs);2004年4月124有消息傳遞 greetings(c) if (myid != 0) strcpy(message, Hello World!); MPI_Send(message,strlen(message)+1, MPI_CHAR, 0,99,

39、MPI_COMM_WORLD); else /* myid = 0 */ for (source = 1; source numprocs; source+) MPI_Recv(message, 100, MPI_CHAR, source, 99, MPI_COMM_WORLD, &status); printf(%sn, message); MPI_Finalize(); /* end main */2004年4月125Greeting執(zhí)行過程2004年4月126解剖greetings程序頭文件: mpi.h/ MPI_Init(int *argc, char *argv

40、) 啟動MPI環(huán)境,標(biāo)志并行代碼的開始.并行代碼之前,第一個mpi函數(shù)(除MPI_Initialize()外).要求main必須帶能運行,否則出錯.通信子(通信空間): MPI_COMM_WORLD:一個通信空間是一個進程組和一個上下文的組合.上下文可看作為組的超級標(biāo)簽,用于區(qū)分不同的通信子.在執(zhí)行函數(shù)MPI_Init之后,一個MPI程序的所有進程形成一個缺省的組,這個組的通信子即被寫作MPI_COMM_WORLD.該參數(shù)是MPI通信操作函數(shù)中必不可少的參數(shù),用于限定參加通信的進程的范圍.2004年4月127解剖greetings程序int MPI_Comm_size ( MPI_Comm c

41、omm, int *size )獲得通信空間comm中規(guī)定的組包含的進程的數(shù)量.指定一個communicator,也指定了一組共享該空間的進程, 這些進程組成該communicator的 MPI_Comm_rank ( MPI_Comm comm, int *rank ) 得到本進程在通信空間中的rank值,即在組中的邏輯編號(從0開始).int MPI_Finalize() 標(biāo)志并行代碼的結(jié)束,結(jié)束除主進程外其它進程.之后串行代碼仍可在主進程(rank = 0)上運行(如果必須).2004年4月128消息傳送(先可不關(guān)心參數(shù)含義)MPI_Send(A, 10, MPI_DO

42、UBLE, 1,99, MPI_COMM_WORLD);MPI_Recv(B, 20, MPI_DOBULE, 0, 99, MPI_COMM_WORLD, &status);數(shù)據(jù)傳送 + 同步操作需要發(fā)送方與接收方合作完成.DataProcess 0Process 1發(fā)送請求YesDataDataDataDataDataDataDataDataTime2004年4月129MPI程序的編譯mpicc編譯并連接用C語言編寫的MPI程序mpiCC編譯并連接用C+編寫的MPI程序mpif77編譯并連接用FORTRAN 77編寫的MPI程序mpif90編譯并連接用Fortran 90編寫的MPI程序這

43、些命令可以自動提供MPI需要的庫,并提供特定的開關(guān)選項(用-help查看)2004年4月130MPI程序的編譯用mpicc編譯時,就像用一般的C編譯器一樣。還可以使用一般的C的編譯選項,含義和原來的編譯器相同例如:./mpicc -c foo.c./mpicc -o foo foo.o2004年4月131MPI程序的運行MPI程序的執(zhí)行步驟一般為:編譯以得到MPI可執(zhí)行程序(若在同構(gòu)的系統(tǒng)上,只需編譯一次;若系統(tǒng)異構(gòu),則要在每一個異構(gòu)系統(tǒng)上都對MPI源程序進行編譯)將可執(zhí)行程序拷貝到各個節(jié)點機上通過mpirun命令并行執(zhí)行MPI程序2004年4月132最簡單的MPI運行命令mpirun np

44、N 其中:N: 同時運行的進程數(shù): 可執(zhí)行MPI程序名例如:mpirun np 6 cpimpirun np 4 hello2004年4月133一種靈活的執(zhí)行方式mpirun p4pg 為配置文件,其格式為: 例如: (注:第一行的0并不表示在node0上沒有進程,這里的0特指在node0上啟動MPI程序)node0 0 /public0/czn/mpi/cpinode1 1 /public0/czn/mpi/cpinode2 1 /public0/czn/mpi/cpi這種方式允許可執(zhí)行程序由不同的名字和不同的路徑2004年4月134完整的MPI運行方式MPI程序的一般啟動方式:mpirun

45、 np 完整的MPI運行方式:mpirun mpirun_options options詳細參數(shù)信息執(zhí)行mpirun -help2004年4月135曙光4000L: MPI-BCLMPI-BCL:為曙光4000l優(yōu)化的MPI通信庫,和基于TCP/IP的網(wǎng)絡(luò)版MPICH1.2 (三層結(jié)構(gòu))APIADI:Abstract Device Interface各種不同的底層通信庫的不同接口的統(tǒng)一標(biāo)準(zhǔn)(相當(dāng)于某一種底層通信庫)MPI-BCL:MPI-Basic Communication Library具體的底層通信庫Point to pointCollective移植:根據(jù)不同的device(即平臺或底

46、層通信)實現(xiàn)不同的ADI接口2004年4月136曙光4000L: runrun -h|help|-? -sz |-sz -pn -np -pl -cpu program -h|help|-? 得到run的幫助信息,需要幫助時用-sz 指定物理節(jié)點數(shù),默認與np數(shù)相等,可忽略,run sz 4 np 8 a.out 表示在4個物理節(jié)點上運行a.out的8個進程-sz 指定物理節(jié)點的長和寬,選定mesh結(jié)構(gòu),run sz 4X4 a.out表示在一個4*4的mesh結(jié)構(gòu)上組織通信-np 指定進程數(shù)-on 指定物理節(jié)點列表run on node0.3 a.out 表示在節(jié)點0,1,2,3上運行a.o

47、ut-pl 指定節(jié)點池名p1,p2,默認為p1/(0-15)-cpu 載入要執(zhí)行程序的cpu模式 ep獨占通訊端口,-en獨占節(jié)點program 要執(zhí)行程序名以及其參數(shù)常用形式:run np 4 a.out2004年4月137PVM(Parallel Virtual Machine)開發(fā)時間: 始于1989年開發(fā)單位: 美國橡樹嶺(Oak Ridge)國家實驗室、美國Tennessee大學(xué)和Emory大學(xué)聯(lián)合研制特點: 具有較好的適應(yīng)性、可擴展性、可移植性和易使用性等特點, 源代碼可以免費獲取, 現(xiàn)已被用戶廣泛采納。現(xiàn)狀: 目前對它的研究和開發(fā)工作仍在各大學(xué)和研究機構(gòu)進行. 隨著它的不斷流行,

48、 已經(jīng)被移植到PVP、SMP、MPP、工作站和機群系統(tǒng)。PVM出現(xiàn)的時間較MPI早,且是一個自包含系統(tǒng)(MPI不是自包含的),同時PVM不是一個標(biāo)準(zhǔn)(MPI是個標(biāo)準(zhǔn))。目前,PVM和MPI正在互相靠攏。2004年4月138PVM概貌PVM系統(tǒng)的組成(兩部分):PVM監(jiān)控進程(Daemon Process), 稱為pvmd, 它常駐在虛擬機的每一臺節(jié)點機上。PVM可調(diào)用的庫, 稱為libpvm3.a, 它與用戶的應(yīng)用程序鏈接, 用于進程管理, 消息傳遞和虛擬機管理。在PVM中, 節(jié)點(a node)稱為主機(a host). 進程(aprocess)稱為任務(wù)(a task). 并行虛擬機的組成1

49、多臺主機(硬件)唯一1個master pvmd, 運行在稱為控制臺的主機上0多個slave pvmd2004年4月139共享存儲并行機模型體系結(jié)構(gòu)特點:多臺處理機通過互聯(lián)網(wǎng)絡(luò)共享一個統(tǒng)一的內(nèi)存空間,通過單一內(nèi)存地址來實現(xiàn)處理機間的協(xié)調(diào).內(nèi)存空間也可由多個存儲器模塊構(gòu)成.每臺處理機可以執(zhí)行相同或不同的指令流,每臺處理機可以直接訪問到所有數(shù)據(jù).處理機間通信是借助于共享主存來實現(xiàn)的.可擴展性差,當(dāng)處理機需要同時訪問共享全局變量時,產(chǎn)生內(nèi)存競爭現(xiàn)象而嚴(yán)重影響效率,比較適合中小規(guī)模應(yīng)用問題的計算和事務(wù)處理.2004年4月140共享存儲編程標(biāo)準(zhǔn)與特點共享存儲器編程標(biāo)準(zhǔn)Pthreads(線程標(biāo)準(zhǔn)) X3H5

50、(線程標(biāo)準(zhǔn))OpenMP(最常用的共享存儲并行編程方式,是我們討論的重點.)共享存儲器編程特點顯式多線程庫調(diào)用.(Pthreads).編譯制導(dǎo)語句,OpenMP等.語言C,Fortran77,Fortran90/95,C+2004年4月141與X3H5的關(guān)系X3H5是ANSI/X3授權(quán)的小組委員會,主要目的是在PCF(the Parallel Computing Forum)工作的基礎(chǔ)上,發(fā)展并行計算的一個ANSI標(biāo)準(zhǔn). PCF是一非正式的工業(yè)組織,雖在DO循環(huán)的并行化方法的標(biāo)準(zhǔn)化方面做一些工作,但在起草擬了一個標(biāo)準(zhǔn)后就草草收場OpenMP專門針對這類并行化問題,并完成了這項工作,同時得到工業(yè)界的廣泛支持2004年4月142ANSI X3H5共享編程標(biāo)準(zhǔn)概念性的編程模型(ANSI標(biāo)準(zhǔn)(1993)沒有任何商品化的

溫馨提示

  • 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論