計(jì)算流體力學(xué)-第5講MPI并行程序設(shè)計(jì)初步1課件_第1頁
計(jì)算流體力學(xué)-第5講MPI并行程序設(shè)計(jì)初步1課件_第2頁
計(jì)算流體力學(xué)-第5講MPI并行程序設(shè)計(jì)初步1課件_第3頁
計(jì)算流體力學(xué)-第5講MPI并行程序設(shè)計(jì)初步1課件_第4頁
計(jì)算流體力學(xué)-第5講MPI并行程序設(shè)計(jì)初步1課件_第5頁
已閱讀5頁,還剩53頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、計(jì)算流體力學(xué)_第5講MPI并行程序設(shè)計(jì)初步1計(jì)算流體力學(xué)_第5講MPI并行程序設(shè)計(jì)初步1Copyright by Li Xinliang2Part 1: 基本概念及MPI并行編程入門 并行計(jì)算基本概念 MPI并行編程入門 1)MPI 簡介 2)MPI 的基本函數(shù)及消息傳遞 3)MPI的常用函數(shù) 4)對(duì)等式編程思想的舉例說明 全收集、矩陣相乘Copyright by Li Xinliang4Part 一、 基本概念并行計(jì)算機(jī)簡介大規(guī)模并行計(jì)算超級(jí)計(jì)算(Supercomputing)/高性能計(jì)算 (HPC)為何需要超級(jí)計(jì)算? 應(yīng)用領(lǐng)域的巨大計(jì)算需求單CPU的計(jì)算能力有限 應(yīng)用對(duì)計(jì)算資源的需求3Co

2、pyright by Li Xinliang一、 基本概念并行計(jì)算機(jī)簡介 應(yīng)用對(duì)計(jì)算資源的需求5Copy CFD的計(jì)算資源依賴性 計(jì)算量大流動(dòng)的多尺度性 (湍流) 大飛機(jī)全部流動(dòng)細(xì)節(jié)完全分辨: 最小尺度:mm mm 量級(jí); 計(jì)算網(wǎng)格: 1012-1016 ; 需計(jì)算量: 1020-30 ; 工程需求: 8個(gè)小時(shí)之內(nèi)完成計(jì)算 預(yù)計(jì): LES: 2045年; DNS: 2080年最大尺度 mmm CFD的計(jì)算資源依賴性最大尺度 mmm幾種我們常見的并行計(jì)算機(jī)CPUCPUCPU總線或交叉開關(guān)Memory(a) SMP, 物理上單一地址空間CPUCPUCPU定制網(wǎng)絡(luò)LMLMLM虛擬分布共享存儲(chǔ)(DSM

3、) (b) DSM, 邏輯上單一地址空間P/CP/CP/C定制/標(biāo)準(zhǔn)網(wǎng)絡(luò)LMLMLM(c) Cluster/COW, 物理/邏輯上多地址空間SMPMPPMPPWANLMDSMSM(d) Grid (Cluster of Clusters)并行計(jì)算機(jī)體系結(jié)構(gòu)5Copyright by Li Xinliang內(nèi)存帶寬瓶頸訪存沖突機(jī)制控制復(fù)雜虛擬共享存儲(chǔ)“NUMA”訪存沖突機(jī)制控制復(fù)雜克服了訪存沖突及內(nèi)存瓶頸訪存的局部性 對(duì)網(wǎng)絡(luò)要求不嚴(yán)幾種我們常見的并行計(jì)算機(jī)CPUCPUCPU總線或交叉開關(guān)M各系統(tǒng)的性能210021002100210021002100210021002100單處理器共享存儲(chǔ)局域并行

4、機(jī)群廣域并行機(jī)群GFLOPS6Copyright by Li Xinliang低價(jià)格可擴(kuò)展各系統(tǒng)的性能210021002100210021002100自行搭建的簡易機(jī)群7Copyright by Li Xinliang并行機(jī)群: 搭建簡單 簡單的局域網(wǎng)并行機(jī)群 = 局域網(wǎng)早期 作者搭建的簡易機(jī)群機(jī)群軟件:Linux/Windows; 套件OSCAR; MPICH.NT, 我國最早搭建的機(jī)群: LSEC 張林波 搭建的32節(jié)點(diǎn)機(jī)自行搭建的簡易機(jī)群9Copyright by Li XinlCopyright by Li Xinliang8美洲虎/1700萬億次曙光5000A/160萬億次天河1號(hào)

