版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)
文檔簡介
1、2021年6月MPI并行程序設(shè)計自學(xué)教程1 并行程序設(shè)計簡介并行程序設(shè)計簡介 2021年6月MPI并行程序設(shè)計自學(xué)教程2 講座內(nèi)容提示講座內(nèi)容提示 基本概念 基本的MPI 點到點通信(Point to point) MPI中API的主要內(nèi)容,為MPI最基本,最重要 的內(nèi)容 MPI程序的編譯和運行 實例 2021年6月MPI并行程序設(shè)計自學(xué)教程3 參考文獻參考文獻 MPI-the complete reference. Marc Snir, MIT Press, 1998. ISBN 0262692155, 0262692163. Using MPI : portable parallel pr
2、ogramming with the message-passing interface, William 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并行程序設(shè)計,都志,都志 輝,清華大學(xué)出版社,輝,清華大學(xué)出版社, 2001年年8月。月。 2021年6月MPI并行程序設(shè)
3、計自學(xué)教程4 多線程庫標(biāo)準(zhǔn) Win32 API. POSIX threads. 編譯制導(dǎo)標(biāo)準(zhǔn) OpenMP 可移植共享存儲并行編可移植共享存儲并行編 程標(biāo)準(zhǔn)程標(biāo)準(zhǔn). 消息傳遞庫標(biāo)準(zhǔn) MPI PVM 并行編程標(biāo)準(zhǔn) 本討論的重點本討論的重點 2021年6月MPI并行程序設(shè)計自學(xué)教程5 消息傳遞并行程序設(shè)計 消息傳遞并行程序設(shè)計 指用戶必須通過顯式地發(fā)送和接收消息來實現(xiàn)處理機間的數(shù)據(jù)交指用戶必須通過顯式地發(fā)送和接收消息來實現(xiàn)處理機間的數(shù)據(jù)交 換。換。 在這種并行編程中,每個并行進程均有自己獨立的地址空間,相在這種并行編程中,每個并行進程均有自己獨立的地址空間,相 互之間訪問不能直接進行,必須通過顯式
4、的消息傳遞來實現(xiàn)?;ブg訪問不能直接進行,必須通過顯式的消息傳遞來實現(xiàn)。 這種編程方式是大規(guī)模并行處理機(這種編程方式是大規(guī)模并行處理機(MPP)和機群()和機群(Cluster)采)采 用的主要編程方式。用的主要編程方式。 并行計算粒度大,特別適合于大規(guī)??蓴U展并行算法 由于消息傳遞程序設(shè)計要求用戶很好地分解問題由于消息傳遞程序設(shè)計要求用戶很好地分解問題,組織不同進程間組織不同進程間 的數(shù)據(jù)交換的數(shù)據(jù)交換,并行計算粒度大并行計算粒度大,特別適合于大規(guī)??蓴U展并行算法特別適合于大規(guī)??蓴U展并行算法. 消息傳遞是當(dāng)前并行計算領(lǐng)域的一個非常重要的并行程序 設(shè)計方式 2021年6月MPI并行程序設(shè)計
5、自學(xué)教程6 什么是MPI? Massage Passing Interface:是消息傳遞是消息傳遞 函數(shù)庫的標(biāo)準(zhǔn)規(guī)范,由函數(shù)庫的標(biāo)準(zhǔn)規(guī)范,由MPI論壇開發(fā),支持論壇開發(fā),支持 Fortran和和C 一種新的庫描述,不是一種語言。共有上百個一種新的庫描述,不是一種語言。共有上百個 函數(shù)調(diào)用接口,在函數(shù)調(diào)用接口,在Fortran和和C語言中可以直接語言中可以直接 對這些函數(shù)進行調(diào)用對這些函數(shù)進行調(diào)用 MPI是一種標(biāo)準(zhǔn)或規(guī)范的代表,而不是特指某是一種標(biāo)準(zhǔn)或規(guī)范的代表,而不是特指某 一個對它的具體實現(xiàn)一個對它的具體實現(xiàn) MPI是一種消息傳遞編程模型,并成為這種編是一種消息傳遞編程模型,并成為這種編
6、程模型的代表和事實上的標(biāo)準(zhǔn)程模型的代表和事實上的標(biāo)準(zhǔn) 2021年6月MPI并行程序設(shè)計自學(xué)教程7 MPI的發(fā)展過程 發(fā)展的兩個階段發(fā)展的兩個階段 MPI 1.1: 1995 MPICH:是是MPI最流行的非專利實現(xiàn)最流行的非專利實現(xiàn),由由Argonne國國 家實驗室和密西西比州立大學(xué)聯(lián)合開發(fā)家實驗室和密西西比州立大學(xué)聯(lián)合開發(fā),具有更好的具有更好的 可移植性可移植性. MPI 1.22.0:動態(tài)進程動態(tài)進程, 并行并行 I/O, 遠程存儲訪遠程存儲訪 問、支持問、支持F90和和C+(1997). 2021年6月MPI并行程序設(shè)計自學(xué)教程8 為什么要用為什么要用MPI? 高可移植性 MPI已在已在
7、IBM PC機上、機上、MS Windows上、所有主要的上、所有主要的 Unix工作站上和所有主流的并行機上得到實現(xiàn)。使用工作站上和所有主流的并行機上得到實現(xiàn)。使用 MPI作消息傳遞的作消息傳遞的C或或Fortran并行程序可不加改變地運并行程序可不加改變地運 行在行在IBM PC、MS Windows、Unix工作站、以及各種工作站、以及各種 并行機上。并行機上。 2021年6月MPI并行程序設(shè)計自學(xué)教程9 :從簡單入手從簡單入手 Init和Finalize 下面我們首先分別以下面我們首先分別以C語言和語言和Fortran語言語言 的形式給出一個最簡單的的形式給出一個最簡單的MPI并行程序
8、并行程序 Hello (下頁下頁). 該程序在終端打印出該程序在終端打印出Hello World!字樣字樣. “Hello World”:一聲來自新生兒的問候一聲來自新生兒的問候. 2021年6月MPI并行程序設(shè)計自學(xué)教程10 Hello world(C) #include #include mpi.h“ main( int argc, char *argv ) MPI_Init( printf( Hello, world!n ); MPI_Finalize(); 2021年6月MPI并行程序設(shè)計自學(xué)教程11 Hello world(Fortran) program main include
9、mpif.h integer ierr call MPI_INIT( ierr ) print *, Hello, world! call MPI_FINALIZE( ierr ) end 2021年6月MPI并行程序設(shè)計自學(xué)教程12 C和Fortran中MPI函數(shù)約定 C 必須包含必須包含mpi.h. MPI 函數(shù)返回出錯代碼或函數(shù)返回出錯代碼或 MPI_SUCCESS成功標(biāo)志. MPI-前綴,且只有前綴,且只有MPI以及以及MPI_標(biāo)志后的第一個字母大寫,其標(biāo)志后的第一個字母大寫,其 余小寫余小寫. Fortran 必須包含必須包含mpif.h. 通過子函數(shù)形式調(diào)用通過子函數(shù)形式調(diào)用MPI
10、,函數(shù)最后一個參數(shù)為返回值,函數(shù)最后一個參數(shù)為返回值. MPI-前綴,且函數(shù)名全部為大寫前綴,且函數(shù)名全部為大寫. MPI函數(shù)函數(shù)的參數(shù)被標(biāo)志為以下三種類型:的參數(shù)被標(biāo)志為以下三種類型: IN:參數(shù)在例程的調(diào)用中不會被修正:參數(shù)在例程的調(diào)用中不會被修正. OUT:參數(shù)在例程的調(diào)用中可能會被修正:參數(shù)在例程的調(diào)用中可能會被修正. INOUT:參數(shù)有初始值,且在例程的調(diào)用中可能會被修正:參數(shù)有初始值,且在例程的調(diào)用中可能會被修正 2021年6月MPI并行程序設(shè)計自學(xué)教程13 MPI初始化初始化-MPI_INIT int MPI_Init(int *argc, char *argv) MPI_INI
11、T(IERROR) MPI_INIT是是MPI程序的第一個調(diào)用,它完成程序的第一個調(diào)用,它完成 MPI程序的所有初始化工作。所有的程序的所有初始化工作。所有的MPI程序程序 的第一條可執(zhí)行語句都是這條語句。的第一條可執(zhí)行語句都是這條語句。 啟動啟動MPI環(huán)境環(huán)境,標(biāo)志并行代碼的開始標(biāo)志并行代碼的開始. 并行代碼之前并行代碼之前,第一個第一個mpi函數(shù)函數(shù)(除除 MPI_Initialized()外外). 要求要求main必須帶參數(shù)運行必須帶參數(shù)運行,否則出錯否則出錯. 2021年6月MPI并行程序設(shè)計自學(xué)教程14 MPI結(jié)束結(jié)束-MPI_FINALIZE int MPI_Finalize(vo
12、id) MPI_FINALIZE(IERROR) MPI_FINALIZE是是MPI程序的最后一個調(diào)用,程序的最后一個調(diào)用, 它結(jié)束它結(jié)束MPI程序的運行,它是程序的運行,它是MPI程序的最后程序的最后 一條可執(zhí)行語句,否則程序的運行結(jié)果是不可一條可執(zhí)行語句,否則程序的運行結(jié)果是不可 預(yù)知的。預(yù)知的。 標(biāo)志并行代碼的結(jié)束標(biāo)志并行代碼的結(jié)束,結(jié)束除主進程外其它進程結(jié)束除主進程外其它進程. 之后串行代碼仍可在主進程之后串行代碼仍可在主進程(rank = 0)上運行上運行 (如果必須如果必須). 2021年6月MPI并行程序設(shè)計自學(xué)教程15 MPI程序的的編譯與運行程序的的編譯與運行 mpif77
13、hello.f 或或 mpicc hello.c 默認(rèn)生成默認(rèn)生成a.out的可執(zhí)行代碼的可執(zhí)行代碼. mpif77 o hello hello.f 或或 mpicc o hello hello.c 生成生成hello的可執(zhí)行代碼的可執(zhí)行代碼. mpirun np 4 a.out mpirun np 4 hello 4 指定指定np的實參的實參,表示進程數(shù)表示進程數(shù),由用戶指定由用戶指定. a.out / hello 要運行的要運行的MPI并行程序并行程序. %小寫o %np: The number of process. 2021年6月MPI并行程序設(shè)計自學(xué)教程16 :運行我們的運行我們的M
14、PI程序程序! dairnode01 $ mpicc -o hello hello.c dairnode01 $ ./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 $ 計算機打印字符 我們輸入的命令 2021年6月M
15、PI并行程序設(shè)計自學(xué)教程17 :Hello是如何被執(zhí)行的是如何被執(zhí)行的? SPMD: Single Program Multiple Data(SIMD) : #include mpi.h #include main( int argc, char *argv ) MPI_Init( printf( Hello, world!n ); MPI_Finalize(); #include mpi.h #include main( int argc, char *argv ) MPI_Init( printf( Hello, world!n ); MPI_Finalize(); #include m
16、pi.h #include main( int argc, char *argv ) MPI_Init( printf( Hello, world!n ); MPI_Finalize(); #include mpi.h #include main( int argc, char *argv ) MPI_Init( printf( Hello, world!n ); MPI_Finalize(); Hello World! Hello World! Hello World! Hello World! #include mpi.h #include main( int argc, char *ar
17、gv ) MPI_Init( printf( Hello, world!n ); MPI_Finalize(); rshssh 2021年6月MPI并行程序設(shè)計自學(xué)教程18 :開始寫開始寫MPI并行程序并行程序 Comm_size和Comm_rank 在寫在寫MPI程序時,我們常需要知道以下兩個程序時,我們常需要知道以下兩個 問題的答案:問題的答案: 任務(wù)由多少個進程來進行并行計算? 我是哪一個進程? 2021年6月MPI并行程序設(shè)計自學(xué)教程19 MPI 提供了下列函數(shù)來回答這些問題:提供了下列函數(shù)來回答這些問題: 用MPI_Comm_size 獲得進程個數(shù)獲得進程個數(shù) p int MPI_C
18、omm_size(MPI_Comm comm, int *size); 用MPI_Comm_rank 獲得進程的一個叫獲得進程的一個叫rank的的 值,該值,該 rank值為值為0到到p-1間的整數(shù)間的整數(shù),相當(dāng)于進程相當(dāng)于進程 的的ID int MPI_Comm_rank(MPI_Comm comm, int *rank); 2021年6月MPI并行程序設(shè)計自學(xué)教程20 更新的更新的Hello World(c) #include #include mpi.h main( int argc, char *argv ) int myid, numprocs; MPI_Init( MPI_Comm
19、_rank( MPI_COMM_WORLD, MPI_Comm_size( MPI_COMM_WORLD, printf(“I am %d of %dn, myid, numprocs ); MPI_Finalize(); 2021年6月MPI并行程序設(shè)計自學(xué)教程21 更新的更新的Hello World(F77) program main include mpif.h integer ierr, myid, numprocs call MPI_INIT( ierr ) call MPI_COMM_RANK( MPI_COMM_WORLD, myid, ierr ) call MPI_COMM_
20、SIZE( MPI_COMM_WORLD, numprocs, ierr ) print *, I am, myid, of, numprocs call MPI_FINALIZE( ierr ) end 2021年6月MPI并行程序設(shè)計自學(xué)教程22 :運行結(jié)果運行結(jié)果 dairnode01 $ mpicc o hello1 hello1.c dairnode01 $ mpirun -np 4 hello1 I am 0 of 4 I am 1 of 4 I am 2 of 4 I am 3 of 4 dairnode01 $ 計算機打印字符 我們輸入的命令 2021年6月MPI并行程序設(shè)計自
21、學(xué)教程23 :寫寫MPI并行通信程序并行通信程序 -Send和Recv 進程 0進程 0 rank=0rank=0 . . . . Send()Send() . . . . . . 進程 1進程 1 rank=1rank=1 進程 2進程 2 rank=2rank=2 進程 3進程 3 rank=3rank=3 . . . . Send()Send() . . . . . . . . . . Send()Send() . . . . . . . . . . Recv()Recv() . . . . . . 2021年6月MPI并行程序設(shè)計自學(xué)教程24 有消息傳遞有消息傳遞greetings(c
22、) #include #include mpi.h main(int argc, char* argv) int numprocs, myid, source; MPI_Status status; char message100; MPI_Init( MPI_Comm_rank(MPI_COMM_WORLD, MPI_Comm_size(MPI_COMM_WORLD, 2021年6月MPI并行程序設(shè)計自學(xué)教程25 有消息傳遞有消息傳遞greetings(c) if (myid != 0) strcpy(message, Hello World!); MPI_Send(message,strl
23、en(message)+1, MPI_CHAR, 0,99, MPI_COMM_WORLD); else /* myid = 0 */ for (source = 1; source numprocs; source+) MPI_Recv(message, 100, MPI_CHAR, source, 99, MPI_COMM_WORLD, printf(%sn, message); MPI_Finalize(); /* end main */ 2021年6月MPI并行程序設(shè)計自學(xué)教程26 解剖解剖greetings程序程序 頭文件頭文件: mpi.h/mpif.h. int MPI_Init
24、(int int MPI_Init(int * *argc, char argc, char * * * *argv) argv) 啟動啟動MPI環(huán)境環(huán)境,標(biāo)志并行代碼的開始標(biāo)志并行代碼的開始. 并行代碼之前并行代碼之前,第一個第一個mpi函數(shù)函數(shù)(除除MPI_Initialize()外外). 要求要求main必須帶參數(shù)運行必須帶參數(shù)運行,否則出錯否則出錯. 通信域通信域(通信空間通信空間): MPI_COMM_WORLD: 一個通信空間是一個進程組和一個上下文的組合一個通信空間是一個進程組和一個上下文的組合.上下文可看作為上下文可看作為 組的超級標(biāo)簽組的超級標(biāo)簽,用于區(qū)分不同的通信域用于區(qū)分
25、不同的通信域. 在執(zhí)行函數(shù)在執(zhí)行函數(shù)MPI_Init之后之后,一個一個MPI程序的所有進程形成一個缺省程序的所有進程形成一個缺省 的組的組,這個組的通信域即被寫作這個組的通信域即被寫作MPI_COMM_WORLD. 該參數(shù)是該參數(shù)是MPI通信操作函數(shù)中必不可少的參數(shù)通信操作函數(shù)中必不可少的參數(shù),用于限定參加通信用于限定參加通信 的進程的范圍的進程的范圍. 2021年6月MPI并行程序設(shè)計自學(xué)教程27 解剖解剖greetings程序程序 int MPI_Comm_size ( MPI_Comm comm, int int MPI_Comm_size ( MPI_Comm comm, int *
26、*size )size ) 獲得通信空間獲得通信空間comm中規(guī)定的組包含的進程的數(shù)量中規(guī)定的組包含的進程的數(shù)量. 指定一個指定一個communicator,也指定了一組共享該空間的進程也指定了一組共享該空間的進程, 這些這些 進程組成該進程組成該communicator的的group. int MPI_Comm_rank ( MPI_Comm comm, int int MPI_Comm_rank ( MPI_Comm comm, int * *rank ) rank ) 得到本進程在通信空間中的得到本進程在通信空間中的rank值值,即在組中的邏輯編號即在組中的邏輯編號(從從0開始開始).
27、int MPI_Finalize() int MPI_Finalize() 標(biāo)志并行代碼的結(jié)束標(biāo)志并行代碼的結(jié)束,結(jié)束除主進程外其它進程結(jié)束除主進程外其它進程. 之后串行代碼仍可在主進程之后串行代碼仍可在主進程(rank = 0)上運行上運行(如果必須如果必須). 2021年6月MPI并行程序設(shè)計自學(xué)教程28 講座內(nèi)容提示講座內(nèi)容提示 基本的基本的MPI 基本概念基本概念 點到點通信點到點通信(Point to point) MPI中中API的主要內(nèi)容,為的主要內(nèi)容,為MPI最基本,最重要的內(nèi)容最基本,最重要的內(nèi)容 MPI程序的編譯和運行程序的編譯和運行 深入深入MPI 用戶自定義用戶自定義(
28、/派生派生)數(shù)據(jù)類型數(shù)據(jù)類型(User-defined(Derived) data type) 事實上事實上MPI的所有數(shù)據(jù)類型均為的所有數(shù)據(jù)類型均為MPI自定義類型自定義類型 支持異構(gòu)系統(tǒng)支持異構(gòu)系統(tǒng) 允許消息來自不連續(xù)的或類型不一致的存儲區(qū)允許消息來自不連續(xù)的或類型不一致的存儲區(qū)(結(jié)構(gòu)結(jié)構(gòu),數(shù)組散元數(shù)組散元) 集合通信集合通信(Collective) 數(shù)據(jù)移動,數(shù)據(jù)聚集,同步數(shù)據(jù)移動,數(shù)據(jù)聚集,同步 基于基于point to point 構(gòu)建構(gòu)建 MPI環(huán)境管理函數(shù)環(huán)境管理函數(shù) 組組,上下文和通信空間上下文和通信空間/通信域的管理通信域的管理 實例實例 2021年6月MPI并行程序設(shè)計自學(xué)
29、教程29 Point to Point通信通信 單個進程對單個進程的通信單個進程對單個進程的通信,重要且復(fù)雜重要且復(fù)雜 術(shù)語術(shù)語 Blocking(阻塞阻塞) :一個例程須等待操作完成才返回一個例程須等待操作完成才返回,返回返回 后用戶可以重新使用調(diào)用中所占用的資源后用戶可以重新使用調(diào)用中所占用的資源. Non-blocking(非阻塞非阻塞):一個例程不必等待操作完成便一個例程不必等待操作完成便 可返回可返回,但這并不意味著所占用的資源可被重用但這并不意味著所占用的資源可被重用. Local(本地本地):過程的完成僅依賴于本地正在執(zhí)行的進程。過程的完成僅依賴于本地正在執(zhí)行的進程。 Non-l
30、ocal(非本地非本地):如果過程的完成要求其他進程的如果過程的完成要求其他進程的 MPI 過程完成。過程完成。 2021年6月MPI并行程序設(shè)計自學(xué)教程30 Blocking Send int 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 目標(biāo)進程的rank值 IN tag 消息標(biāo)簽 IN comm 通信域 2021年6月MPI
31、并行程序設(shè)計自學(xué)教程31 Blocking Receive int 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 目標(biāo)進程的rank值 IN tag 消息標(biāo)簽 IN comm 通信域 OUT statusstatus對象,包含實際接收到的消息的有關(guān)信息 2021年6月MPI并行程序設(shè)計
32、自學(xué)教程32 MPI消息消息 MPI消息包括信封和數(shù)據(jù)兩個部分,信封指消息包括信封和數(shù)據(jù)兩個部分,信封指 出了發(fā)送或接收消息的對象及相關(guān)信息,出了發(fā)送或接收消息的對象及相關(guān)信息, 而數(shù)據(jù)是本消息將要傳遞的內(nèi)容而數(shù)據(jù)是本消息將要傳遞的內(nèi)容 數(shù)據(jù):數(shù)據(jù): 信封:信封: 2021年6月MPI并行程序設(shè)計自學(xué)教程33 2021年6月MPI并行程序設(shè)計自學(xué)教程34 消息數(shù)據(jù)消息數(shù)據(jù) 由由count個類型為個類型為datatype的連續(xù)數(shù)據(jù)空間的連續(xù)數(shù)據(jù)空間 組成組成, 起始地址為起始地址為buf 不是以字節(jié)數(shù)不是以字節(jié)數(shù), 而是以元素的個數(shù)指定消息而是以元素的個數(shù)指定消息 的長度的長度 count可以是
33、零可以是零, 這種情況下消息的數(shù)據(jù)部這種情況下消息的數(shù)據(jù)部 分是空的分是空的 MPI基本數(shù)據(jù)類型相應(yīng)于宿主語言的基本數(shù)基本數(shù)據(jù)類型相應(yīng)于宿主語言的基本數(shù) 據(jù)類型據(jù)類型 2021年6月MPI并行程序設(shè)計自學(xué)教程35 MPI基本數(shù)據(jù)類型 2021年6月MPI并行程序設(shè)計自學(xué)教程36 MPI標(biāo)識一條消息的信息包含四個域: Source: 發(fā)送進程隱式確定發(fā)送進程隱式確定,由進程的由進程的rank值唯一標(biāo)識值唯一標(biāo)識 Destination: Send函數(shù)參數(shù)確定函數(shù)參數(shù)確定 Tag: Send函數(shù)參數(shù)確定函數(shù)參數(shù)確定,用于識別不同的消息用于識別不同的消息 (0,UB),UB:MPI_TAG_UB=3
34、2767. Communicator: 缺省缺省MPI_COMM_WORLD Group:有限有限/N,有序,有序/Rank 0,1,2,N-1 Contex:Super_tag,用于標(biāo)識該通訊空間用于標(biāo)識該通訊空間. 消息信封消息信封 2021年6月MPI并行程序設(shè)計自學(xué)教程37 status參數(shù)參數(shù) 當(dāng)使用MPI_ANY_SOURCE或/和MPI_ANY_TAG接收消 息時如何確定消息的來源source 和 tag值呢? 在在C C中,結(jié)構(gòu),中,結(jié)構(gòu),status.MPI_SOURCE, status.MPI_TAG.status.MPI_SOURCE, status.MPI_TAG. 在
35、在FortranFortran中,數(shù)組,中,數(shù)組,source=status(MPI_SOURCE), source=status(MPI_SOURCE), tag=status(MPI_TAG).tag=status(MPI_TAG). Status還可用于返回實際接收到消息的長度 int MPI_Get_count(MPI_Status status, int MPI_Get_count(MPI_Status status, MPI_Datatype datatype,intMPI_Datatype datatype,int* * count) count) IN status IN st
36、atus 接收操作的返回值接收操作的返回值. . IN datatype IN datatype 接收緩沖區(qū)中元素的數(shù)據(jù)類型接收緩沖區(qū)中元素的數(shù)據(jù)類型. . OUT count OUT count 接收消息中的元素個數(shù)接收消息中的元素個數(shù). . 2021年6月MPI并行程序設(shè)計自學(xué)教程38 消息匹配消息匹配 接收接收buffer必須至少可以容納必須至少可以容納count個由個由datatype參數(shù)指參數(shù)指 明類型的數(shù)據(jù)明類型的數(shù)據(jù). 如果接收如果接收buf太小太小, 將導(dǎo)致溢出、出錯將導(dǎo)致溢出、出錯. 消息匹配消息匹配 參數(shù)匹配參數(shù)匹配 dest,tag,comm/ source,tag,co
37、mm Source = MPI_ANY_SOURCE:接收任意處理器來的數(shù)據(jù):接收任意處理器來的數(shù)據(jù)(任任 意消息來源意消息來源). Tag = MPI_ANY_TAG:匹配任意:匹配任意tag值的消息值的消息(任意任意tag消息消息). Source = destination 是允許的是允許的, 但是不安全的但是不安全的, 可能導(dǎo)可能導(dǎo) 致死鎖。致死鎖。 消息傳送被限制在同一個消息傳送被限制在同一個communicator. 在在send函數(shù)中必須指定唯一的接收者函數(shù)中必須指定唯一的接收者(Push/pull通訊機通訊機 制制). 2021年6月MPI并行程序設(shè)計自學(xué)教程39 分析分析gr
38、eetings #include #include mpi.h“ main(int argc, char* argv) int numprocs; /*進程數(shù),該變量為各處理器中的同名變量, 存儲是分布的*/ int myid;/*我的進程ID,存儲也是分布的*/ MPI_Status status; /*消息接收狀態(tài)變量,存儲也是分布的*/ char message100;/*消息buffer,存儲也是分布的*/ /*初始化MPI*/ MPI_Init(MPI_Init( /*該函數(shù)被各進程各調(diào)用一次,得到自己的進程rank值*/ MPI_Comm_rank(MPI_COMM_WORLD,
39、MPI_Comm_rank(MPI_COMM_WORLD, /*該函數(shù)被各進程各調(diào)用一次,得到進程數(shù)*/ MPI_Comm_size(MPI_COMM_WORLD, MPI_Comm_size(MPI_COMM_WORLD, 2021年6月MPI并行程序設(shè)計自學(xué)教程40 分析分析greetings if (myid != 0) if (myid != 0) /*建立消息*/ sprintf(message, Greetings from process %d!,myid); sprintf(message, Greetings from process %d!,myid); /* 發(fā)送長度取s
40、trlen(message)+1strlen(message)+1,使00也一同發(fā)送出去*/ MPI_Send(message,strlen(message)+1, MPI_CHAR, 0,99,MPI_COMM_WORLD); MPI_Send(message,strlen(message)+1, MPI_CHAR, 0,99,MPI_COMM_WORLD); elseelse / /* * my_rank = 0 my_rank = 0 * */ / for (source = 1; source numprocs; source+) for (source = 1; source num
41、procs; source+) MPI_Recv(message, 100, MPI_CHAR, source, 99, MPI_COMM_WORLD, MPI_Recv(message, 100, MPI_CHAR, source, 99, MPI_COMM_WORLD, printf(“%sn, message); printf(“%sn, message); /*關(guān)閉MPIMPI,標(biāo)志并行代碼段的結(jié)束*/ MPI_Finalize();MPI_Finalize(); / /* * End main End main * */ / 2021年6月MPI并行程序設(shè)計自學(xué)教程41 Greeti
42、ngs執(zhí)行過程執(zhí)行過程 假設(shè)進程數(shù)為3 (進程進程0) (進程進程1) (進程進程2) (rank=0) (rank=1) (rank=2) (rank=0) (rank=1) (rank=2) . . Recv(); . . Recv(); . . . . . Send(); . . . . . . Send() . . . 問題:進程1和2誰先開始發(fā)送消息?誰先完成發(fā)送? ? % 2021年6月MPI并行程序設(shè)計自學(xué)教程42 運行運行g(shù)reetings dairnode01 $ mpicc o greeting greeting.c dairnode01 $ mpirun -np 4 gr
43、eeting Greetings from process 1! Greetings from process 2! Greetings from process 3! dairnode01 $ 計算機打印字符 我們輸入的命令 2021年6月MPI并行程序設(shè)計自學(xué)教程43 最基本的最基本的MPI MPI調(diào)用借口的總數(shù)雖然龐大,但根據(jù)實際編寫調(diào)用借口的總數(shù)雖然龐大,但根據(jù)實際編寫MPI的經(jīng)驗,的經(jīng)驗, 常用的常用的MPI調(diào)用的個數(shù)非常有限。上面介紹的是調(diào)用的個數(shù)非常有限。上面介紹的是6個最基本個最基本 的的MPI函數(shù)。函數(shù)。 MPI_Init(); MPI_Comm_size(); MPI_Comm_rank(); MPI_Send(); MPI_Recv(); 1. MPI_Finalize(); MPI_Init(); 并行代碼并行代碼; MPI_Fainalize(); 只能有串行代碼只能有串行代碼; 2021年6月MPI并行程序設(shè)計自學(xué)教程44 現(xiàn)在您已經(jīng)能現(xiàn)在您已經(jīng)能 夠用夠用MPI進行并進行并 行編程了行編程了! 2021年6月MPI并行程序設(shè)計自學(xué)教程45
溫馨提示
- 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)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 金融幫扶框架協(xié)議書
- 律師委托代理協(xié)議包干
- 2025版?zhèn)€人獨資企業(yè)股權(quán)置換及轉(zhuǎn)讓合同范本2篇
- 2025版二手房買賣退房條件協(xié)議書
- 2025-2030全球液體金合歡烯橡膠行業(yè)調(diào)研及趨勢分析報告
- 2025-2030全球變頻用移相變壓器行業(yè)調(diào)研及趨勢分析報告
- 2025-2030全球國防輕型戰(zhàn)術(shù)車輛行業(yè)調(diào)研及趨勢分析報告
- 2025-2030全球高性能碳纖維材料行業(yè)調(diào)研及趨勢分析報告
- 食堂炊事員聘用協(xié)議范本
- 2025年度個人自有房產(chǎn)租賃轉(zhuǎn)租委托協(xié)議3篇
- 電纜擠塑操作手冊
- 浙江寧波鄞州區(qū)市級名校2025屆中考生物全真模擬試卷含解析
- 2024-2025學(xué)年廣東省深圳市南山區(qū)監(jiān)測數(shù)學(xué)三年級第一學(xué)期期末學(xué)業(yè)水平測試試題含解析
- IATF16949基礎(chǔ)知識培訓(xùn)教材
- 【MOOC】大學(xué)生創(chuàng)新創(chuàng)業(yè)知能訓(xùn)練與指導(dǎo)-西北農(nóng)林科技大學(xué) 中國大學(xué)慕課MOOC答案
- 勞務(wù)派遣公司員工考核方案
- 基礎(chǔ)生態(tài)學(xué)-7種內(nèi)種間關(guān)系
- 2024年光伏農(nóng)田出租合同范本
- 《阻燃材料與技術(shù)》課件 第3講 阻燃基本理論
- 2024-2030年中國黃鱔市市場供需現(xiàn)狀與營銷渠道分析報告
- 新人教版九年級化學(xué)第三單元復(fù)習(xí)課件
評論
0/150
提交評論