版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、2 并行程序設(shè)計(jì)2.1 三種并行程序設(shè)計(jì)模型 1.數(shù)據(jù)并行模型(適用于SIMD并行機(jī)) 代表編程工具:Fortran 90,HPF2.共享存儲(chǔ)模型(適于共享存儲(chǔ)多處理器) 代表編程工具:Pthread ,OpenMP3.消息傳遞模型(適于多計(jì)算機(jī)) 代表編程工具:MPI,PVM1 數(shù)據(jù)并行模型(Data Parallel)概況:數(shù)據(jù)并行即將相同的操作同時(shí)作用于不同的數(shù)據(jù),數(shù)據(jù)并行編程模型提供給編程者一個(gè)全局的地址空間.特點(diǎn):單線程;并行操作于密集的數(shù)據(jù)結(jié)構(gòu)松散同步;全局命名空間隱式相互作用;隱式/半隱式數(shù)據(jù)分布l編程工具代表: l Fortran90是一種流行的數(shù)據(jù)并行語言,對(duì)Fortran做
2、修改,增加了并行性支持。支持元素的并行數(shù)據(jù)操作,將整個(gè)數(shù)組成數(shù)組的一部分,視為一個(gè)操作數(shù)。l 高性能FORTRAN(HPF),HPF是一個(gè)語言標(biāo)準(zhǔn),作為Fortran90的擴(kuò)展。一個(gè)簡單的一個(gè)簡單的HPF程序?qū)嵗绦驅(qū)嵗齦PROGRAM EXAMPLEl!DECLARE VARIABLE l INTEGER a(1024),b(1024),c(1024)l INTEGER:result=0l! DECLARE DISTRIBUTEl !HPF$DISTRIBUTE a(block)l !HPF$DISTRIBUTE b(block)l !HPF$DISTRIBUTE c(block)l!ALI
3、GN VALUES TO DISTRIBUTED VARIABLESl a=1 l b=2l!ADD THEMl c=a+bl!CALCULATE THE SUM IN ALL ELEMENTS OF cl result=SUM(c)l!PRINT THE RESULTl PRINT *, “The last element is ”,c(1024)l PRINT *, “The sum in all elements is ”, resultlENDThe last element is 3The sum in all elements is 3072The last element is
4、3The sum in all elements is 3072l第一步:程序聲明了三個(gè)整型數(shù)組,大小為1024。l 第二步:通過數(shù)據(jù)分布指令DISTRIBUTE指示將數(shù)組a按塊分布方式block分配到各處理器上。上圖給出的就是3個(gè)分布數(shù)組在4個(gè)處理器上的分布。l 第三步:是分布數(shù)組的賦值。采用屬主規(guī)則(每個(gè)處理器盡量只訪問分配給自己的數(shù)據(jù)段)。l 第四步:多個(gè)分布數(shù)組之間進(jìn)行運(yùn)算。(a和b中相應(yīng)元素相加后送給c的相應(yīng)元素)。l 第五步:分布數(shù)組的歸約是將c數(shù)組中所有元素求和,賦給順序變量result。(根據(jù)屬主規(guī)則,各處理器并行地將屬于自己的元素局部求和,然后調(diào)用全局操作歸約并返回,將各處理
5、器的局部和相加,再廣播給所有處理器的result變量。)l 最后一步:打印分布數(shù)組元素。HPF中I/O語句在非并行代碼段中,在處理器0上執(zhí)行。由于分布數(shù)組可以看成是分布共享的,因此具有共享屬性,處理器可以訪問任意一個(gè)分布數(shù)組的元素。例程中:處理器0訪問了處理器3上的分布數(shù)組元素,引起了處理期間通信。2 2 共享存儲(chǔ)器模型共享存儲(chǔ)器模型l共享存儲(chǔ)器編程的主要特征是共享存儲(chǔ)器提供了創(chuàng)建出能夠直接被所有的處理器訪問而不用消息傳遞環(huán)境中那樣用消息來傳遞數(shù)據(jù)的變量和數(shù)據(jù)結(jié)構(gòu)。l描述并發(fā)進(jìn)程結(jié)構(gòu)的最早例子是FORK-JOIN結(jié)構(gòu)l一個(gè)FORK語句產(chǎn)生一個(gè)新的并發(fā)進(jìn)程的路程,并行進(jìn)程在其結(jié)尾使用JOIN語句
6、。當(dāng)原進(jìn)程和新產(chǎn)生的進(jìn)程都達(dá)到JOIN語句后,代碼的執(zhí)行繼續(xù)以順序方式進(jìn)行。UNIX重量級(jí)進(jìn)程重量級(jí)進(jìn)程 UNIX操作系統(tǒng)基于進(jìn)程的概念設(shè)計(jì)。單處理器時(shí)處理器被多個(gè)進(jìn)程分時(shí)共享;處理器的使用從一個(gè)進(jìn)程切換到另一個(gè)進(jìn)程。(切換過程中可能出現(xiàn)停滯等問題) 在多處理機(jī)系統(tǒng)中,進(jìn)程的執(zhí)行可以真正地并發(fā)。UNIX系統(tǒng)調(diào)用fork()來創(chuàng)建新進(jìn)程。除了進(jìn)程ID外,被創(chuàng)建的新進(jìn)程是調(diào)用進(jìn)程的完全拷貝。線程線程UNIX fork創(chuàng)建的進(jìn)程是一個(gè)“重量級(jí)” 進(jìn)程;它是一個(gè)完全獨(dú)立的新進(jìn)程,擁有自己的變量、棧和存儲(chǔ)器分配。 更高效的機(jī)制是指定并發(fā)例程共享相同的存儲(chǔ)器空間和全局變量的機(jī)制。通過thread或ligh
7、tweight process實(shí)現(xiàn)。(a)進(jìn)程(b)線程進(jìn)程和線程之間的區(qū)別進(jìn)程和線程之間的區(qū)別l編程工具代表:l Pthread:POS thread 簡稱為pthread,Posix線程是一個(gè)POS標(biāo)準(zhǔn)線程。該標(biāo)準(zhǔn)定義內(nèi)部API創(chuàng)建和操縱線程。POSIX線程具有良好的可移植性,Solaris、Linux、Windows等平臺(tái)均可應(yīng)用。Pthreads定義了一套C程序語言類型、函數(shù)與常量。以pthread.h頭文件和一個(gè)線程庫實(shí)現(xiàn)。l OpenMP:用于共享內(nèi)存并行系統(tǒng)的多線程程序設(shè)計(jì)。支持編程語言C、C+和Fortran。OpenMP提供對(duì)并行算法的高層的抽象描述,程序員通過在源代碼中加入
8、專用的pragma來指明自己的意圖,由此編譯器可自動(dòng)將程序并行化,并在必要處加入同步互斥以及通信。(若不加入pragma或編譯器不支持,則程序退化為串行程序,可正常執(zhí)行,但無法利用多線程加速程序執(zhí)行)3消息傳遞編程(消息傳遞編程(Message Passing)概況:在消息傳遞模型中,駐留在不同節(jié)點(diǎn)上的進(jìn)程可以通過網(wǎng)絡(luò)顯式地傳遞消息相互通信,實(shí)現(xiàn)進(jìn)程之間的信息交換、協(xié)調(diào)步伐、控制執(zhí)行等。MPP, COW的自然模型,也可應(yīng)用于共享變量多機(jī)系統(tǒng),適合開發(fā)大粒度的并行性特點(diǎn):多線程異步并行性分開的地址空間顯式相互作用顯式數(shù)據(jù)映射和負(fù)載分配常采用SPMD形式編碼l編程工具代表:lPVM:并行虛擬機(jī)(P
9、arallel Virtual Machine) 是一種常用的基于消息傳遞的并行編程環(huán)境,它把工作站網(wǎng)絡(luò)構(gòu)建成一個(gè)虛擬的并行機(jī)系統(tǒng),為并行應(yīng)用提供了運(yùn)行平臺(tái)。支持WindowsNT等非Unix平臺(tái),程序設(shè)計(jì)語言支持C 、Fortran和Java。lMPI:消息傳遞接口(Message Passing Interface)是一個(gè)基于消息傳遞的并行編程工具。它具有移植性好、功能強(qiáng)大、效率高等優(yōu)點(diǎn),且有多種免費(fèi)、使用的實(shí)現(xiàn)版本。l MPI是1994年5月發(fā)布的一種消息傳遞接口。它實(shí)際上是一個(gè)消息傳遞函數(shù)庫的標(biāo)準(zhǔn)說明,以語言獨(dú)立的形式來定義這個(gè)接口庫, 并提供了與C、Fortran以及JAVA語言的綁
10、定。共享存儲(chǔ)和消息傳遞程序設(shè)計(jì)模型對(duì)比實(shí)例:計(jì)算的樣本程序011234計(jì)算計(jì)算的串行程序(的串行程序(C語言)語言)l#includel#define N 1000000lmain() ldouble local, pi = 0.0, w;llong i;lw=1.0/N;lfor (i = 0; iN; i +) ltemp = (i -0.5)*w;lpi = 4.0/(1.0+temp* temp)+pi;llprintf(“pi is %f n”, pi *w);lN次循環(huán),每次對(duì)pi累加計(jì)算計(jì)算的并行程序(共享存儲(chǔ)模型)的并行程序(共享存儲(chǔ)模型)l#include lstatic l
11、ong num_steps = 100000; double step;l#define NUM_THREADS 2;lvoid main ()l int i; double x, pi, sumNUM_THREADS;l step = 1.0/(double) num_steps;l omp_set_num_threads(NUM_THREADS)l#pragma omp parallel l double x; int id; l id=omp_get_thread_num(); l for (i=id,sumid=0.0; i= num_steps; i=i+NUM_THREADS)l
12、x = (i-0.5)*step;l sumid +=4.0/(1.0+x*x);l l for (i=0,pi=0.0; iNUM_THREADS; i+) pi = sumi *step;l/開始線程分配,并行執(zhí)行/頭文件,嵌入C或C+當(dāng)一個(gè)線程運(yùn)行到parallel指令時(shí),它會(huì)創(chuàng)建一個(gè)線程組并成為該組進(jìn)程的主線程。主線程線程號(hào)為0。當(dāng)并行域開始時(shí),程序代碼被復(fù)制,每個(gè)線程都會(huì)執(zhí)行該代碼。到并行部分結(jié)束時(shí),只有主線程越過路障繼續(xù)執(zhí)行。lOpenMP是基于線程的并行編程模型,一個(gè)共享存儲(chǔ)的進(jìn)程由多個(gè)線程組成。OpenMPI使用FORK-JOIN并行執(zhí)行模型。l 所有的OPENMP程序開始于一
13、個(gè)單獨(dú)的主線程(Master Thread)。主線程會(huì)一直串行地執(zhí)行,直到遇見第一個(gè)并行域(Parallel Region)才開始執(zhí)行。接下來過程如下l (1)FORK:主線程創(chuàng)建一隊(duì)并行的線程,然后并行域中的代碼在不同的線程隊(duì)中并行執(zhí)行;l (2)JOIN:當(dāng)諸線程在并行域中執(zhí)行完之后,它們或被同步或被中斷,最后只有主線程執(zhí)行。編寫OpenMP程序開發(fā)工具已增加了對(duì)OpenMP的支持,Visual Studio 2005完全支持OpenMP編寫OpenMP程序的必要步驟:(1)生成項(xiàng)目(2)配置項(xiàng)目,支持OpenMP(3)加入頭文件#include “omp.h”(4)編寫源程序;(5)配置
14、環(huán)境變量,確定線程的數(shù)目(6)執(zhí)行程序計(jì)算的并行程序(消息傳遞模型)l#include l# define N 100000l main ( )l double local=0.0,pi,w,temp=0.0; long i ,taskid,numtask;l w=1.0/N;l MPI_ Init(&argc,& argv);l MPI _Comm _rank (MPI_COMM_WORLD,&taskid);l MPI _Comm _Size (MPI_COMM_WORLD,&numtask);l for (i= taskid; i N; i=i + num
15、task)l temp = (i-0.5)*w;l local=4.0/(1.0+temp*temp)+local;l l MPI_Reduce (&local,&pi,1,MPI_Double,MPI_SUM,0,MPI_COMM_WORLD);l if (taskid = =0) printf(“pi is %f n”,pi* w);l MPI_Finalize ( ) ;l / * main ( )*/頭文件,嵌入C或C+ 等/初始化MPI環(huán)境/MPI進(jìn)程個(gè)數(shù)和編號(hào)/MPI歸約操作l消息傳遞模型中各個(gè)進(jìn)程只能直接訪問其局部內(nèi)存空間,而對(duì)其他進(jìn)程的局部內(nèi)存空間的訪問只能通過
16、消息傳遞來實(shí)現(xiàn)。l MPI初始化操作通過程序運(yùn)行命令獲取派生進(jìn)程的數(shù)量。然后每個(gè)進(jìn)程針對(duì)分配的不同的數(shù)據(jù)段執(zhí)行相同的操作。最后使用reduce歸約操作將結(jié)果在第0個(gè)進(jìn)程中進(jìn)行求和。(歸約操作屬于群集通信操作的一種形式)三種計(jì)算模型特征比較2.2 消息傳遞編程基礎(chǔ)l(1) 編程選擇l 對(duì)于消息傳遞計(jì)算機(jī)編程可用以下方法進(jìn)行:l(1)設(shè)計(jì)一種專用的編程語言設(shè)計(jì)一種專用的編程語言。 如occam語言,專為Transputer消息處理器設(shè)計(jì)l(2)對(duì)于現(xiàn)有的一種順序高級(jí)語言的語法/保留字加以擴(kuò)展擴(kuò)展來處理消息傳遞。如CC 和Fortran Ml(3)使用現(xiàn)在的一種順序高級(jí)語言,但為它配備一個(gè)能進(jìn)行消息
17、傳遞外部過程庫庫。常用方法。常用方法C Fortran等均可等均可.l 采用C語言,以能進(jìn)行消息傳遞的消息傳遞庫調(diào)用對(duì)其加以擴(kuò)充,以完成進(jìn)程對(duì)進(jìn)程的直接消息傳遞。這種方法中,必須顯式地說明執(zhí)行哪些進(jìn)程,何時(shí)在并發(fā)進(jìn)程間傳遞消息,以及傳遞什么消息。l 這類消息傳遞系統(tǒng)必須使用兩個(gè)基本方法: (1)創(chuàng)建分離進(jìn)程以使它們能在不同的計(jì)算機(jī)上執(zhí)行的方法 (2)發(fā)送和接收消息的方法l2)進(jìn)程創(chuàng)建方法l 創(chuàng)建進(jìn)程有靜態(tài)靜態(tài)和動(dòng)態(tài)動(dòng)態(tài)兩種方法。在靜態(tài)進(jìn)程創(chuàng)建時(shí),所有進(jìn)程在執(zhí)行前必須加以制定,系統(tǒng)將執(zhí)行固定數(shù)據(jù)的進(jìn)程。程序員通常需在進(jìn)程或程序執(zhí)行前用命令行顯式標(biāo)識(shí)它們。 在大多數(shù)應(yīng)用中,進(jìn)程不會(huì)全相同也不會(huì)全不
18、同;通常有一個(gè)稱為主進(jìn)程(master)的控制進(jìn)程,其余的進(jìn)程為從進(jìn)程(slave),這些進(jìn)程本質(zhì)上相同,融合在SPMD模型中。SPMD模式的編程是最常用的消息傳遞系統(tǒng)之一MPI中最常采用的方法。 動(dòng)態(tài)進(jìn)程創(chuàng)建最通用的模型是MPMD,需要為不同的處理器編寫完全獨(dú)立的不同程序。通常采用主從方法是一個(gè)處理器執(zhí)行主進(jìn)程,而其余進(jìn)程由主進(jìn)程啟動(dòng)。pvm中的spawn(name_of_process) 函數(shù)。調(diào)用后立即啟動(dòng)另一個(gè)進(jìn)程,此后調(diào)用進(jìn)程和被調(diào)用進(jìn)程兩者一起向前執(zhí)行。派生的進(jìn)程必須是事先編譯好的,且可執(zhí)行的程序。 在動(dòng)態(tài)進(jìn)程創(chuàng)建方法中,可在其它進(jìn)程的執(zhí)行期間創(chuàng)建進(jìn)程并啟動(dòng)執(zhí)行它們。通常用進(jìn)程創(chuàng)建
19、構(gòu)造或庫調(diào)用創(chuàng)建進(jìn)程,也可對(duì)進(jìn)程撤銷。動(dòng)態(tài)進(jìn)程創(chuàng)建比靜態(tài)進(jìn)程創(chuàng)建功能更強(qiáng)大,但會(huì)導(dǎo)致顯著的開銷。l(3)消息傳遞方法l 發(fā)送和接收消息傳遞庫的調(diào)用基本形式如下:l send(parameter_list)l recv(parameter_list)l 其中send()出現(xiàn)在源進(jìn)程中,由它發(fā)送消息;l 而recv()出現(xiàn)在目的進(jìn)程中收集已被發(fā)出的消息;l 括號(hào)中的參數(shù)依賴于軟件。l簡單的調(diào)用如:l send(&x,destination_id);l recv(&y,source_id)l我們已經(jīng)了解如何從一個(gè)執(zhí)行的源進(jìn)程向一個(gè)特定的目的進(jìn)程發(fā)送消息,這里的目的進(jìn)程的發(fā)送例程中是作
20、為一個(gè)參數(shù)給定的,而源是在接收例程中作為一個(gè)參數(shù)給定的。目的進(jìn)程中的recv()將只接收recv()中以參數(shù)指明的源進(jìn)程所發(fā)來的消息,對(duì)其他消息將不予接收。也可以使用1作為源地址的通配符,允許目的進(jìn)程接收來自任何源進(jìn)程的消息。l為了提供更大的靈活性,可以附于消息的消息標(biāo)記(message tag)對(duì)發(fā)送得來消息加以選擇。消息標(biāo)記msgtag是一個(gè)典型的由用戶選定的正整數(shù),對(duì)發(fā)送來的不同類型的消息加以區(qū)分。l send(&x,2 ,5);l recv(&y, 1,5);消息傳遞的其他方法l對(duì)擁有消息源的進(jìn)程通常要求它將相同消息發(fā)送給多個(gè)目的進(jìn)程。l 廣播(broadcast):指
21、向所有與求解問題有關(guān)的進(jìn)程發(fā)送相同的消息。l 匯集(gather):指一個(gè)進(jìn)程從一組進(jìn)程中的每一個(gè)進(jìn)程收集一個(gè)值。l 散播(scatter): 用于描述根進(jìn)程中數(shù)據(jù)數(shù)組中的每個(gè)元素分別發(fā)送給各個(gè)進(jìn)程。廣播操作匯集操作散播操作2.3 MPI編程l2.3.1 最簡單的MPI并行程序lMPI(Message Passing Interface)是1994年5月發(fā)布的一種消息傳遞接口,即基于消息傳遞的并行編程工具。它具有移植性好、功能強(qiáng)大、效率高等優(yōu)點(diǎn),且有多種免費(fèi)、使用的實(shí)現(xiàn)版本如MPICH、LAM、CHIMP等。l 它實(shí)際上是一個(gè)消息傳遞函數(shù)庫的標(biāo)準(zhǔn)說明,以語言獨(dú)立的形式來定義這個(gè)接口庫, 并提供
22、了與C,JAVA, FORTRAN語言的綁定。MPI不是一個(gè)獨(dú)立的自包含系統(tǒng),而是建立在本地并行程序設(shè)計(jì)環(huán)境之上,其進(jìn)程管理和I/O均由本地并行程序設(shè)計(jì)環(huán)境提供。l 參考文獻(xiàn):參考文獻(xiàn):高性能計(jì)算之并行編程技術(shù)高性能計(jì)算之并行編程技術(shù) MPI并行并行程序設(shè)計(jì)程序設(shè)計(jì) 都志輝都志輝 編著編著MPI程序的一般結(jié)構(gòu)包含MPI頭文件初始化MPI環(huán)境消息交換處理及計(jì)算等退出MPI環(huán)境MPI程序的執(zhí)行過程Hello Parallel World -Hello Parallel World -最簡單的最簡單的MPIMPI程序程序l/*文件名 hello.c */l#include “mpi.h”l#incl
23、ude lInt main(int argc,char *argv)l MPI_Init(&argc,&argv); /并行部分開始l printf(“hello parallel world! n”);l MPI_Finalize(); /并行部分結(jié)束l兩個(gè)節(jié)點(diǎn)運(yùn)行結(jié)果:hello parallel world!hello parallel world!l (1)并行初始化函數(shù):int MPI_Init( int *argc, char * * * argv )l 通過MPI_Init函數(shù)進(jìn)入MPI環(huán)境并完成所有的初始化工作。argc為變量數(shù)目;argv為變量數(shù)組,兩個(gè)參數(shù)來
24、自main函數(shù)的參數(shù),因此并行程序中main函數(shù)的參數(shù)不可缺少。 必須調(diào)用;首先調(diào)用;調(diào)用一次。lMPI的函數(shù)一般都以MPI_開頭,所有的MPI并行程序必須包含mpi.h頭文件。l(2)并行結(jié)束函數(shù):int MPI_Finalize(void)l 通過MPI_Finalize函數(shù)從MPI環(huán)境中退出,釋放MPI的數(shù)據(jù)結(jié)構(gòu)及操作。該語句之后仍然可以進(jìn)行串行程序的運(yùn)行。l 該函數(shù)一旦被應(yīng)用程序調(diào)用時(shí),就不能調(diào)用MPI的其它例行函數(shù)(包括MPI_Init),用戶必須保證在進(jìn)程調(diào)用MPI_Finalize之前把與完成進(jìn)程有關(guān)的所有通信結(jié)束l 所有并行程序均為這樣的結(jié)構(gòu),其中main函數(shù)的參數(shù)argc和a
25、rgv分別為程序輸入?yún)?shù)個(gè)數(shù)及輸入?yún)?shù)數(shù)組。開始和結(jié)束函數(shù)之間就是程序的并行部分,將在所有節(jié)點(diǎn)上獲得執(zhí)行。l#include l int main()l l printf(“hello parallel world!n”); l l 這種環(huán)境下進(jìn)程沒有MPI環(huán)境的支持,無法對(duì)自己進(jìn)行識(shí)別和進(jìn)行節(jié)點(diǎn)間的數(shù)據(jù)通信,因此無法完成真正的并行計(jì)算。只有開始和結(jié)束函數(shù)之間的程序才具備進(jìn)行消息傳遞模式的并行程序設(shè)計(jì)的能力。2.3.2 2.3.2 獲取進(jìn)程標(biāo)志和機(jī)器名獲取進(jìn)程標(biāo)志和機(jī)器名l并行程序設(shè)計(jì)需要協(xié)調(diào)大量的計(jì)算節(jié)點(diǎn)參與計(jì)算,且需要將任務(wù)分配到各個(gè)節(jié)點(diǎn)并實(shí)現(xiàn)節(jié)點(diǎn)間的數(shù)據(jù)和信息交換。因此各個(gè)進(jìn)程需要對(duì)自己
26、和其它進(jìn)程進(jìn)行識(shí)別和管理,每個(gè)進(jìn)程都需要有一個(gè)唯一的ID,從而實(shí)現(xiàn)大量計(jì)算節(jié)點(diǎn)的管理和控制,有效完成并行計(jì)算任務(wù)。因此獲取進(jìn)程標(biāo)識(shí)和機(jī)器名是MPI需要完成的基本任務(wù),各節(jié)點(diǎn)根據(jù)自己的進(jìn)程ID判斷哪些任務(wù)需要自己完成。(1)獲取當(dāng)前進(jìn)程標(biāo)識(shí)函數(shù)lint MPI_Comm_rank(MPI_Comm comm, int *rank)l 調(diào)用該函數(shù)獲得當(dāng)前進(jìn)程在指定通信域中的進(jìn)程號(hào)(0 進(jìn)程數(shù)-1)。一個(gè)進(jìn)程在不同通信因子中的進(jìn)程號(hào)可能不同。Comm為該進(jìn)程所在的通信域句柄,rank為調(diào)用該函數(shù)返回的進(jìn)程在通信域中的標(biāo)識(shí)號(hào)。l一般對(duì)于comm參數(shù),采用MPI_COMM_WORLD通信域。它是MPI提
27、供的一個(gè)基本通信域(默認(rèn)),在這個(gè)通信域中每個(gè)進(jìn)程之間能相互通信,也可以建立自己的通信域。(2)獲取通信域包含的進(jìn)程總數(shù)函數(shù)l int MPI_Comm_size(MPI_Comm comm, int *size) l不同進(jìn)程通過調(diào)用該函數(shù)獲取指定通信域的進(jìn)程個(gè)數(shù),確定自身完成任務(wù)比例,顯然這里的通訊因子必須是組內(nèi)通訊因子。Comm為通信域句柄,size為函數(shù)返回的通信域comm內(nèi)包含的進(jìn)程總數(shù)。(3)獲取本進(jìn)程的機(jī)器名函數(shù)lint MPI_Get_processor_name(char *name, l int *resultlen)lname為返回的機(jī)器名字符串,resultlen為返回的
28、機(jī)器名長度。l/*例程分析:who.c*/l#include mpi.hl#include lint main(int argc,char *argv)ll int myid, numprocs;l int namelen;l char processor_nameMPI_MAX_PROCESSOR_NAME;l MPI_Init(&argc,&argv);l MPI_Comm_rank(MPI_COMM_WORLD,&myid);l MPI_Comm_size(MPI_COMM_WORLD,&numprocs);l MPI_Get_processor_name
29、(processor_name,&namelen);l printf(Hello World! Process %d of %d on %sn,myid, numprocs, processor_name);l MPI_Finalize();l三個(gè)節(jié)點(diǎn)運(yùn)行結(jié)果:Hello world!Process 0 of 3 on wang1Hello world!Process 1 of 3 on wang2Hello world!Process 2 of 3 on wang3運(yùn)行命令:mpirun np 3 ./whoWho.c程序說明l(1) 程序啟動(dòng)后各節(jié)點(diǎn)同時(shí)執(zhí)行,各節(jié)點(diǎn)通過MPI_Co
30、mm_rank()函數(shù)取得自己的進(jìn)程標(biāo)識(shí)myid。不同的進(jìn)程執(zhí)行MPI_Comm_rank()函數(shù)后返回的值不同。l(2)通過MPI_Comm_size函數(shù)獲得本通信域中的進(jìn)程總數(shù)numprocs。l(3)通過MPI_Get_processor_name函數(shù)獲得本進(jìn)程所在的機(jī)器名。各進(jìn)程調(diào)用自己的打印語句將結(jié)果打印出來MPI中變量的分布式存儲(chǔ)方式變量的分布存儲(chǔ)節(jié)點(diǎn)1機(jī)器名:wang1進(jìn)程標(biāo)識(shí):0Who.c程序副本變量值:myid=0 numprocs=3節(jié)點(diǎn)2機(jī)器名:wang2進(jìn)程標(biāo)識(shí):1Who.c程序副本變量值:myid=1 numprocs=3節(jié)點(diǎn)3機(jī)器名:wang3進(jìn)程標(biāo)識(shí):2Who.c
31、程序副本變量值:myid=2 numprocs=3 每個(gè)節(jié)點(diǎn)有自己獨(dú)立的存儲(chǔ)地址空間,因此相同的變量名它們的值是可以不同的。程序副本存在于所有節(jié)點(diǎn)并分別得到執(zhí)行,各節(jié)點(diǎn)計(jì)算時(shí)的地位是平行的。l在3個(gè)節(jié)點(diǎn)的情況下若運(yùn)行命令:l mpirun np 6 ./who則每個(gè)節(jié)點(diǎn)啟動(dòng)兩個(gè)進(jìn)程,程序輸出為:Hello world!Process 0 of 6 on wang1Hello world!Process 1 of 6 on wang2Hello world!Process 2 of 6 on wang3Hello world!Process 3 of 6 on wang1Hello world!
32、Process 4 of 6 on wang2Hello world!Process 5 of 6 on wang3(執(zhí)行順序可能不同。)l #include l int main()l l printf(“hello parallel world!n”); l l 這種環(huán)境下進(jìn)程沒有MPI環(huán)境的支持,無法對(duì)自己進(jìn)行識(shí)別和進(jìn)行節(jié)點(diǎn)間的數(shù)據(jù)通信,因此無法完成真正的并行計(jì)算。只有開始和結(jié)束函數(shù)之間的程序才具備進(jìn)行消息傳遞模式的并行程序設(shè)計(jì)的能力。2.2.3 有消息傳遞功能的并行程序l 節(jié)點(diǎn)間由于變量地址空間是相互獨(dú)立的,信息無法交換。消息傳遞時(shí)MPI編程的核心功能。l (1)消息發(fā)送函數(shù):用于發(fā)送
33、一個(gè)消息到目標(biāo)進(jìn)程。 int MPI_Send(void *buf, int count, MPI_Datatype dataytpe, int dest, int tag, MPI_Comm comm) (2)消息接收函數(shù):用于從指定進(jìn)程接收一個(gè)消息 int MPI_Recv(void *buf, int count, MPI_Datatype datatyepe,int source, int tag, MPI_Comm comm, MPI_Status *status)MPI消息消息l一個(gè)消息好比一封信 !l消息的內(nèi)容即信的內(nèi)容,在MPI中稱為消息緩沖(Message Buffer)l消
34、息緩沖由三元組標(biāo)識(shí)l消息的收發(fā)者即信的地址,在MPI中稱為消息封裝(Message Envelop)l消息封裝由三元組標(biāo)識(shí) MPI_Send (buf, count, datatype, dest, tag, comm)消 息 緩 沖消 息 信 封datatype:消息數(shù)據(jù)類型消息數(shù)據(jù)類型lMPI的消息類型分為兩種:預(yù)定義類型和派生數(shù)據(jù)類型l(1)預(yù)定義類型:MPI支持異構(gòu)計(jì)算,它指在不同計(jì)算機(jī)系統(tǒng)上運(yùn)行程序,每臺(tái)計(jì)算可能有不同生產(chǎn)廠商,不同操作系統(tǒng)。通過預(yù)定義數(shù)據(jù)類型解決異構(gòu)計(jì)算中的互操作問題。MPI提供了兩個(gè)附加類型:MPI_BYTE和MPI_PACKED 。 MPI_BYTE表示一個(gè)字節(jié)
35、,所有的計(jì)算系統(tǒng)中一個(gè)字節(jié)都代表8個(gè)二進(jìn)制位。 MPI_PACKED預(yù)定義數(shù)據(jù)類型被用來實(shí)現(xiàn)傳輸?shù)刂房臻g不連續(xù)的數(shù)據(jù)項(xiàng) 。l(2)派生數(shù)據(jù)類型:MPI引入派生數(shù)據(jù)類型來定義由數(shù)據(jù)類型不同且地址空間不連續(xù)的數(shù)據(jù)項(xiàng)組成的消息。l 派生數(shù)據(jù)類型是一種通用的類型描述方法,它是一系列二元組的集合,可以表示成:l ,l 在派生數(shù)據(jù)類型中,基類型可以是任何MPI預(yù)定義數(shù)據(jù)類型,也可以是其它的派生數(shù)據(jù)類型,即支持?jǐn)?shù)據(jù)類型的嵌套定義。MPI提供了構(gòu)造函數(shù)來定義派生數(shù)據(jù)類型。 函數(shù)名函數(shù)名含義含義MPI_Type_contiguous定義由相同數(shù)據(jù)類型的元素組成的類型MPI_Type_vector定義由成塊的元素
36、組成的類型,塊之間具有相同間隔MPI_Type_indexed定義由成塊的元素組成的類型,塊長度和偏移由參數(shù)指定MPI_Type_struct定義由不同數(shù)據(jù)類型的元素組成的類型MPI_Type_commit提交一個(gè)派生數(shù)據(jù)類型MPI_Type_free釋放一個(gè)派生數(shù)據(jù)類型節(jié)點(diǎn)間自定義復(fù)雜數(shù)據(jù)結(jié)構(gòu)的傳輸節(jié)點(diǎn)間自定義復(fù)雜數(shù)據(jù)結(jié)構(gòu)的傳輸lMPI提供了自定義的數(shù)據(jù)類型,這種數(shù)據(jù)類型可以使結(jié)構(gòu)體數(shù)據(jù)類型,不一定是單一的數(shù)據(jù)類型。這種自定義的數(shù)據(jù)類型可以在消息傳遞函數(shù)中直接說明并傳輸,但未說明并提交的數(shù)據(jù)類型是不能在消息傳遞時(shí)使用的。MPI自定義數(shù)據(jù)結(jié)構(gòu)函數(shù)說明(自定義數(shù)據(jù)結(jié)構(gòu)函數(shù)說明(1)(1)獲取變量
37、相對(duì)于MPI_BOTTOM偏移地址函數(shù):MPI_Address(void *location, MPI_Aint *address)參數(shù)說明: location為需要獲取位置的變量地址,是函數(shù)的輸入?yún)?shù); address為獲取相對(duì)于MPI_BOTTOM的偏移地址,是函數(shù)的輸出函數(shù)。該函數(shù)調(diào)用后通過address參數(shù)返回變量在內(nèi)存中相對(duì)于預(yù)定義地址MPI_BOTTOM偏移地址。MPI自定義數(shù)據(jù)結(jié)構(gòu)函數(shù)說明(自定義數(shù)據(jù)結(jié)構(gòu)函數(shù)說明(2)(2)生成新的數(shù)據(jù)結(jié)構(gòu):int MPI_Type_struct(int count, int blocklens. MPI_Aint indices, MPI_Da
38、tatype old_types, MPI_Datatype *newtype) 參數(shù)說明:count參數(shù)指定數(shù)據(jù)塊的個(gè)數(shù),即結(jié)構(gòu)體中有多少個(gè)類型說明; blocklens為一個(gè)數(shù)組,分別指定每個(gè)塊的數(shù)據(jù)個(gè)數(shù),若某個(gè)數(shù)據(jù)塊為數(shù)組其對(duì)應(yīng)的數(shù)據(jù)塊個(gè)數(shù)就為數(shù)組長度; indices為數(shù)組,分別制定每個(gè)數(shù)據(jù)塊的相對(duì)偏移地址; old_types分別制定每個(gè)數(shù)據(jù)塊對(duì)應(yīng)的MPI已定義的數(shù)據(jù)類型; newtype為信得數(shù)據(jù)塊指針。 調(diào)用該函數(shù)后系統(tǒng)將根據(jù)函數(shù)參數(shù)的描述生成新的數(shù)據(jù)類型,函數(shù)中的參數(shù)描述信息一定要與定義的數(shù)據(jù)結(jié)構(gòu)相應(yīng),否則會(huì)出現(xiàn)嚴(yán)重的數(shù)據(jù)錯(cuò)誤。MPI自定義數(shù)據(jù)結(jié)構(gòu)函數(shù)說明(自定義數(shù)據(jù)結(jié)構(gòu)函數(shù)說
39、明(3)(3)數(shù)據(jù)類型提交函數(shù):int MPI_Type_commit(MPI_Datatype *datatype)參數(shù)說明: datatype為新數(shù)據(jù)類型的指針。該函數(shù)調(diào)用后向系統(tǒng)提交由MPI_Type_struct函數(shù)生成的新數(shù)據(jù)結(jié)構(gòu),提交完成后消息傳遞操作中就可以使用這一新的數(shù)據(jù)結(jié)構(gòu)。(4)釋放新數(shù)據(jù)類型函數(shù):int MPI_Type_free(MPI_Datatype *datatype)調(diào)用該函數(shù)將釋放新數(shù)據(jù)結(jié)構(gòu)的空間。/*文件名文件名datastru.c*/l#includempi.hl#include lmain(int argc,char *argv)ll int myid,
40、 numprocs; int i;l MPI_Status status; l/*定義自己新的數(shù)據(jù)結(jié)構(gòu),共四個(gè)數(shù)據(jù)塊。定義自己新的數(shù)據(jù)結(jié)構(gòu),共四個(gè)數(shù)據(jù)塊。*/l struct Datal l int count1;l double data16;l int count2;l char data250;l ;l struct Data datastruct;l MPI_Datatype MYtype; / 定義新的數(shù)據(jù)結(jié)構(gòu)標(biāo)識(shí)定義新的數(shù)據(jù)結(jié)構(gòu)標(biāo)識(shí)l int blocklenth4; / 定義數(shù)據(jù)塊長度描述數(shù)組定義數(shù)據(jù)塊長度描述數(shù)組l MPI_Aint offset4; / 定義數(shù)據(jù)塊偏移量描述數(shù)
41、組定義數(shù)據(jù)塊偏移量描述數(shù)組l MPI_Datatype MPItype4; / 定義數(shù)據(jù)塊定義數(shù)據(jù)塊MPI數(shù)據(jù)類型描述數(shù)組數(shù)據(jù)類型描述數(shù)組l MPI_Init(&argc,&argv);l MPI_Comm_rank(MPI_COMM_WORLD,&myid);l MPI_Comm_size(MPI_COMM_WORLD,&numprocs); l blocklenth0=1; / 第一個(gè)數(shù)據(jù)塊長度l blocklenth1=6; / 第二個(gè)數(shù)據(jù)塊長度,數(shù)組程度l blocklenth2=1; / 第三個(gè)數(shù)據(jù)塊長度l blocklenth3=50; / 第四個(gè)數(shù)
42、據(jù)塊長度,字符串長度l MPItype0=MPI_INT; / 第一個(gè)數(shù)據(jù)塊對(duì)應(yīng)的MPI類型l MPItype1=MPI_DOUBLE; / 第二個(gè)數(shù)據(jù)塊對(duì)應(yīng)的MPI類型l MPItype2=MPI_INT; / 第三個(gè)數(shù)據(jù)塊對(duì)應(yīng)的MPI類型l MPItype3=MPI_CHAR; / 第四個(gè)數(shù)據(jù)塊對(duì)應(yīng)的MPI類型l MPI_Address(&datastruct.count1,&offset0); / 獲取第一個(gè)數(shù)據(jù)塊的絕對(duì)存儲(chǔ)地址l MPI_Address(&datastruct.data1,&offset1); / 獲取第二個(gè)數(shù)據(jù)塊的絕對(duì)存儲(chǔ)地址l MPI
43、_Address(&datastruct.count2,&offset2); / 獲取第三個(gè)數(shù)據(jù)塊的絕對(duì)存儲(chǔ)地址l MPI_Address(&datastruct.data2,&offset3); / 獲取第四個(gè)數(shù)據(jù)塊的絕對(duì)存儲(chǔ)地址l offset3=offset3-offset0; / 第四個(gè)數(shù)據(jù)塊的存儲(chǔ)相對(duì)偏移地址l offset2=offset2-offset0; / 第三個(gè)數(shù)據(jù)塊的存儲(chǔ)相對(duì)偏移地址l offset1=offset1-offset0; / 第二個(gè)數(shù)據(jù)塊的存儲(chǔ)相對(duì)偏移地址l offset0=0; / 第一個(gè)數(shù)據(jù)塊的存儲(chǔ)相對(duì)偏移地址l MPI_
44、Type_struct(4,blocklenth,offset,MPItype,&MYtype); l/生成新的數(shù)據(jù)結(jié)構(gòu)MYtypel MPI_Type_commit(&MYtype); l/向系統(tǒng)提交新的數(shù)據(jù)結(jié)構(gòu),提交完成后系統(tǒng)就可以使用新的數(shù)據(jù)結(jié)構(gòu)了 lif(myid=0) / 為新數(shù)據(jù)結(jié)構(gòu)賦值l l for(i=0;i3;i+)l datastruct.count1=6;l for(i=0;i6;i+)l l datastruct.data1i=(double)i;l l datastruct.count2=50;l strcpy(datastruct.data2,Hel
45、lo MPI! This is my new datatype.);l MPI_Send(&datastruct,1,MYtype,1,99,MPI_COMM_WORLD); l /0進(jìn)程采用MPI_Send函數(shù)傳送新的數(shù)據(jù)結(jié)構(gòu)l lelse if(myid=1)l l /1進(jìn)程采用MPI_Recv函數(shù)接收新的數(shù)據(jù)結(jié)構(gòu)l MPI_Recv(&datastruct,1,MYtype,0,99,MPI_COMM_WORLD,&status);l printf(Myid is %d. I have received the new datatypen,myid);l/打印接收
46、結(jié)果lprintf(inttcount1=t%dn,datastruct.count1);l for(i=0;idatastruct.count1;i+)l l printf(doubletdata1%d=t%fn,i,datastruct.data1i);l l printf(inttcount2=t%dn,datastruct.count2);l printf(chartdata2=t%sn,datastruct.data2);l l MPI_Type_free(&MYtype); /釋放新數(shù)據(jù)結(jié)構(gòu)空間l MPI_Finalize();Myid is 1. I have recei
47、ved the new datatypeint count1=6double data10=0.000000double data11=1.000000double data12=2.000000double data13=3.000000double data14=4.000000double data15=5.000000int count2=50char data2=hello MPI! This is my new datatype消息標(biāo)簽消息標(biāo)簽 tag當(dāng)發(fā)送者連續(xù)發(fā)送兩個(gè)相同類型消息給同一個(gè)接收者,如果沒有消息標(biāo)簽,接收者將無法區(qū)分這兩個(gè)消息 。這段代碼打算傳送A的前32個(gè)字節(jié)進(jìn)入
48、X,傳送B的前16個(gè)字節(jié)進(jìn)入Y。但是,盡管消息B后發(fā)送,但可能先到達(dá)進(jìn)程Q,就會(huì)被第一個(gè)接收函數(shù)接收在X中。使用標(biāo)簽可以避免這個(gè)錯(cuò)誤。Process P:Send(A, 32, Q)Send(B, 16, Q)Process Q:recv (X, 32, P)recv (Y, 16, P) 此時(shí)保證先接收的是消息A(帶有tag1)。如果消息B先到達(dá)Q,它將緩沖直到執(zhí)行recv (Y, 16, P, tag2)Process P:send(A, 32, Q, tag1)send(B, 16, Q, tag2)Process Q:recv (X, 32, P, tag1)recv (Y, 16,
49、P, tag2) 添加標(biāo)簽使得服務(wù)進(jìn)程可以對(duì)兩個(gè)不同的用戶進(jìn)程分別處理,提高靈活性P r o c e s s P : s e n d ( r e q u e s t 1 , 3 2 , Q ) P r o c e s s R : s e n d ( r e q u e s t 2 , 3 2 , Q ) P r o c e s s Q : w h i l e ( t r u e ) r e c v ( r e c e i v e d _ r e q u e s t , 3 2 , A n y _ P r o c e s s ) ; p r o c e s s r e c e i v e d _
50、 r e q u e s t ; P ro c e ss P : se n d (re q u e st1 , 3 2 , Q , ta g 1 ) P ro c e ss R : se n d (re q u e st2 , 3 2 , Q , ta g 2 ) P ro c e ss Q : w h ile (tr u e ) re c v (re c e iv e d _ re q u e st, 3 2 , A n y _ P ro c e ss, A n y _ Ta g , S ta tu s); if (S ta tu s.Ta g = = ta g 1 ) p ro c e s
51、s re c e iv e d _ re q u e st in o n e w a y ; if (S ta tu s.Ta g = = ta g 2 ) p ro c e ss re c e iv e d _ re q u e st in a n o th e r w a y ; comm: 通信域通信域 通信域通信域(Communicator)包括進(jìn)程組進(jìn)程組(Process Group)和通信上下文通信上下文(Communication Context)等內(nèi)容,用于描述通信進(jìn)程間的通信關(guān)系。 進(jìn)程組進(jìn)程組是進(jìn)程的有限、有序集。 有限意味著,在一個(gè)進(jìn)程組中,進(jìn)程的個(gè)數(shù)n是有限的,這里的n
52、稱為進(jìn)程組大小進(jìn)程組大小(Group Size)。有序意味著,進(jìn)程的編號(hào)是按0,1,n-1排列的 一個(gè)進(jìn)程用它在一個(gè)通信域(組)中的編號(hào)進(jìn)行標(biāo)識(shí)。組的大小和進(jìn)程編號(hào)可以通過調(diào)用以下的MPI函數(shù)獲得:MPI_Comm_size(communicator, &group_size)MPI_Comm_rank(communicator, &my_rank) l 通信上下文通信上下文(用于通信的系統(tǒng)超級(jí)標(biāo)簽):安全的區(qū)別不同的通信以免相互干擾。通信上下文不是顯式的對(duì)象,只是作為通信域的一部分出現(xiàn)l 進(jìn)程組和通信上下文結(jié)合形成了通信域。 MPI_COMM_WORLD是所有進(jìn)程的集合 通信
53、域分為組內(nèi)通信域和組間通信域,分別用來實(shí)現(xiàn)MPI的組內(nèi)通信組內(nèi)通信(Intra-communication)和組間通信組間通信(Inter-communication)。(1)管理通信域)管理通信域 MPI提供豐富的函數(shù)用于管理通信域 函數(shù)名函數(shù)名含義含義MPI_Comm_size獲取指定通信域中進(jìn)程的個(gè)數(shù)MPI_Comm_rank獲取當(dāng)前進(jìn)程在指定通信域中的編號(hào)MPI_Comm_compare對(duì)給定的兩個(gè)通信域進(jìn)行比較MPI_Comm_dup復(fù)制一個(gè)已有的通信域生成一個(gè)新的通信域,兩者除通信上下文不同外,其它都一樣。MPI_Comm_create根據(jù)給定的進(jìn)程組創(chuàng)建一個(gè)新的通信域MPI_Co
54、mm_split從一個(gè)指定通信域分裂出多個(gè)子通信域,每個(gè)子通信域中的進(jìn)程都是原通信域中的進(jìn)程。MPI_Comm_free釋放一個(gè)通信域MPI中創(chuàng)建新通信域的例子l MPI_Comm MyWorld, SplitWorld;l int my_rank,group_size, Color, Key;l MPI_Init(&argc, &argv);l MPI_Comm_dup(MPI_COMM_WORLD,&MyWorld);l MPI_Comm_rank(MyWorld,&my_rank);l MPI_Comm_size(MyWorld,&group_si
55、ze);l Color=my_rank%3;l Key=my_rank/3;l MPI_Comm_split(MyWorld,Color,Key,&SplitWorld);nMPI_Comm_dup(MPI_COMM_WORLD,&MyWorld)創(chuàng)建了一個(gè)新的通信域MyWorld,它包含了與原通信域MPI_COMM_ WORLD相同的進(jìn)程組,但具有不同的通信上下文。nMPI_Comm_split(MyWorld,Color,Key,&SplitWorld)函數(shù)調(diào)用則在通信域MyWorld的基礎(chǔ)上產(chǎn)生了幾個(gè)分割的子通信域。原通信域MyWorld中的進(jìn)程按照不同的Colo
56、r值處在不同的分割通信域中,每個(gè)進(jìn)程在不同分割通信域中的進(jìn)程編號(hào)則由Key值來標(biāo)識(shí)。 Rank in MyWorld0123456789Color0120120120Key0001112223Rank in SplitWorld(Color=0)0123Rank in SplitWorld(Color=1)012Rank in SplitWorld(Color=2)012 MPI_Comm_dup(MPI_COMM_WORLD,&MyWorld); MPI_Comm_rank(MyWorld,&my_rank); MPI_Comm_size(MyWorld,&group
57、_size); Color=my_rank%3; Key=my_rank/3; MPI_Comm_split(MyWorld,Color,Key,&SplitWorld);l MPI_COMM_SPLIT對(duì)于通信域comm中的進(jìn)程都要執(zhí)行每一個(gè)進(jìn)程都要指定一個(gè)color值根據(jù)color值的不同此調(diào)用。l 首先將具有相同color值的進(jìn)程形成一個(gè)新的進(jìn)程組新產(chǎn)生的通信域與這些進(jìn)程組一一對(duì)應(yīng)。而新通信域中各個(gè)進(jìn)程的順序編號(hào)是根據(jù)key的大小決定的,即key越小則該進(jìn)程在新通信域中的進(jìn)程編號(hào)也越小。l 若一個(gè)進(jìn)程中的key相同則根據(jù)這兩個(gè)進(jìn)程在原來通信域中的順序編號(hào)決定新的編號(hào)。一個(gè)進(jìn)程可能
58、提供color值MPI_UNDEFINED 。在這種情況下newcomm返回MPI_COMM_NULL 。實(shí)質(zhì)上,將相同color內(nèi)的所有進(jìn)程中的關(guān)鍵字的值置為同一個(gè)值導(dǎo)致的結(jié)果是,在新通信域中進(jìn)程的相對(duì)先后次序和原來的相同。 (2)組間通信域)組間通信域 它是一種特殊的通信域,該通信域包括了兩個(gè)進(jìn)程組,分屬于兩個(gè)進(jìn)程組的進(jìn)程之間通過組間通信域?qū)崿F(xiàn)通信。 一般把調(diào)用進(jìn)程所在的進(jìn)程組稱為本地進(jìn)程組,而把另外一個(gè)稱為遠(yuǎn)程進(jìn)程組。 函數(shù)名函數(shù)名含義含義MPI_Comm_test_inter判斷給定的通信域是否為組間通信域MPI_Comm_remote_size獲取指定組間通信域中遠(yuǎn)程進(jìn)程組的大小MP
59、I_Comm_remote_group返回給定組間通信域的遠(yuǎn)程進(jìn)程組MPI_Intercomm_creat根據(jù)給定的兩個(gè)組內(nèi)通信域生成一個(gè)組間通信域。MPI_Intercomm_merge將給定組間通信域包含的兩個(gè)進(jìn)程組合并,形成一個(gè)新的組內(nèi)通信域status:消息狀態(tài)消息狀態(tài)l 消息接收函數(shù)多了一個(gè)status參數(shù),返回狀態(tài)變量。它MPI定義的一個(gè)數(shù)據(jù)類型,至少由3個(gè)域組成的結(jié)構(gòu)類型,使用之前需要用戶為它分配空間。l l例如:MPI_SOURCE,MPI_TAG,MPI_ERROR。引用時(shí)通過status.MPI_SOURCE,status.MPI_TAG,status.MPI_ERROR得
60、到返回狀態(tài)中包含的發(fā)送數(shù)據(jù)進(jìn)程,使用的tag標(biāo)簽或該接收操作返回的錯(cuò)誤代碼。l 假設(shè)多個(gè)客戶進(jìn)程發(fā)送消息給服務(wù)進(jìn)程請求服務(wù),通過消息標(biāo)簽來標(biāo)識(shí)客戶進(jìn)程,從而服務(wù)進(jìn)程采取不同的服務(wù)。lwhile (true)MPI_Recv(received_request,100,MPI_BYTE,MPI_Any_source,MPI_Any_tag,comm,&Status);switch (Status. MPI_Tag) case tag_0: perform service type0;case tag_1: perform service type1;case tag_2: perform service type2;l MPI的的6個(gè)基本函數(shù)個(gè)基本函數(shù) 從理論上說,MPI所有的通信功能可以用它的6個(gè)基本的調(diào)用來實(shí)現(xiàn): MPI_INIT: 啟動(dòng)MPI環(huán)境 MPI_COMM_SIZE: 確定進(jìn)程數(shù) MPI_COMM_RANK: 確定自己的進(jìn)程標(biāo)識(shí)符 MPI_SEND: 發(fā)送一條消息 MPI_RECV: 接收一條消息 MPI_FINALIZE: 結(jié)束MPI環(huán)境例程分析:例程分析
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(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)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五版科幻喜劇片制作合同3篇
- 基于2025年度財(cái)務(wù)報(bào)告的合同成本分析與管理3篇
- 了解我們的招生計(jì)劃
- 鎮(zhèn)江2025年江蘇鎮(zhèn)江市第三人民醫(yī)院第一批編外用工招聘8人筆試歷年參考題庫附帶答案詳解
- 小型微細(xì)粉碎系統(tǒng)行業(yè)深度研究報(bào)告
- 二零二五年度汽車租賃及增值服務(wù)合同樣本2篇
- Unit 4 My home Part B Lets learn(說課稿)-2024-2025學(xué)年人教PEP版英語四年級(jí)上冊
- 2025年液氨市場分析報(bào)告
- 2025年通信電力鐵塔項(xiàng)目可行性研究報(bào)告
- 方向盤溫度調(diào)節(jié)器行業(yè)深度研究報(bào)告
- 農(nóng)民工考勤表(模板)
- 承臺(tái)混凝土施工技術(shù)交底
- 臥床患者更換床單-軸線翻身
- 加強(qiáng)保育員隊(duì)伍專業(yè)化建設(shè)提升幼兒園保教質(zhì)量
- 計(jì)量基礎(chǔ)知識(shí)培訓(xùn)教材201309
- 中考英語 短文填詞、選詞填空練習(xí)
- 一汽集團(tuán)及各合資公司組織架構(gòu)
- 阿特拉斯基本擰緊技術(shù)ppt課件
- 初一至初三數(shù)學(xué)全部知識(shí)點(diǎn)
- 新課程理念下的班主任工作藝術(shù)
- (完整版)企業(yè)破產(chǎn)流程圖(四張)
評(píng)論
0/150
提交評(píng)論