5、560萬億次CPU+GPU混合系統(tǒng)聯(lián)想深騰7000/106萬億次單精度千萬億次的GPU系統(tǒng) Mole-xx頂級(jí)的超級(jí)計(jì)算機(jī)目標(biāo): 每秒 1摩爾次浮點(diǎn)運(yùn)算 (1 mole=6.02*1023)Copyright by Li Xinliang10美洲虎/Copyright by Li Xinliang9排名SiteComputer計(jì)算機(jī)描述cores核心數(shù)實(shí)測(cè)速度/峰值速度 (Tflops); 耗電量 (KW)1Oak Ridge National LaboratoryUnited StatesJaguar - Cray XT5-HE Opteron Six Core 2.6 GHz / 2009

6、 Cray Inc.2241621759/2331 ;6950.62DOE/NNSA/LANL United StatesRoadrunner - BladeCenter QS22/LS21 Cluster, PowerXCell 8i 3.2 Ghz / Opteron DC 1.8 GHz, Voltaire Infiniband / 2009 ;IBM1224001042/1375.78;2345.503National Institute for Computational Sciences/University of TennesseeUnited StatesKraken XT5

7、- Cray XT5-HE Opteron Six Core 2.6 GHz / 2009 Cray Inc.98928831.70/1028.85Top5 超級(jí)計(jì)算機(jī) (2009-11)美洲虎半年間性能猛增69的秘密在于處理器核心數(shù)量的暴漲:在配備AMD剛剛發(fā)布的六核心“伊斯坦布爾”O(jiān)pteron 2435 2.6GHz(單顆浮點(diǎn)性能10.4GFlops)后,美洲虎的核心數(shù)從129600個(gè)增至224162個(gè)(+73),且每核心搭配2GB內(nèi)存,每個(gè)完整的計(jì)算節(jié)點(diǎn)由12個(gè)處理核心和16GB共享內(nèi)存組成,整套系統(tǒng)300TB內(nèi)存、10PB(10000TB)硬盤。Copyright by Li Xin

8、liang11排名SiCopyright by Li Xinliang10排名SiteComputer計(jì)算機(jī)描述cores核心數(shù)實(shí)測(cè)速度/峰值速度 (萬億次); 耗電量 (千瓦)4Forschungszentrum Juelich (FZJ)GermanyJUGENE - Blue Gene/P Solution / 2009 IBM294912825.50/1002.7;22685National SuperComputer Center in Tianjin/NUDTChinaTianhe-1 - NUDT TH-1 Cluster, Xeon E5540/E5450, ATI Radeo

9、n HD 4870 2, Infiniband / 2009 NUDT71680563.10/1206.19Top5 超級(jí)計(jì)算機(jī) (2009-11)天河1號(hào):我國最快的計(jì)算機(jī); CPU + GPU的混合系統(tǒng)GPU計(jì)算 最先進(jìn)的高性能計(jì)算Copyright by Li Xinliang12排名Si2. 并行程序設(shè)計(jì)工具1) 共享存儲(chǔ)式 自動(dòng)并行(并行編譯器) Intel Fortran/C 編譯器 ifc aa.for -parallel 編譯目標(biāo): 多線程程序 OpenMP內(nèi) 存CPU編譯指示符: !omp parallel 11Copyright by Li Xinliang2. 并行程序設(shè)

10、計(jì)工具內(nèi) 存CPU編譯指示符: !o局域網(wǎng)絡(luò)計(jì)算機(jī)Cluster 系統(tǒng)2) 分布存儲(chǔ)式 HPF (High-Performance Fortran) 基于數(shù)據(jù)并行,程序改動(dòng)較小 效率較低 PVM (Parallel Virtual Machine) MPI (Message Passing Interface) 基于消息傳遞 效率較高12Copyright by Li Xinliang局域網(wǎng)絡(luò)計(jì)算機(jī)Cluster 系統(tǒng)2) 分布存儲(chǔ)式14Cop MPI 的編譯、運(yùn)行環(huán)境 1) 并行計(jì)算機(jī) (力學(xué)所機(jī)群、深騰7000,曙光5000A) 編譯: mpif90 / mpif77/mpicc f90/

11、f77 -I/usr/local/mpi/include -L/usr/local/mpi/lib -lm -lmpi 運(yùn)行: mpirun / bsub 2)MPI for NT (Windows 2000,XP) 編譯環(huán)境:Visual Fortran/ MS Develop Studio 設(shè)置:頭文件路徑、連接路徑 運(yùn)行: mpirun二、MPI并行編程入門1. 簡介13Copyright by Li Xinliang MPI 的編譯、運(yùn)行環(huán)境二、MPI并行編程入門15CopyCopyright by Li Xinliang14設(shè)置Windows下的MPI環(huán)境 Step 1: 下載并安裝

