并行程序設(shè)計整理_第1頁
并行程序設(shè)計整理_第2頁
并行程序設(shè)計整理_第3頁
并行程序設(shè)計整理_第4頁
并行程序設(shè)計整理_第5頁
已閱讀5頁,還剩20頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

并行程序設(shè)計整理第一頁,共二十五頁,2022年,8月28日二月23MPI并行程序設(shè)計2/25相關(guān)網(wǎng)址MPI:,

Pthreads:PVM:

OpemMP:網(wǎng)上搜索:第二頁,共二十五頁,2022年,8月28日二月23MPI并行程序設(shè)計3/25什么是MPI?MassagePassingInterface:是消息傳遞函數(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)第三頁,共二十五頁,2022年,8月28日二月23MPI并行程序設(shè)計4/25為什么要用MPI?高可移植性MPI已在IBMPC機上、MSWindows上、所有主要的Unix工作站上和所有主流的并行機上得到實現(xiàn)。使用MPI作消息傳遞的C或Fortran并行程序可不加改變地運行在IBMPC、MSWindows、Unix工作站、以及各種并行機上。第四頁,共二十五頁,2022年,8月28日二月23MPI并行程序設(shè)計5/25HelloWorld(.cpp)#include<iostream>#include"mpi.h"main(intargc,char*argv[]){

intmyid,

numprocs;

MPI_Init(&argc,&argv);

MPI_Comm_rank(MPI_COMM_WORLD,&myid);

MPI_Comm_size(MPI_COMM_WORLD,&numprocs);cout<<"Helloworld!";

cout<<"Iam"<<myid<<"of"<<numprocs<<"!"<<endl;

MPI_Finalize();}第五頁,共二十五頁,2022年,8月28日二月23MPI并行程序設(shè)計6/25MPI程序的編譯與運行使用節(jié)點進行操作(范圍c0101-c0116):rshc0101進入程序所在目錄:cdzhaijg編譯,生成可執(zhí)行代碼文件ccc:mpicc-occcmyHelloworld.cpp

指定節(jié)點數(shù)及進程數(shù),并執(zhí)行:qsub-lnodes=2:ppn=2mytest%小寫o%小寫l節(jié)點數(shù)進程數(shù)第六頁,共二十五頁,2022年,8月28日二月23MPI并行程序設(shè)計7/25mytest文件echothisscriptpidis$$

echoWorkingdirectoryis$LJRS_O_WORKDIR

echo$LJRS_0_WORKDIR=$LJRS_O_WORKDIR

cd$LJRS_O_WORKDIR

echoRuningonhost`hostname`

echoTimeis`date`

echoDirectoryis`pwd`

echoThisjobsrunsonthefollowingprocessors:

echo\$LJRS_NODEFILE=$LJRS_NODEFILE

echo`cat$LJRS_NODEFILE`

NPROCS=`wc-l<$LJRS_NODEFILE`

echoThisjobhasallocated$NPROCSnodes

mpirun-m$LJRS_NODEFILE-np$NPROCS/export/home/emfeng/zhaijg/ferm/ccc

echo`date`路徑,及編譯時起的名字可執(zhí)行文件ccc第七頁,共二十五頁,2022年,8月28日二月23MPI并行程序設(shè)計8/25Hello是如何被執(zhí)行的::::#include<stdio.h>#include"mpi.h"main(intargc,char*argv[]){

intmyid,

numprocs;

MPI_Init(&argc,&argv);

MPI_Comm_rank(MPI_COMM_WORLD,&myid);

MPI_Comm_size(MPI_COMM_WORLD,&numprocs);cout<<“Helloworld!”;cout<<“Iam”<<myid<<“of”<<numprocs<<“!”);

