第4次實(shí)驗(yàn)2并行計(jì)算中節(jié)點(diǎn)間的Reduce操作_第1頁(yè)
第4次實(shí)驗(yàn)2并行計(jì)算中節(jié)點(diǎn)間的Reduce操作_第2頁(yè)
第4次實(shí)驗(yàn)2并行計(jì)算中節(jié)點(diǎn)間的Reduce操作_第3頁(yè)
第4次實(shí)驗(yàn)2并行計(jì)算中節(jié)點(diǎn)間的Reduce操作_第4頁(yè)
第4次實(shí)驗(yàn)2并行計(jì)算中節(jié)點(diǎn)間的Reduce操作_第5頁(yè)
全文預(yù)覽已結(jié)束

下載本文檔

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

文檔簡(jiǎn)介

1、3.5并行計(jì)算中節(jié)點(diǎn)間的Reduce操作Map/Reduce是Google引以自豪的技術(shù)之一,Map/Reduce技術(shù)被認(rèn)為能很好的實(shí)現(xiàn)計(jì)算的并行化,成 為云計(jì)算中的一項(xiàng)重要技術(shù),我們姑且不論Map/Reduce技術(shù)是否會(huì)成為未來(lái)云計(jì)算的主流技術(shù),其實(shí) Map/Reduce也不是Google的創(chuàng)新,在MPI中就一直提供對(duì)各節(jié)點(diǎn)數(shù)據(jù)的歸約(Reduce)操作,可以方便 的完成多個(gè)節(jié)點(diǎn)向主節(jié)點(diǎn)的歸約,并提供了相應(yīng)的函數(shù)支持。云計(jì)算從技術(shù)的角度看就是從并行計(jì)算一步 步走過(guò)來(lái)的。本節(jié)我們將來(lái)看看在MPI中是如何實(shí)現(xiàn)Reduce操作的。本節(jié)中我們以采用Monte-Carlo法計(jì)算函數(shù)積分的例子來(lái)說(shuō)明MP

2、I中Reduce函數(shù)的使用方法。我們采用這一方法來(lái)計(jì)算 = 2在0到10之間的積分值。具體計(jì)算方法如圖3.4:圖3.4 Monte-Carlo計(jì)算積分的方法該算法的思想是通過(guò)隨機(jī)數(shù)把函數(shù)劃分成小的矩形塊,通過(guò)求矩形塊的面積和來(lái)對(duì)積分值,我們生成n個(gè)0到10之間的隨機(jī)數(shù),求出該隨機(jī)數(shù)所對(duì)應(yīng)的函數(shù)值作為矩形的高,由于隨機(jī)數(shù)在n很大時(shí)會(huì)近似平 均分布在0到10區(qū)間,所以矩形的寬取相同的值為10,對(duì)所有的矩形塊求和即可得函數(shù)的積分值。MPI函數(shù)說(shuō)明:1.歸約函數(shù) int MPI_Reduce(void *sendbuf,void *recvbuf,int count,MPI_Datatype data

3、type,MPI_Op op,int root,MPI_Comm comm)參數(shù)描述:sendbuf為數(shù)據(jù)發(fā)送緩沖區(qū);recvbuf為數(shù)據(jù)接收緩沖區(qū);count為發(fā)送的數(shù)據(jù)個(gè)數(shù);datatype為發(fā)送的數(shù)據(jù)類(lèi)型;op為執(zhí)行的歸約操作;root指定根節(jié)點(diǎn);comm為通訊域MPI_Reduce提供了多種歸約操作,如下表:MPI中的歸約名含義MPI_MAX求最大值MPI_MIN 求最小值MPI_SUM 求和MPI_PROD 求積MPI_LAND 邏輯與MPI_BAND 按位與MPI_LOR邏輯或MPI_BOR按位或MPI_LXOR邏輯異或MPI_BXOR按位異或MPI_MAXLOC最大值且相應(yīng)位置M

4、PI_MINLOC最小值且相應(yīng)位置并行源代碼:程序3.7/*文件名 inte.c*/#define N 100000000#include #include #include #include mpi.hint main(int argc, char* argv)int myid,numprocs;int i;double local=0.0;double inte,tmp=0.0,x;MPI_Init(&argc, &argv);MPI_Comm_rank(MPI_COMM_WORLD, &myid);MPI_Comm_size(MPI_COMM_WORLD,&numprocs);srand

5、(int)time(0);/設(shè)置隨機(jī)數(shù)種子/*各節(jié)點(diǎn)分別計(jì)算一部分積分值*/*以下代碼在不同節(jié)點(diǎn)運(yùn)行的結(jié)果不同*/for(i=myid;iN;i=i+numprocs)x=10.0*rand()/(RAND_MAX+1.0);/求 函數(shù)值tmp=x*x/N;local=tmp+local;/各節(jié)點(diǎn)計(jì)算面積和計(jì)算總的面積和,得到積分值MPI_Reduce(&local,&inte,1,MPI_DOUBLE,MPI_SUM,0,MPI_COMM_WORLD);if(myid=0)printf(The integal of x*x=%16.15fn,inte);MPI_Finalize();運(yùn)行結(jié)果