12、mpich.nt.1.2.5安裝包;Step 2: 更改Visual Fortran的環(huán)境設(shè)置,添加MPICH的 include 及l(fā)ib 路徑 1) Tools-options- Build; 在“show directories for:” 欄目選擇 “include files”; 在“Directories:” 下的對(duì)話框里面添加MPICH include 的路徑,例如“C:/Porgram files/mpich/SDK/include” (根據(jù)安裝的具體位置而定) 在“show directories for:” 的欄目選擇“Library files”, 在 “Directori

13、es:”下的對(duì)話框里面添加 MPICH Lib 的路徑, 例如 “C:/Porgram files/mpich/SDK/lib” 2) 程序編譯時(shí),請(qǐng)把mpich.lib 添加在鏈接庫里。 project-settings-link ; 在 objcet/Library modules 下的對(duì)話框里面添加 mpich.lib (例如 “kernel32.lib” 變更為 “kernel32.lib ; mpich.lib”)Step3: 編譯程序,生成可執(zhí)行文件Copyright by Li Xinliang16設(shè)置WiCopyright by Li Xinliang15Step 4: 利用m

14、pirun 運(yùn)行程序。 (該工具在Windows桌面的 “開始- 程序- mpich - mpd - MPIRun”) 在“Application:”對(duì)話框里面選擇剛編譯生成的可執(zhí)行文件。 在“Number of Processes” 對(duì)話框里面選擇運(yùn)行運(yùn)行的進(jìn)程數(shù) (即所謂“CPU個(gè)數(shù)”)。 在“Advanced options ” 對(duì)話框里面選擇 “Always prompt for password ”。 MPIRun 運(yùn)行時(shí)會(huì)要求用戶輸入計(jì)算機(jī)的用戶名和密碼。 點(diǎn)擊“Run”即可運(yùn)行 (需要輸入計(jì)算機(jī)的用戶名和密碼)。注意: 如果程序?yàn)閒90 程序,請(qǐng)修改mpif.h 。將行首的注釋符

15、 “C” 替換為“!”, 否則編譯會(huì)出錯(cuò)。(mpif.h 在安裝路徑的include 目錄下,通常在 C:/Porgram files/mpich/SDK/include里面) 通常MPIRun需要以計(jì)算機(jī)管理員的身份運(yùn)行,需要對(duì)計(jì)算機(jī)設(shè)置用戶名和密碼。如果計(jì)算機(jī)沒有設(shè)置密碼,則需要在控制面板中設(shè)置。 些防火墻及殺毒軟件會(huì)阻止MPIRun的運(yùn)行,如出現(xiàn)問題需要關(guān)閉這些防火墻及殺毒軟件。Copyright by Li Xinliang17注意: 服務(wù)器/前端機(jī)計(jì)算節(jié)點(diǎn)a.exea.exea.exeMPI 程序的運(yùn)行原理: 服務(wù)器(前端機(jī))編譯 可執(zhí)行代碼復(fù)制 N 份,每個(gè)節(jié)點(diǎn)運(yùn)行一份 調(diào)用MPI

16、庫函數(shù) 得到每個(gè)節(jié)點(diǎn)號(hào) my_id 根據(jù)my_id 不同,程序執(zhí)行情況不同 調(diào)用MPI 庫函數(shù)進(jìn)行通訊MPI 編程的基本思想: 主從式,對(duì)等式重要!16Copyright by Li Xinliang重點(diǎn):對(duì)等式程序設(shè)計(jì)服務(wù)器/前端機(jī)計(jì)算節(jié)點(diǎn)a.exea.exea.exeMPI Copyright by Li Xinliang17計(jì)算節(jié)點(diǎn)a.exea.exea.exea.exe對(duì)等式設(shè)計(jì)“對(duì)等式”程序設(shè)計(jì)思想如果我是其中一個(gè)進(jìn)程;我應(yīng)當(dāng)做完成我需要完成的任務(wù)站在其中一個(gè)進(jìn)程的角度思考Copyright by Li Xinliang19計(jì)算節(jié)點(diǎn) 一個(gè)簡單的MPI程序 hello.f90 incl