MPI_Finalize();}HelloWorld!Iam3of4!HelloWorld!Iam2of4!HelloWorld!Iam4of4!HelloWorld!Iam1of4!第八頁,共二十五頁,2022年,8月28日二月23MPI并行程序設(shè)計9/25最基本的MPIMPI調(diào)用借口的總數(shù)雖然龐大,但常用的MPI調(diào)用的個數(shù)確實有限。下面是6個最基本的MPI函數(shù)。MPI_Init(…);MPI_Comm_size(…);MPI_Comm_rank(…);MPI_Send(…);MPI_Recv(…);MPI_Finalize();MPI_Init(…);…并行代碼;…MPI_Fainalize();只能有串行代碼;第九頁,共二十五頁,2022年,8月28日二月23MPI并行程序設(shè)計10/25點到點通信(MPI_Send)intMPI_Send(void*buf,intcount,MPI_Datatypedatatype,intdest,inttag,MPI_Commcomm);

INbuf 發(fā)送緩沖區(qū)的起始地址

INcount 要發(fā)送信息的元素個數(shù)

INdatatype發(fā)送信息的數(shù)據(jù)類型

INdest 目標(biāo)進程的rank值

INtag 消息標(biāo)簽

INcomm 通信子第十頁,共二十五頁,2022年,8月28日二月23MPI并行程序設(shè)計11/25點到點通信(MPI_Recv)intMPI_Recv(void*buf,intcount,MPI_Datatypedatatype,intsource,inttag,MPI_Commcomm,MPI_Status*status);

OUTbuf 接收緩沖區(qū)的起始地址

INcount 要接收信息的元素個數(shù)

INdatatype 接收信息的數(shù)據(jù)類型

INsource 源進程的rank值

INtag 消息標(biāo)簽

INcomm 通信子

OUTstatus status對象,包含實際接收到的消息的有關(guān)信息第十一頁,共二十五頁,2022年,8月28日二月23MPI并行程序設(shè)計12/25數(shù)據(jù):<起始地址、數(shù)據(jù)個數(shù)、數(shù)據(jù)類型>*類型,大小必須匹配*信封:<源/目的、標(biāo)識、通信域>第十二頁,共二十五頁,2022年,8月28日二月23MPI并行程序設(shè)計13/25例程:發(fā)送字符串#include<stdio.h>#include"mpi.h"main(intargc,char*argv[]){ intnumprocs;/*進程數(shù),該變量為各處理器中的同名變量,存儲是分布的 */ intmyid; /*我的進程ID,存儲也是分布的 */ MPI_Statusstatus; /*消息接收狀態(tài)變量,存儲也是分布的 */

charmessage[100]; /*消息buffer,存儲也是分布的 */

/*初始化MPI*/

MPI_Init(&argc,&argv);/*該函數(shù)被各進程各調(diào)用一次,得到自己的進程rank值*/

MPI_Comm_rank(MPI_COMM_WORLD,&myid);

/*該函數(shù)被各進程各調(diào)用一次,得到進程數(shù)*/