6、:The integal of x*x=33.333451312647291程序說(shuō)明:以上程序通過(guò)隨機(jī)數(shù)將積分區(qū)域劃分為100000000個(gè)小的區(qū)域,各節(jié)點(diǎn)計(jì)算一部分小矩形的面積,最 后通過(guò)MPI_Reduce()函數(shù)對(duì)所有節(jié)點(diǎn)的計(jì)算結(jié)果進(jìn)行歸約求和得到最后的積分值,歸約的過(guò)程就是各節(jié)點(diǎn) 向主節(jié)點(diǎn)發(fā)送數(shù)據(jù),由主節(jié)點(diǎn)接收數(shù)據(jù)并完成指定的計(jì)算操作,這一思想與云計(jì)算中的Map/Reduce思想 類(lèi)似,都是將任務(wù)分配到各節(jié)點(diǎn)計(jì)算最后由主節(jié)點(diǎn)匯總結(jié)果。程序通過(guò)myid和numpros參數(shù)的配合使同 一段程序在不同的節(jié)點(diǎn)運(yùn)行時(shí)完成不同部分的積分工作,這利用了MPI并行編程中變量分布式存儲(chǔ)的原 理,不同的節(jié)

7、點(diǎn)其myid值是不同的。可見(jiàn)在MPI中會(huì)出現(xiàn)相同的代碼在不同的節(jié)點(diǎn)執(zhí)行時(shí)結(jié)果不一樣的 情況,這在串行程序中是不會(huì)出現(xiàn)的,大家要注意理解。3.6用MPI的六個(gè)基本函數(shù)實(shí)現(xiàn)Reduce函數(shù)功能我們前面說(shuō)過(guò)采用MPI的六個(gè)基本函數(shù)幾乎可以實(shí)現(xiàn)大部份的并行計(jì)算功能,但為了方便程序設(shè)計(jì)人 員實(shí)際上MPI為我們提供了大量的函數(shù)可供使用,但這些功能我們大多可以采用這六個(gè)函數(shù)來(lái)實(shí)現(xiàn)。本節(jié) 就為大家演示如何用基本函數(shù)實(shí)現(xiàn)MPI中的MPI_Reduce()函數(shù)的部分功能,我們所選的問(wèn)題同樣是采用 隨機(jī)數(shù)方式計(jì)算積分,但我們并不保證MPICH 一定是這樣實(shí)現(xiàn)的。并行源代碼:程序3.8/*文件名 myreduce.c

8、*/#define N 100000000#include #include #include #include mpi.h”void Myreduce(double *sendbuf, double *recvbuf,int count,int root);/定義自己的 reduce 函數(shù)int main(int argc, char* argv)int myid,numprocs;int i;double local=0.0;double inte,tmp=0.0,x;MPI_Init(&argc, &argv);MPI_Comm_rank(MPI_COMM_WORLD, &myid);M

9、PI_Comm_size(MPI_COMM_WORLD,&numprocs);/*采用歸約對(duì)y=x*x在1,10區(qū)間求積分*/srand(int)time(0);for(i=myid;iN;i=i+numprocs)x=10.0*rand()/(RAND_MAX+1.0);tmp=x*x/N;local=tmp+local;Myreduce(&local,&inte,1,0);/調(diào)用自定義的規(guī)約函數(shù)if(myid=0)printf(The integal of x*x=%16.15fn”,inte);MPI_Finalize();/*自定義的歸約函數(shù),sendbuf發(fā)送緩沖區(qū),recvbuf接

10、收緩沖區(qū),count數(shù)據(jù)個(gè)數(shù),root指定根節(jié)點(diǎn)*/*該函數(shù)實(shí)現(xiàn)歸約求和的功能*/void Myreduce(double *sendbuf,double *recvbuf,int count,int root)MPI_Status status;int i;int myid,numprocs;*recvbuf=0.0;MPI_Comm_rank(MPI_COMM_WORLD, &myid);MPI_Comm_size(MPI_COMM_WORLD,&numprocs);double *tmp;/非root節(jié)點(diǎn)向root節(jié)點(diǎn)發(fā)送數(shù)據(jù)if(myid!=root)MPI_Send(sendbuf,

11、count,MPI_DOUBLE,root,99,MPI_COMM_WORLD);/root節(jié)點(diǎn)接收數(shù)據(jù)并對(duì)數(shù)據(jù)求和,完成規(guī)約操作if(myid=root)*recvbuf=*sendbuf;for(i=0;inumprocs;i+)if(i!=root)MPI_Recv(tmp,count,MPI_DOUBLE,i,99,MPI_COMM_WORLD,&status);*recvbuf=*recvbuf+*tmp;運(yùn)行結(jié)果:The integal of x*x=33.332395313332192程序說(shuō)明:本示例程序中我們自定義了一個(gè)歸約函數(shù)Myreduce(),所用到的MPI函數(shù)沒(méi)有超過(guò)6個(gè)基本函數(shù),該 函數(shù)包括4個(gè)參數(shù),第一個(gè)參數(shù)sendbuf為各節(jié)點(diǎn)的發(fā)送緩沖區(qū),第二個(gè)參數(shù)recvbuf為根節(jié)點(diǎn)的接收緩沖 區(qū),第三個(gè)參數(shù)count為每個(gè)節(jié)點(diǎn)發(fā)送的數(shù)據(jù)個(gè)數(shù),第四個(gè)參數(shù)root為需要指定的接收數(shù)據(jù)并歸約數(shù)據(jù)的 根節(jié)點(diǎn)。該函數(shù)沒(méi)有給出具體的歸約操作,默認(rèn)為對(duì)所有數(shù)據(jù)做求和的歸約操作。程序執(zhí)行到這一函數(shù)后 將各自節(jié)點(diǎn)的指定數(shù)據(jù)向根節(jié)點(diǎn)發(fā)送,并由根節(jié)點(diǎn)

溫馨提示

  • 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ì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論