17、ude mpif.h integer myid,numprocs,ierr call MPI_Init(ierr) callMPI_Comm_rank(MPI_COMM_WORLD,myid,ierr) call MPI_Comm_size(MPI_COMM_WORLD,numprocs,ierr) Print*, Hello World! my id is :,myid ! 添加自己的程序 ! call MPI_Finalize(ierr) end18Copyright by Li Xinliang 一個(gè)簡單的MPI程序 hello.f9020Copyrig運(yùn)行結(jié)果: 19Copyright

18、 by Li Xinliang運(yùn)行結(jié)果: 21Copyright by Li Xinlia基本MPI函數(shù) (MPI 子集) 1) MPI初始化 call MPI_Init(ierr) (out) Integer: ierr 2) MPI結(jié)束 call MPI_Finalize(ierr) (out) Integer: ierr20Copyright by Li Xinliang(in) : 輸入?yún)?shù);(out) : 輸出參數(shù); 整數(shù),返回值非0表示出錯(cuò)基本MPI函數(shù) (MPI 子集)22Copyright b3) 得到當(dāng)前進(jìn)程標(biāo)識(shí)callMPI_Comm_rank(MPI_COMM_WORLD

19、,myid,ierr)(In) Integer: MPI_COMM_WORLD 為進(jìn)程所在的通信域(Out) Integer: myid, ierr 4) 得到通信域包含的進(jìn)程數(shù)CallMPI_Comm_size(MPI_COMM_WORLD,numprocs,ierr)(In) Integer: MPI_COMM_WORLD(Out) Integer: numprocs,ierr21Copyright by Li Xinliang進(jìn)程的ID號(hào) (從0開始)最重要的參數(shù)!MPI_COMM_WORLD: MPI預(yù)定義的通信域; 可換成創(chuàng)建的通信域Comm3) 得到當(dāng)前進(jìn)程標(biāo)識(shí)23Copyrigh

20、t by Li 基本概念: 通信域(通信子)01234567891011012345012345MPI_COMM_WORLDMPI_Comm_1MPI_Comm_222Copyright by Li Xinliang把全班分成幾個(gè)組,執(zhí)行任務(wù)更方便“班名”, 包含全班同學(xué) MPI 預(yù)定義my_id “學(xué)號(hào)”組的名字(編號(hào))組內(nèi)編號(hào)基本概念: 通信域(通信子)0123456789101101 MPI 消息傳遞函數(shù) 消息發(fā)送 MPI_Send(buf,count,datatype,dest,tag,comm, ierr) MPI消息:數(shù)據(jù)描述+信封 數(shù)據(jù)描述:起始地址,數(shù)據(jù)個(gè)數(shù),數(shù)據(jù)類型 信封:

21、源/目,標(biāo)簽,通信域23Copyright by Li Xinliang MPI 消息傳遞函數(shù)25Copyright by Li buf: 數(shù)據(jù)起始地址 (Fortran : 變量名, C: 變量地址/指針) count: 數(shù)據(jù)數(shù)目 (以datatype為單位,必須連續(xù)) MPI_Send(buf,count,datatype,dest,tag,comm,ierr)24Copyright by Li XinliangDatatype: 數(shù)據(jù)類型 MPI_INTEGER, MPI_REAL, MPI_DOUBLE_PRECISION, MPI_COMPLEX, MPI_LOGICAL, MPI_

