版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
MPI并行程序設(shè)計(jì)(1)知識(shí)點(diǎn):
MPI程序的運(yùn)行機(jī)制——拷貝N份,給每個(gè)進(jìn)程一份MPI的基本庫(kù)函數(shù)——6個(gè)庫(kù)函數(shù)
“對(duì)等式”編程方法——站在單個(gè)進(jìn)程的角度思考12Part1:基本概念及MPI并行編程入門
并行計(jì)算基本概念MPI并行編程入門1)MPI簡(jiǎn)介2)MPI的基本函數(shù)及消息傳遞3)MPI的常用函數(shù)4)對(duì)等式編程思想的舉例說(shuō)明——全收集、矩陣相乘一、基本概念并行計(jì)算機(jī)簡(jiǎn)介大規(guī)模并行計(jì)算——超級(jí)計(jì)算(Supercomputing)/高性能計(jì)算(HPC)為何需要超級(jí)計(jì)算?
應(yīng)用領(lǐng)域的巨大計(jì)算需求單CPU的計(jì)算能力有限
應(yīng)用對(duì)計(jì)算資源的需求3
●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幾種我們常見(jiàn)的并行計(jì)算機(jī)CPUCPUCPU…總線或交叉開(kāi)關(guān)Memory(a)SMP,物理上單一地址空間CPUCPUCPU…定制網(wǎng)絡(luò)LMLMLM虛擬分布共享存儲(chǔ)(DSM)(b)DSM,邏輯上單一地址空間P/CP/CP/C…定制/標(biāo)準(zhǔn)網(wǎng)絡(luò)LMLMLM(c)Cluster/COW,物理/邏輯上多地址空間SMPMPPMPP…WANLMDSMSM(d)Grid(ClusterofClusters)并行計(jì)算機(jī)體系結(jié)構(gòu)5內(nèi)存帶寬瓶頸訪存沖突機(jī)制控制復(fù)雜虛擬共享存儲(chǔ)“NUMA”訪存沖突機(jī)制控制復(fù)雜克服了訪存沖突及內(nèi)存瓶頸訪存的局部性——對(duì)網(wǎng)絡(luò)要求不嚴(yán)各系統(tǒng)的性能210021002100210021002100210021002100單處理器共享存儲(chǔ)局域并行機(jī)群廣域并行機(jī)群G
F
L
O
P
S6低價(jià)格可擴(kuò)展自行搭建的簡(jiǎn)易機(jī)群7并行機(jī)群:搭建簡(jiǎn)單——簡(jiǎn)單的局域網(wǎng)并行機(jī)群=局域網(wǎng)早期作者搭建的簡(jiǎn)易機(jī)群機(jī)群軟件:Linux/Windows;套件OSCAR;MPICH.NT,……我國(guó)最早搭建的機(jī)群:LSEC張林波搭建的32節(jié)點(diǎn)機(jī)8美洲虎/1700萬(wàn)億次天河1號(hào)千萬(wàn)億次CPU+GPU混合系統(tǒng)單精度千萬(wàn)億次的GPU系統(tǒng)Mole-xx頂級(jí)的超級(jí)計(jì)算機(jī)天河2號(hào):CPU+加速卡(XeonPhi)3.39億億次9Top5超級(jí)計(jì)算機(jī)(2013-6)排名計(jì)算機(jī)核心數(shù)Rmax(Tflops)Power(KW)1Tianhe-2(MilkyWay-2)-TH-IVB-FEPCluster,IntelXeonE5-269212C2.200GHz,THExpress-2,IntelXeonPhi31S1P
NUDT,China312000033862.7;178082Titan-CrayXK7,Opteron627416C2.200GHz,CrayGeminiinterconnect,NVIDIAK20x
CrayInc,USA56064017590.0;82093Sequoia-BlueGene/Q,PowerBQC16C1.60GHz,Custom
IBM,USA157286417173.2;78904Kcomputer,SPARC64VIIIfx2.0GHz,Tofuinterconnect
Fujitsu,Japan70502410510.0;126605Mira-BlueGene/Q,PowerBQC16C1.60GHz,Custom
IBM,USA7864328586.6;39452.并行程序設(shè)計(jì)工具1)共享存儲(chǔ)式
自動(dòng)并行(并行編譯器)
IntelFortran/C編譯器ifcaa.for-parallel
編譯目標(biāo):多線程程序OpenMP內(nèi)存CPU編譯指示符:!ompparallel……10局域網(wǎng)絡(luò)計(jì)算機(jī)Cluster系統(tǒng)2)分布存儲(chǔ)式HPF(High-PerformanceFortran)
基于數(shù)據(jù)并行,程序改動(dòng)較小
效率較低PVM(ParallelVirtualMachine)
MPI(MessagePassingInterface)
基于消息傳遞
效率較高11
MPI的編譯、運(yùn)行環(huán)境1)并行計(jì)算機(jī)(力學(xué)所機(jī)群、深騰7000,曙光5000A)
編譯:mpif90/mpif77/mpiccf90/f77-I/usr/local/mpi/include-L/usr/local/mpi/lib-lm-lmpi
運(yùn)行:mpirun/bsub2)MPIforNT(Windows2000,XP)
編譯環(huán)境:VisualFortran/MSDevelopStudio
設(shè)置:頭文件路徑、連接路徑
運(yùn)行:mpirun二、MPI并行編程入門1.簡(jiǎn)介1213設(shè)置Windows下的MPI環(huán)境Step1:下載并安裝mpich.nt.1.2.5安裝包;Step2:更改VisualFortran的環(huán)境設(shè)置,添加MPICH的include及l(fā)ib路徑
1)Tools->options->Directories;
在“showdirectoriesfor:”
欄目選擇“includefiles”;在“Directories:”下的對(duì)話框里面添加MPICHinclude的路徑,例如“C:/Porgramfiles/mpich/SDK/include”(根據(jù)安裝的具體位置而定)
在“showdirectoriesfor:”的欄目選擇“Libraryfiles”,在“Directories:”下的對(duì)話框里面添加MPICHLib的路徑,例如“C:/Porgramfiles/mpich/SDK/lib”
2)程序編譯時(shí),請(qǐng)把mpich.lib添加在鏈接庫(kù)里。project->settings->link;在objcet/Librarymodules下的對(duì)話框里面添加mpich.lib(例如“kernel32.lib”變更為“kernel32.lib;mpich.lib”)Step3:編譯程序,生成可執(zhí)行文件14Step4:利用mpirun運(yùn)行程序。(該工具在Windows桌面的“開(kāi)始->程序->mpich->mpd->MPIRun”)
在“Application:”對(duì)話框里面選擇剛編譯生成的可執(zhí)行文件。在“NumberofProcesses”對(duì)話框里面選擇運(yùn)行運(yùn)行的進(jìn)程數(shù)(即所謂“CPU個(gè)數(shù)”)。
在“Advancedoptions”對(duì)話框里面選擇“Alwayspromptforpassword”。MPIRun運(yùn)行時(shí)會(huì)要求用戶輸入計(jì)算機(jī)的用戶名和密碼。
點(diǎn)擊“Run”即可運(yùn)行(需要輸入計(jì)算機(jī)的用戶名和密碼)。注意:如果程序?yàn)閒90程序,請(qǐng)修改mpif.h。將行首的注釋符“C”替換為“!”,否則編譯會(huì)出錯(cuò)。(mpif.h在安裝路徑的include目錄下,通常在C:/Porgramfiles/mpich/SDK/include里面)通常MPIRun需要以計(jì)算機(jī)管理員的身份運(yùn)行,需要對(duì)計(jì)算機(jī)設(shè)置用戶名和密碼。如果計(jì)算機(jī)沒(méi)有設(shè)置密碼,則需要在控制面板中設(shè)置。
些防火墻及殺毒軟件會(huì)阻止MPIRun的運(yùn)行,如出現(xiàn)問(wèn)題需要關(guān)閉這些防火墻及殺毒軟件。服務(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庫(kù)函數(shù)
得到每個(gè)節(jié)點(diǎn)號(hào)my_id
根據(jù)my_id不同,程序執(zhí)行情況不同
調(diào)用MPI庫(kù)函數(shù)進(jìn)行通訊MPI編程的基本思想:主從式,對(duì)等式重要!15重點(diǎn):對(duì)等式程序設(shè)計(jì)16計(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)程的角度思考一個(gè)簡(jiǎn)單的MPI程序hello.f90include‘mpif.h’integermyid,numprocs,ierr
callMPI_Init(ierr)callMPI_Comm_rank(MPI_COMM_WORLD,myid,ierr)callMPI_Comm_size(MPI_COMM_WORLD,numprocs,ierr)Print*,"HelloWorld!myidis:",myid!添加自己的程序……!callMPI_Finalize(ierr)end17運(yùn)行結(jié)果:18基本MPI函數(shù)(MPI子集)1)MPI初始化callMPI_Init(ierr)(out)Integer::ierr2)MPI結(jié)束callMPI_Finalize(ierr)(out)Integer::ierr19(in):輸入?yún)?shù);(out):輸出參數(shù);
整數(shù),返回值非0表示出錯(cuò)3)得到當(dāng)前進(jìn)程標(biāo)識(shí)callMPI_Comm_rank(MPI_COMM_WORLD,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,ierr20進(jìn)程的ID號(hào)(從0開(kāi)始)最重要的參數(shù)!MPI_COMM_WORLD:MPI預(yù)定義的通信域;可換成創(chuàng)建的通信域Comm基本概念:通信域(通信子)01234567891011012345012345MPI_COMM_WORLDMPI_Comm_1MPI_Comm_221把全班分成幾個(gè)組,執(zhí)行任務(wù)更方便“班名”,包含全班同學(xué)MPI預(yù)定義my_id“學(xué)號(hào)”組的名字(編號(hào))組內(nèi)編號(hào)MPI消息傳遞函數(shù)
消息發(fā)送
MPI_Send(buf,count,datatype,dest,tag,comm,ierr)MPI消息:數(shù)據(jù)描述+信封數(shù)據(jù)描述:<起始地址,數(shù)據(jù)個(gè)數(shù),數(shù)據(jù)類型>信封:<源/目,標(biāo)簽,通信域>22
buf:數(shù)據(jù)起始地址(Fortran:變量名,C:
變量地址/指針)count:數(shù)據(jù)數(shù)目(以datatype為單位,必須連續(xù))
MPI_Send(buf,count,datatype,dest,tag,comm,ierr)23Datatype:數(shù)據(jù)類型
MPI_INTEGER,MPI_REAL,MPI_DOUBLE_PRECISION,MPI_COMPLEX,MPI_LOGICAL,MPI_CHARACTER,MPI_BYTE,MPI_PACKEDReal*8x(10)……(給x賦值)CallMPI_send(x(1),10,MPI_double_precision,…..)數(shù)據(jù)的首地址(不是變量的值)10個(gè)數(shù)據(jù)(不是10個(gè)字節(jié))Fortran:按地址傳送:x(1)或xC:按值傳送:&(x[0])或xdest:發(fā)送目標(biāo)的ID(integer)Tag:消息標(biāo)簽(integer)Comm:通信域(integer),例:MPI_COMM_WORLDierr:整數(shù),如果成功返回0例:realA…….if(my_id.eq.0)CallMPI_Send(A,1,MPI_REAL,1,27,MPI_COMM_WORLD,ierr)
標(biāo)簽tag的作用:區(qū)別不同的消息MPI_Send(buf,count,datatype,dest,tag,comm,ierr)24標(biāo)簽。舉例:0號(hào)同學(xué)向1號(hào)同學(xué)發(fā)出3封信,內(nèi)容分別為3科考試成績(jī),為了防止弄混,必須用約定的數(shù)做標(biāo)簽。目的ID消息接收MPI_Recv(buf,count,datatype,source,tag,comm,status,ierr)
參數(shù):數(shù)據(jù)起始地址,數(shù)據(jù),類型,源地址,標(biāo)簽,
通信域,返回狀態(tài)
integerstatus(MPI_STATUS_SIZE)MPI接收匹配:數(shù)據(jù)類型、源地址、標(biāo)簽要一致;否則不接收
數(shù)據(jù)發(fā)送緩沖區(qū)消息裝配消息傳遞消息拆卸數(shù)據(jù)接收緩沖區(qū)25返回狀態(tài)和調(diào)試信息MPI_Recv(buf,count,datatype,source,tag,comm,status,ierr)源地址,標(biāo)簽
26integerstatus(MPI_STATUS_SIZE)任意源地址:
MPI_ANY_SOURCE任意標(biāo)簽:MPI_ANY_TAG包含必要信息MPI預(yù)定義的常量可匹配任意源、任意標(biāo)簽“無(wú)論誰(shuí)來(lái)的信都接收”status(MPI_SOURCE):消息的源地址status(MPI_TAT):消息的標(biāo)簽status(MPI_ERROR):錯(cuò)誤碼MPI的消息發(fā)送機(jī)制——兩步進(jìn)行MPI_Send(A,…)發(fā)送MPI_Recv(B,…)接收
發(fā)送變量A接收到變量B配合使用發(fā)/收兩步機(jī)制;避免直接讀寫對(duì)方內(nèi)存;保證安全性!sumfrom1to100!Runonlyfornp=2!!!!include'mpif.h'integermyid,sum_local,sum_local1,sum_global,ierr,status(MPI_STATUS_SIZE)callMPI_Init(ierr)callMPI_Comm_Rank(MPI_COMM_WORLD,myid,ierr)sum_local=0
doi=myid+1,100,2sum_local=sum_local+ienddoprint*,'myid=',myid,'sum_local=',sum_local
if(myid.eq.1)callMPI_SEND(sum_local,1,MPI_INTEGER,0,99,MPI_COMM_WORLD,ierr)if(myid.eq.0)thencallMPI_RECV(sum_local1,1,MPI_INTEGER,1,99,MPI_COMM_WORLD,status,ierr)sum_global=sum_local+sum_local1print*,'sum_global=',sum_globalendifcallMPI_Finalize(ierr)end例:計(jì)算1+2+3…+100,采用2個(gè)CPU并行CPU0:1+3+5+7…+99CPU1:2+4+6+8…+100“對(duì)等式”編程思路:
站在每個(gè)進(jìn)程的角度思考28結(jié)果顯示29消息傳遞時(shí)要注意防止死鎖緩沖區(qū)(“信箱”)MPI_SendMPI_RecvMPI_Send,MPI_Recv屬于阻塞式發(fā)送/接收
發(fā)送成功
接收成功發(fā)送和接收是兩個(gè)獨(dú)立過(guò)程
子程序返回Send與Recv一定要配合好發(fā)送到“信箱”即為成功30重要!緩沖區(qū)發(fā)生死鎖的情況只發(fā)送,不接收只接收,不發(fā)送緩沖區(qū)?31例,任務(wù):進(jìn)程0發(fā)送變量A給進(jìn)程1
進(jìn)程1發(fā)送變量B給進(jìn)程0
if(myid.eq.0)thencallMPI_send(A,1,MPI_real,1,99,MPI_Comm_World,ierr)callMPI_recv(B,1,MPI_real,1,99,MPI_Comm_World,ierr)Elseif(myid.eq.1)thencallMPI_recv(A,1,MPI_real,0,99,MPI_Comm_World,ierr)callMPI_send(B,1,MPI_real,0,99,MPI_Comm_World,ierr)endif
Step1Step2Step1Step2不會(huì)死鎖32死鎖的例子
if(myid.eq.0)thencallMPI_recv(B,1,MPI_real,1,99,MPI_Comm_World,ierr)callMPI_send(A,1,MPI_real,1,99,MPI_Comm_World,ierr)Elseif(myid.eq.1)thencallMPI_recv(A,1,MPI_real,0,99,MPI_Comm_World,ierr)callMPI_send(B,1,MPI_real,0,99,MPI_Comm_World,ierr)endif
Step1Step1Step2不會(huì)死鎖??Step233有可能死鎖的例子
if(myid.eq.0)thencallMPI_send(A,1,MPI_real,1,99,MPI_Comm_World,ierr)callMPI_recv(B,1,MPI_real,1,99,MPI_Comm_World,ierr)Elseif(myid.eq.1)thencallMPI_send(B,1,MPI_real,0,99,MPI_Comm_World,ierr)callMPI_recv(A,1,MPI_real,0,99,MPI_Comm_World,ierr)endif
Step2Step2Step134使用MPI_Sendrecv()函數(shù)來(lái)避免死鎖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)次序由系統(tǒng)決定35基本的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,count,datatype,source,tag,comm,status,ierr)
MPI只能點(diǎn)到點(diǎn)通信,其他函數(shù)是用這6個(gè)函數(shù)開(kāi)發(fā)的;使用這6個(gè)函數(shù),可以實(shí)現(xiàn)MPI的全部功能。37系統(tǒng)時(shí)間(墻鐘)函數(shù):MPI_Wtime()
real*8::timetime=MPI_Wtime()返回當(dāng)前墻鐘時(shí)間(單位:秒)(Walltime與CPUtime不同,Walltime更可靠)CPU分時(shí)為所有進(jìn)程服務(wù)Real*8::Time_begin,Time_end…(初始化)Time_begin=MPI_Wtime()….….(計(jì)算任務(wù))….CallMPI_Barrier(comm,ierr)Time_end=MPI_Wtime()Print*,“計(jì)算時(shí)間為:”,Time_end-Time_begin…可用來(lái)測(cè)量程序的執(zhí)行速度測(cè)量加速比及并行效率加速比=N個(gè)進(jìn)程的執(zhí)行速度/單個(gè)進(jìn)程的執(zhí)行速度并行效率=加速比/N作者的Hoam-OpenCFD軟件加速比測(cè)試CPUCorenumber1024-16384并行效率89.6%通常要進(jìn)行同步,然后測(cè)量時(shí)間,否則各進(jìn)程報(bào)出的時(shí)間不同。3.常用的MPI函數(shù)1)廣播MPI_Bcast(buff,count,datatype,root,comm,ierr)
參數(shù):數(shù)據(jù)緩沖區(qū),數(shù)目,數(shù)據(jù)類型,根進(jìn)程,通訊域
例:realAif(myid.eq.0)thenopen(55,file=‘data.dat’)read(55,*)Aclose(55)endifcallMPI_Bcast(A,1,MPI_REAL,0,MPI_COMM_WORLD,ierr)廣播:樹(shù)狀傳播,效率較高38……廣播的邏輯圖廣播的實(shí)際實(shí)現(xiàn)方式——樹(shù)狀傳播MPI的消息:只能點(diǎn)到點(diǎn)傳遞;不能真正“廣播”2)規(guī)約(求和,求最大值,求最小值,……)
MPI_Reduce(sendbuf,recvbuf,count,datatype,op,root,comm,ierr)發(fā)送緩沖區(qū),接收緩沖區(qū),數(shù)目,數(shù)據(jù)類型,規(guī)約操作,通訊域!sumfrom1to100!Runonlyfornp=2!!!!include'mpif.h'integermyid,sum_local,sum_global,ierrcallMPI_Init(ierr)callMPI_Comm_Rank(MPI_COMM_WORLD,myid,ierr)sum_local=0doi=myid+1,100,2sum_local=sum_local+ienddo
callMPI_Reduce(sum_local,sum_global,1,MPI_INTEGER,&MPI_SUM,0,MPI_COMM_WORLD,ierr)print*,'sum_global=',sum_globalcallMPI_Finalize(ierr)end39預(yù)定義的規(guī)約操作:MPI_MAX最大值MPI_LXOR邏輯異或MPI_MIN最小值MPI_BXOR按位異或MPI_SUM求和MPI_MAXLOC最大值及位置MPI_PROD求積MPI_MINLOC最小值及位置MPI_LAND邏輯與MPI_BAKD按位與MPI_LOR邏輯或MPI_BOR安位或40同步MPI_Barrier(comm,ierr)Comm:通訊域,ierr:返回值等待所有進(jìn)程都調(diào)用MPI_Barrier(),函數(shù)才能返回…………CallMPI_barrier(MPI_COMM_WORLD,ierr)……41424.“對(duì)等式”編程示例例1:全收集的實(shí)現(xiàn)MPI_Allgather()題目:N個(gè)進(jìn)程,每個(gè)進(jìn)程有一個(gè)數(shù)A;把所有進(jìn)程的數(shù)收集起來(lái),按進(jìn)程號(hào)的次序形成數(shù)組A0(1:N),存放到所有進(jìn)程中。
把每個(gè)同學(xué)的電話號(hào)碼收集起來(lái),形成通訊錄,發(fā)給全班同學(xué)也可以是數(shù)組,各進(jìn)程的數(shù)A可以不同
A0(1)
A0(2)
A0(3)
A0(4)方式1:
根進(jìn)程收集所有數(shù)據(jù);根進(jìn)程發(fā)送到所有進(jìn)程
if(myid.eq.0)thenA0(0)=Adoid=1,Nproc-1
callMPI_Recv(A0(id),1,MPI_Real,id,99,MPI_Comm_World,status,ierr)enddoelsecallMPI_Send(A,1,MPI_Real,0,…...)endifif(myid.eq.0)thendoid=1,Nproc-1callMPI_Send(A0,Nproc,MPI_Real,id,……)enddoelsecallMPI_Recv(A0,Nproc,MPI_Real,0,……)endif43“班長(zhǎng)”依次與所有同學(xué)通信,收集信息;收集后依次通信,發(fā)放信息負(fù)載不均衡效率最低可能會(huì)死鎖方式2:
根進(jìn)程收集所有數(shù)據(jù);根進(jìn)程廣播到所有進(jìn)程
if(myid.eq.0)thenA0(0)=Adoid=1,Nproc-1
callMPI_Recv(A0(id),1,MPI_Real,id,99,MPI_Comm_World,status,ierr)enddoelsecallMPI_Send(A,1,MPI_Real,0,…...)endifcallMPI_Bcast(A0,Nproc,MPI_Real,0,MPI_Comm_world,ierr)
效率高于(1)是MPI_Allgather()的原有的標(biāo)準(zhǔn)方式44廣播的實(shí)現(xiàn)方式“班長(zhǎng)”依次收集信息后,“廣播”給全班45……1AsendtoID00123N-1……1B0123N-1Step1:“我”(my_id進(jìn)程)向my_id+1進(jìn)程發(fā)數(shù)據(jù);
“我”收my_id-1進(jìn)程發(fā)來(lái)的數(shù)據(jù)該步完成后:
“我”(my_id進(jìn)程)得到了my_id-1的數(shù)據(jù)全收集的實(shí)現(xiàn)圖解方式3:循環(huán)通信46……2AsendtoID10123N-1……2B0123N-1Step2:
“我”向my_id+2進(jìn)程發(fā)數(shù)據(jù);
“我”收my_id-2進(jìn)程發(fā)來(lái)的數(shù)據(jù);該步完成后:“我”得到了my_id-1,my_id-2進(jìn)程的數(shù)據(jù)Step3:我向my_id+3發(fā)數(shù)據(jù),我收my_id-3發(fā)來(lái)的數(shù)據(jù)……StepN-1完成后,我得到了全部數(shù)據(jù);
全體進(jìn)程也得到了全部數(shù)據(jù)對(duì)等式編程思想:每個(gè)人做好自己的工作,全部工作就做好了不設(shè)班長(zhǎng),所有人工作量相同循環(huán)通訊:由張林波研究員首次提出
dostep=1,Nproc-1id_send=myid+step;if(id_send.ge.Nproc)id_send=id_send-Nprocid_recv=myid-step;if(id_recv.lt.0)id_recv=id_recv+NproccallMPI_Send(A,1,MPI_Real,id_send,99,&MPI_Comm_World,ierr)callMPI_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)方式47
計(jì)算矩陣A*B=C,A,B,C:N*N矩陣
采用P個(gè)進(jìn)程計(jì)算(N能被P整除)
存儲(chǔ)方式:分布存儲(chǔ),A,C按行分割,B按列分割矩陣ABC48例2.計(jì)算矩陣乘積“對(duì)等式”程序設(shè)計(jì)思想:站在每個(gè)進(jìn)程角度思考
“我”的數(shù)據(jù):dimensionA1(N/P,N),B1(N,N/P),C1(N/P,N)
“我”的任務(wù):計(jì)算C10,……K…P-1ACBA1B1C149需要得到整個(gè)矩陣B——自己只有Bk——向他人索取doid=0,P-1callMPI_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,……K…P-1ACB如何完成任務(wù)?B_tmp(N,N/P,P)C1(0)C1(1)C150B順次發(fā)送數(shù)據(jù)dostep=0,P-1if(myid.eq.step)thendoid=0,P-1callMPI_Send(B1,N*N/P,MPI_REAL,id,……)enddoendifcallMPI_Recv(B_tmp,N*N/P,MPI_REAL,step,…)……計(jì)算出C1(id)……(C1(id)=A1*B_tmp)enddo
問(wèn)題:負(fù)載不均衡實(shí)際上是串行
51一窩蜂地涌向同一個(gè)進(jìn)程,負(fù)載不均衡,容易阻塞B按節(jié)拍循環(huán)發(fā)送數(shù)據(jù)(同“全收集”)
dostep
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 【北師】期末模擬卷01【九年級(jí)上下全冊(cè)】
- 2024保育員技師理論考試172題(附答案)
- 讓垃圾分類演講稿范文
- 飲用水安全應(yīng)急預(yù)案
- 腳手架施工方案15篇
- 幼兒園班主任個(gè)人工作述職報(bào)告
- 煤礦實(shí)習(xí)總結(jié)范文
- 九年級(jí)禁止燃放煙花爆竹承諾書(35篇)
- 音樂(lè)活動(dòng)總結(jié)
- 22.3 實(shí)踐與探索 同步練習(xí)
- 2023年全國(guó)中小學(xué)思政課教師網(wǎng)絡(luò)培訓(xùn)研修總結(jié)心得體會(huì)
- 《走進(jìn)芭蕾-中外芭蕾經(jīng)典作品鑒賞》學(xué)習(xí)通超星課后章節(jié)答案期末考試題庫(kù)2023年
- 口腔修復(fù)學(xué):全口義齒課件
- 紫金礦業(yè)污染事件商業(yè)倫理分析
- 宮頸及陰道上藥的護(hù)理(婦產(chǎn)科護(hù)理課件)
- 人教精通版英語(yǔ)五上Unit5《Isthisyourschoolbag》教案
- 2023年口腔醫(yī)學(xué)期末復(fù)習(xí)-牙周病學(xué)(口腔醫(yī)學(xué))考試歷年真題精華集選附答案
- 中小學(xué)教師教育教學(xué)水平能力測(cè)試成績(jī)單
- 互聯(lián)網(wǎng)醫(yī)院整體方案介紹-PPT
- 4.2.1指數(shù)函數(shù)的概念 課件(共21張PPT)
- 嬰幼兒盥洗照料(嬰幼兒回應(yīng)性照護(hù)課件)
評(píng)論
0/150
提交評(píng)論