MPI_Comm_size(MPI_COMM_WORLD,&numprocs);第十三頁,共二十五頁,2022年,8月28日二月23MPI并行程序設(shè)計14/25if(myid!=0){

/*建立消息*/sprintf(message,"Greetingsfromprocess%d!",myid);

/*發(fā)送長度取strlen(message)+1,使\0也一同發(fā)送出去*/

MPI_Send(message,strlen(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,&status);printf(“%s\n",message);}}

/*關(guān)閉MPI,標(biāo)志并行代碼段的結(jié)束*/

MPI_Finalize();}/*Endmain*/第十四頁,共二十五頁,2022年,8月28日二月23MPI并行程序設(shè)計15/25程序執(zhí)行過程

假設(shè)進程數(shù)為3(進程0)(進程1)(進程2)(rank=0)(rank=1)(rank=2)..Recv();..Recv();.....Send();......Send()...第十五頁,共二十五頁,2022年,8月28日MPI并行程序設(shè)計二月2316/25MPI基本數(shù)據(jù)類型第十六頁,共二十五頁,2022年,8月28日二月23MPI并行程序設(shè)計17/25集合通信特點通信空間中的所有進程都參與通信操作每一個進程都需要調(diào)用該操作函數(shù)一到多多到一同步第十七頁,共二十五頁,2022年,8月28日二月23MPI并行程序設(shè)計18/25類型函數(shù)功能數(shù)據(jù)移動MPI_Bcast一到多,數(shù)據(jù)廣播MPI_Gather多到一,數(shù)據(jù)匯合MPI_GathervMPI_Gather的一般形式MPI_AllgatherMPI_Gather的一般形式MPI_AllgathervMPI_Allgather的一般形式MPI_Scatter一到多,數(shù)據(jù)分散MPI_ScattervMPI_Scatter的一般形式MPI_Alltoall多到多,置換數(shù)據(jù)(全互換)MPI_AlltoallvMPI_Alltoall的一般形式數(shù)據(jù)聚集MPI_Reduce多到一,數(shù)據(jù)歸約MPI_Allreduce上者的一般形式,結(jié)果在所有進程MPI_Reduce_scatter結(jié)果scatter到各個進程MPI_Scan前綴操作同步MPI_Barrier同步操作MPI集合通信函數(shù)All:表示結(jié)果到所有進程.V:Variety,被操作的數(shù)據(jù)對象和操作更為靈活.%第十八頁,共二十五頁,2022年,8月28日二月23MPI并行程序設(shè)計19/25數(shù)據(jù)移動

Broadcast

Scatter

Gather

Allgather

Alltoall第十九頁,共二十五頁,2022年,8月28日二月23MPI并行程序設(shè)計20/25數(shù)據(jù)聚集ReduceAllreduceReduce-scatterScanMPI預(yù)定義全局數(shù)據(jù)運算符:MPI_MAX/MPI_MIN;MPI_SUM求和MPI_PROD求積MPI_LAND邏輯與MPI_LOR邏輯或MPI_MAXLOC/MPI_MINLOC最大/小值求下相應(yīng)位置…

…第二十頁,共二十五頁,2022年,8月28日二月23MPI并行程序設(shè)計21/25intp,myrank;floatbuf;MPI_Commcomm;MPI_Init(&argc,&argv);/*得進程編號*/MPI_Comm_rank(comm,&my_rank);/*得進程總數(shù)*/MPI_Comm_size(comm,&p);if(myrank==0) buf=1.0;MPI_Bcast(&buf,1,MPI_FLOAT,0,comm);MPI_Bcast--數(shù)據(jù)廣播databuf..MPI_Bcast();.data..MPI_Bcast();.data..MPI_Bcast();.Process0myrank=0Process1myrank=1Processp-1myrank=p-1根進程既是發(fā)送緩沖區(qū)也是接收緩沖區(qū)第二十一頁,共二十五頁,2022年,8月28日二月23MPI并行程序設(shè)計22/25MPI_Gather--數(shù)據(jù)收集intp,myrank;floatdata[10];/*分布變量*/float*buf;MPI_Commcomm;MPI_Init(&argc,&argv);/*得進程編號*/MPI_Comm_rank(comm,&my_rank);/*得進程總數(shù)*/MPI_Comm_size(comm,&p);if(myrank==0) buf=(float*)malloc(p*10*sizeof(float);/*開辟接收緩沖區(qū)*/MPI_Gather(data,10,MPI_FLOAT, buf,10,MPI_FlOAT,0,comm);data.MPI_Gather();.data.MPI_Gather();.data.MPI_Gather();.Process0myrank=0Process1myrank=1Processp-1myrank=p-1根進程接收其他進程來的消息(包括根進程),按每在進程在通信組中的編號依次聯(lián)接在一下,存放在根進程的接收緩沖區(qū)中.buf第二十二頁,共二十五頁,2022年,8月28日二月23MPI并行程序設(shè)計23/25MPI_Scatter--數(shù)據(jù)分散intp,myrank;floatdata[10];float*buf;MPI_Commcomm;MPI_Init(&argc,&argv);/*得進程編號*/MPI_Comm_rank(comm,&my_rank);/*得進程總數(shù)*/MPI_Comm_size(comm,&p);if(myrank==0) buf=(float*)malloc(p*10*sizeof(float);/*開辟發(fā)送緩沖區(qū)*/MPI_Scatter(buf,10,MPI_FLOAT, data,10,MPI_FlOAT,0,comm);data.MPI_Scatter();.data.MPI_Scatter();.data.MPI_Scatter();.Process

溫馨提示

  • 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

提交評論