22、CHARACTER, MPI_BYTE, MPI_PACKEDReal*8 x(10) (給x 賦值)Call MPI_send( x(1), 10, MPI_double_precision, .)數(shù)據(jù)的首地址 (不是變量的值)10 個(gè)數(shù)據(jù)(不是10個(gè)字節(jié))Fortran : 按地址傳送 : x(1) 或 xC: 按值傳送: & (x0) 或x buf: 數(shù)據(jù)起始地址 (Fortran : dest: 發(fā)送目標(biāo)的ID (integer) Tag: 消息標(biāo)簽 (integer) Comm: 通信域 (integer), 例:MPI_COMM_WORLD ierr : 整數(shù),如果成功返回0例:

23、real A .if(my_id .eq. 0) Call MPI_Send(A, 1,MPI_REAL,1,27,MPI_COMM_WORLD,ierr) 標(biāo)簽 tag 的作用: 區(qū)別不同的消息MPI_Send(buf,count,datatype,dest,tag,comm,ierr)25Copyright by Li Xinliang標(biāo)簽。 舉例:0號(hào)同學(xué)向1號(hào)同學(xué)發(fā)出3封信,內(nèi)容分別為3科考試成績, 為了防止弄混,必須用約定的數(shù)做標(biāo)簽。目的ID dest: 發(fā)送目標(biāo)的ID (integer)消息接收MPI_Recv(buf,count,datatype,source,tag,comm,

24、status,ierr) 參數(shù): 數(shù)據(jù)起始地址,數(shù)據(jù),類型,源地址,標(biāo)簽, 通信域,返回狀態(tài) integer status(MPI_STATUS_SIZE) MPI接收匹配:數(shù)據(jù)類型、源地址、標(biāo)簽要一致;否則不接收數(shù)據(jù)發(fā)送緩沖區(qū)消息裝配消息傳遞消息拆卸數(shù)據(jù)接收緩沖區(qū)26Copyright by Li Xinliang返回狀態(tài)和調(diào)試信息消息接收數(shù)據(jù)發(fā)送緩沖區(qū)消息裝配消息傳遞消息拆卸數(shù)據(jù)接收緩沖區(qū)MPI_Recv(buf,count,datatype,source,tag,comm,status,ierr) 源地址,標(biāo)簽 27Copyright by Li Xinliang integer sta

25、tus(MPI_STATUS_SIZE) 任意源地址: MPI_ANY_SOURCE任意標(biāo)簽 :MPI_ANY_TAG包含必要信息MPI預(yù)定義的常量可匹配任意源、任意標(biāo)簽“無論誰來的信都接收”status(MPI_SOURCE) : 消息的源地址status(MPI_TAT) : 消息的標(biāo)簽status(MPI_ERROR) : 錯(cuò)誤碼MPI_Recv(buf,count,datatype,soMPI的消息發(fā)送機(jī)制 兩步進(jìn)行MPI_Send( A, ) 發(fā)送MPI_Recv( B, ) 接收 發(fā)送 變量A接收 到變量B配合使用發(fā)/收 兩步機(jī)制;避免直接讀寫對(duì)方內(nèi)存;保證安全性MPI的消息發(fā)送機(jī)

26、制 兩步進(jìn)行發(fā)送 變量A接收 到! sum from 1 to 100 ! Run only for np=2 ! include mpif.h integer myid,sum_local,sum_local1,sum_global,ierr,status(MPI_STATUS_SIZE) call MPI_Init(ierr) call MPI_Comm_Rank(MPI_COMM_WORLD,myid,ierr) sum_local=0 do i=myid+1,100,2 sum_local=sum_local+i enddo print*, myid=,myid, sum_local=

27、,sum_local if(myid .eq. 1) call MPI_SEND(sum_local,1,MPI_INTEGER,0,99,MPI_COMM_WORLD,ierr) if(myid .eq. 0) then call MPI_RECV(sum_local1,1,MPI_INTEGER,1,99,MPI_COMM_WORLD,status,ierr) sum_global=sum_local+sum_local1 print*, sum_global= ,sum_global endif call MPI_Finalize(ierr) end例: 計(jì)算 1+2+3 +100, 采

28、用2個(gè)CPU并行CPU 0: 1+3+5+7 +99CPU 1: 2+4+6+8 +100“對(duì)等式”編程思路: 站在每個(gè)進(jìn)程的角度思考29Copyright by Li Xinliang! sum from 1 to 100 ! Run onl結(jié)果顯示30Copyright by Li Xinliang結(jié)果顯示32Copyright by Li Xinliang消息傳遞時(shí)要注意防止死鎖緩沖區(qū)(“信箱”)MPI_SendMPI_RecvMPI_Send, MPI_Recv 屬于阻塞式發(fā)送/接收 發(fā)送成功 接收成功發(fā)送和接收是兩個(gè)獨(dú)立過程 子程序返回Send 與 Recv 一定要配合好發(fā)送到“信箱

29、”即為成功31Copyright by Li Xinliang重要!消息傳遞時(shí)要注意防止死鎖緩沖區(qū)MPI_SendMPI_Rec緩沖區(qū)發(fā)生死鎖的情況只發(fā)送,不接收只接收,不發(fā)送緩沖區(qū)?32Copyright by Li Xinliang緩沖區(qū)發(fā)生死鎖的情況只發(fā)送,不接收只接收,不發(fā)送緩沖區(qū)?34例,任務(wù): 進(jìn)程0 發(fā)送變量 A給進(jìn)程1 進(jìn)程1發(fā)送變量 B給進(jìn)程0 if (myid .eq. 0) then call MPI_send(A,1,MPI_real, 1, 99,MPI_Comm_World,ierr) call MPI_recv(B,1,MPI_real, 1, 99,MPI_Co

30、mm_World,ierr)Else if(myid .eq. 1) then call MPI_recv(A,1,MPI_real, 0, 99,MPI_Comm_World,ierr ) call MPI_send(B,1,MPI_real, 0, 99,MPI_Comm_World,ierr)endif Step 1Step 2Step 1Step 2不會(huì)死鎖33Copyright by Li Xinliang例,任務(wù): 進(jìn)程0 發(fā)送變量 A給進(jìn)程1 if (myid死鎖的例子 if (myid .eq. 0) then call MPI_recv(B,1,MPI_real, 1, 99

31、,MPI_Comm_World,ierr) call MPI_send(A,1,MPI_real, 1, 99,MPI_Comm_World,ierr)Else if(myid .eq. 1) then call MPI_recv(A,1,MPI_real, 0, 99,MPI_Comm_World,ierr ) call MPI_send(B,1,MPI_real, 0, 99,MPI_Comm_World,ierr)endif Step 1Step 1Step 2不會(huì)死鎖?Step 234Copyright by Li Xinliang死鎖的例子 if (myid .eq. 0) then

32、Ste有可能死鎖的例子 if (myid .eq. 0) then call MPI_send(A,1,MPI_real, 1, 99,MPI_Comm_World,ierr) call MPI_recv(B,1,MPI_real, 1, 99,MPI_Comm_World,ierr) Else if(myid .eq. 1) then call MPI_send(B,1,MPI_real, 0, 99,MPI_Comm_World,ierr) call MPI_recv(A,1,MPI_real, 0, 99,MPI_Comm_World,ierr )endif Step 2Step 2St

33、ep 135Copyright by Li Xinliang有可能死鎖的例子 if (myid .eq. 0) then使用MPI_Sendrecv( ) 函數(shù)來避免死鎖MPI_SendRecv(buf1,count1,datatype1,dest,tag1, buf2,count2,datatype2,source,tag2,comm,status,ierr)= MPI_Send(buf1,count1,datatype1,dest,tag1, comm,ierr)+MPI_Recv(buf2,count2,datatype2,source,tag2,comm,status,ierr)次序由

34、系統(tǒng)決定36Copyright by Li Xinliang使用MPI_Sendrecv( ) 函數(shù)來避免死鎖MPI_S基本的MPI函數(shù)(6個(gè)) MPI的子集MPI初始化 MPI_Init(ierr) ; MPI結(jié)束 MPI_Finalize(ierr)得到當(dāng)前進(jìn)程標(biāo)識(shí) MPI_Comm_rank(MPI_COMM_WORLD,myid,ierr) 得到通信域包含的進(jìn)程數(shù) MPI_Comm_size(MPI_COMM_WORLD,numprocs,ierr) 消息發(fā)送MPI_Send(buf,count,datatype,dest,tag,comm, ierr)消息接收MPI_Recv(buf

35、,count,datatype,source,tag,comm,status,ierr) MPI 只能點(diǎn)到點(diǎn)通信,其他函數(shù)是用這6個(gè)函數(shù)開發(fā)的;使用這6個(gè)函數(shù),可以實(shí)現(xiàn)MPI的全部功能?;镜腗PI函數(shù)(6個(gè)) MPI的子集MPI 只能點(diǎn)到點(diǎn)Copyright by Li Xinliang38系統(tǒng)時(shí)間(墻鐘)函數(shù): MPI_Wtime( ) real*8: time time=MPI_Wtime( )返回當(dāng)前墻鐘時(shí)間 (單位:秒)(Wall time 與CPU time不同,Wall time更可靠)CPU分時(shí)為所有進(jìn)程服務(wù)Real *8: Time_begin, Time_end (初始化)

36、Time_begin=MPI_Wtime( ).(計(jì)算任務(wù)).Call MPI_Barrier( comm, ierr)Time_end=MPI_Wtime()Print*, “計(jì)算時(shí)間為:” ,Time_end-Time_begin可用來測(cè)量程序的執(zhí)行速度測(cè)量加速比及并行效率加速比= N個(gè)進(jìn)程的執(zhí)行速度/單個(gè)進(jìn)程的執(zhí)行速度并行效率= 加速比/N作者的Hoam-OpenCFD軟件加速比測(cè)試CPU Core number 1024-16384并行效率 89.6%通常要進(jìn)行同步,然后測(cè)量時(shí)間,否則各進(jìn)程報(bào)出的時(shí)間不同。Copyright by Li Xinliang40系統(tǒng)時(shí)間3. 常用的MPI函

37、數(shù)1) 廣播 MPI_Bcast(buff,count,datatype,root,comm,ierr) 參數(shù): 數(shù)據(jù)緩沖區(qū),數(shù)目,數(shù)據(jù)類型,根進(jìn)程,通訊域 例: real A if(myid .eq. 0) then open(55,file=data.dat) read(55,*) A close(55) endif call MPI_Bcast(A,1,MPI_REAL,0,MPI_COMM_WORLD,ierr)廣播: 樹狀傳播,效率較高39廣播的邏輯圖廣播的實(shí)際實(shí)現(xiàn)方式樹狀傳播MPI的消息: 只能點(diǎn)到點(diǎn)傳遞;不能真正“廣播”3. 常用的MPI函數(shù)1) 廣播 MPI_Bcast(bu2

38、) 規(guī)約 (求和,求最大值,求最小值,) MPI_Reduce(sendbuf,recvbuf,count,datatype,op,root,comm,ierr)發(fā)送緩沖區(qū),接收緩沖區(qū),數(shù)目,數(shù)據(jù)類型,規(guī)約操作,通訊域! sum from 1 to 100 ! Run only for np=2 ! include mpif.h integer myid,sum_local,sum_global,ierr call MPI_Init(ierr) call MPI_Comm_Rank(MPI_COMM_WORLD,myid,ierr) sum_local=0 do i=myid+1,100,2

39、sum_local=sum_local+i enddo call MPI_Reduce(sum_local,sum_global,1,MPI_INTEGER, & MPI_SUM,0, MPI_COMM_WORLD,ierr) print*, sum_global= ,sum_global call MPI_Finalize(ierr) end40Copyright by Li Xinliang2) 規(guī)約 (求和,求最大值,求最小值,)! sum 預(yù)定義的規(guī)約操作: MPI_MAX 最大值 MPI_LXOR 邏輯異或 MPI_MIN 最小值 MPI_BXOR 按位異或 MPI_SUM 求和 M

40、PI_MAXLOC 最大值及位置 MPI_PROD 求積 MPI_MINLOC 最小值及位置 MPI_LAND 邏輯與 MPI_BAKD 按位與 MPI_LOR 邏輯或 MPI_BOR 安位或41Copyright by Li Xinliang預(yù)定義的規(guī)約操作:43Copyright by Li Xin同步 MPI_Barrier ( comm, ierr) Comm: 通訊域, ierr: 返回值 等待所有進(jìn)程都調(diào)用MPI_Barrier(), 函數(shù)才能返回Call MPI_barrier(MPI_COMM_WORLD, ierr)42Copyright by Li Xinliang同步 M

41、PI_Barrier ( commCopyright by Li Xinliang434. “對(duì)等式”編程示例例1:全收集的實(shí)現(xiàn) MPI_Allgather( )題目: N個(gè)進(jìn)程, 每個(gè)進(jìn)程有一個(gè)數(shù)A; 把所有進(jìn)程的數(shù)收集起來,按進(jìn)程號(hào)的次序形成數(shù)組A0 (1:N), 存放到所有進(jìn)程中。 把每個(gè)同學(xué)的電話號(hào)碼收集起來,形成通訊錄,發(fā)給全班同學(xué)也可以是數(shù)組,各進(jìn)程的數(shù)A可以不同 A0(1) A0(2) A0(3) A0(4)Copyright by Li Xinliang454. “方式1: 根進(jìn)程收集所有數(shù)據(jù); 根進(jìn)程發(fā)送到所有進(jìn)程 if(myid .eq. 0) then A0(0)=A d

42、o id=1,Nproc-1 call MPI_Recv(A0(id),1,MPI_Real,id,99,MPI_Comm_World,status,ierr) enddo else call MPI_Send(A,1,MPI_Real,0,.) endif if(myid .eq. 0) then do id=1,Nproc-1 call MPI_Send(A0,Nproc,MPI_Real,id, ) enddo else call MPI_Recv(A0,Nproc,MPI_Real,0,) endif44Copyright by Li Xinliang“班長”依次與所有同學(xué)通信,收集信

43、息;收集后依次通信,發(fā)放信息負(fù)載不均衡效率最低可能會(huì)死鎖方式1: 根進(jìn)程收集所有數(shù)據(jù); 根進(jìn)程發(fā)送到所有進(jìn)程46C方式2: 根進(jìn)程收集所有數(shù)據(jù); 根進(jìn)程廣播到所有進(jìn)程 if(myid .eq. 0) then A0(0)=A do id=1,Nproc-1 call MPI_Recv(A0(id),1,MPI_Real,id,99,MPI_Comm_World,status,ierr) enddo else call MPI_Send(A,1,MPI_Real,0,.) endif call MPI_Bcast(A0,Nproc,MPI_Real,0,MPI_Comm_world,ierr)

44、效率高于 (1) 是MPI_Allgather( )的原有的標(biāo)準(zhǔn)方式45Copyright by Li Xinliang廣播的實(shí)現(xiàn)方式“班長”依次收集信息后,“廣播”給全班方式2: 根進(jìn)程收集所有數(shù)據(jù); 根進(jìn)程廣播到所有進(jìn)程47CCopyright by Li Xinliang461A send to ID 0 0 1 2 3 N-11B 0 1 2 3 N-1Step 1: “我” (my_id 進(jìn)程) 向my_id+1進(jìn)程發(fā)數(shù)據(jù); “我” 收my_id-1進(jìn)程發(fā)來的數(shù)據(jù)該步完成后: “我” (my_id 進(jìn)程)得到了my_id-1的數(shù)據(jù)全收集的實(shí)現(xiàn)圖解方式3: 循環(huán)通信Copyright

45、by Li Xinliang481ACopyright by Li Xinliang472A send to ID 1 0 1 2 3 N-12B 0 1 2 3 N-1Step 2: “我”向 my_id+2 進(jìn)程發(fā)數(shù)據(jù); “我”收 my_id-2進(jìn)程發(fā)來的數(shù)據(jù);該步完成后: “我”得到了my_id-1, my_id-2進(jìn)程的數(shù)據(jù)Step 3 :我向my_id+3發(fā)數(shù)據(jù), 我收my_id-3發(fā)來的數(shù)據(jù)Step N-1 完成后, 我得到了全部數(shù)據(jù); 全體進(jìn)程也得到了全部數(shù)據(jù)對(duì)等式編程思想:每個(gè)人做好自己的工作,全部工作就做好了不設(shè)班長,所有人工作量相同Copyright by Li Xinli

46、ang492A循環(huán)通訊: 由張林波研究員首次提出 do step=1,Nproc-1 id_send=mod(myid+step,Nproc) id_recv=mod(myid-step,Nproc) call MPI_Send(A,1,MPI_Real,id_send,99, & MPI_Comm_World,ierr) call MPI_Recv(A0(id_recv),1,MPI_Real,id_recv,99, & MPI_Comm_World,status,ierr) enddo 效率高于 (1) (2) 是MPI_Allgather( )的現(xiàn)有的標(biāo)準(zhǔn)方式48Copyright by

47、 Li Xinliang循環(huán)通訊: 由張林波研究員首次提出50Copyrigh 計(jì)算矩陣 A*B=C , A,B,C: N*N 矩陣 采用P個(gè)進(jìn)程計(jì)算 (N能被P整除) 存儲(chǔ)方式:分布存儲(chǔ), A, C 按行分割, B 按列分割矩陣 A B C49Copyright by Li Xinliang例2. 計(jì)算矩陣乘積 計(jì)算矩陣 A*B=C , A“對(duì)等式”程序設(shè)計(jì)思想: 站在每個(gè)進(jìn)程角度思考 “我”的數(shù)據(jù): dimension A1(N/P,N), B1(N,N/P), C1(N/P,N) “我”的任務(wù): 計(jì)算 C10, KP-1ACBA1B1C150Copyright by Li Xinlian

48、g“對(duì)等式”程序設(shè)計(jì)思想: 站在每個(gè)進(jìn)程角度思考0, K需要得到整個(gè)矩陣 B 自己只有 Bk 向他人索取 do id=0,P-1 call MPI_Recv(B_tmp, N*N/P, MPI_REAL, id, . ) 計(jì)算出 C1(id) (C1(id)=A1*B_tmp) enddo 只索取數(shù)據(jù),何人提供? “命令”他人提供數(shù)據(jù)? 不符合“對(duì)等式”程序設(shè)計(jì)思想 0, KP-1ACB如何完成任務(wù)?B_tmp(N,N/P,P)C1(0)C1(1)C151Copyright by Li Xinliang需要得到整個(gè)矩陣 B 自己只有 Bk 向他人索取0B順次發(fā)送數(shù)據(jù) do step=0,P-1 if(myid .eq. step) then do id=0,P-1 call MPI_Send(B1,N*N/P,MPI_RE

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(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)論