版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
并行技术及算例美国sgi
电子计算机公司曹银锋2003.7sgiMPI培训教程-算例全文共72页,当前为第1页。
programname_version implicitnone include'mpif.h‘
integerversion,subversion,ierr,length character*(MPI_MAX_PROCESSOR_NAME)name integeri,errs
callMPI_INIT(ierr) name=""cgetthenameofmachineandthesizeofname callMPI_GET_PROCESSOR_NAME(name,length,ierr)
MPI培训教程-算例全文共72页,当前为第2页。cgettheversionofMPIcallMPI_GET_VERSION(version,subversion,ierr) errs=0 doi=length+2,MPI_MAX_PROCESSOR_NAME if(name(i:i).ne."")then errs=errs+1 endif enddo
MPI培训教程-算例全文共72页,当前为第3页。if(errs.gt.0)then write(*,*)'Non-blanksaftername' else write(*,*)'Themachinenameis',name write(*,9)version,subversion endif9format('MPIversion',I2,'.',I2)callMPI_FINALIZE(ierr) endMPI培训教程-算例全文共72页,当前为第4页。依赖关系分析技术一个程序的各部分之间总存在一定的数据或控制依赖关系,并行计算就是要在不破坏这种依赖关系的前题下,把程序分解成多个任务来并行执行,从而缩短整个程序运行所需的墙上时钟时间。因此,数据和控制依赖关系分析的理论和技术是并行程序设计的基础和关键。只有作出正确的分析才能保证程序的正确性,只有找出尽可能多的不相关部分,才能提高并行程序的并行度。MPI培训教程-算例全文共72页,当前为第5页。程序并行化转换
通过程序变换,我们可以消除相关性或对程序进行优化,这里只作简单介绍。.循环分布例:DO20I=1,100S1V(I)=P(I)*A+B(I)S2Q(I)=V(I)+V(I-1)20CONTINUE显然S1和S2存在数据依赖,该循环不能并行化,但我们可以将该循环分成两个循环,中间嵌入通信语句。DoallS1
I=1,100S1:V(I)=P(I)*A+B(I)发送V(I),接收V(I-1)DoallS2I=1,100S2:Q(I)=V(I)+V(I-1)MPI培训教程-算例全文共72页,当前为第6页。程序并行化转换MPI培训教程-算例全文共72页,当前为第7页。一个简单的串行程序并行化
例子MPI培训教程-算例全文共72页,当前为第8页。串行程序代码#include<stdio.h>voidmain(argc,argv)intargc;char*argv[];{ intA,B,C,D,E,F,G;
B=1; C=2; F=3; G=4;
A=B+C; E=F+G; D=A-E; printf("D=%d\n",D); return;}sgiMPI培训教程-算例全文共72页,当前为第9页。实现三个进程的并行代码(一)#include"mpi.h"#include<stdio.h>
voidmain(argc,argv)intargc;char*argv[];{ intA,B,C,D,E,F,G; intnumprocs,myid;
MPI_Init(&argc,&argv); MPI_Comm_size(MPI_COMM_WORLD,&numprocs); MPI_Comm_rank(MPI_COMM_WORLD,&myid);
if(numprocs!=3){ printf("numprocesmustequalto3!\n"); MPI_Finalize(); return; } sgiMPI培训教程-算例全文共72页,当前为第10页。实现三个进程的并行代码(二) if(myid==1){ B=1; C=2; A=B+C; MPI_Send(&A,1,MPI_INT,0,80,MPI_COMM_WORLD); }elseif(myid==2){ F=3; G=4; E=F+G; MPI_Send(&E,1,MPI_INT,0,80,MPI_COMM_WORLD); }elseif(myid==0){ MPI_Recv(&A,1,MPI_INT,1,80,MPI_COMM_WORLD); MPI_Recv(&E,1,MPI_INT,2,80,MPI_COMM_WORLD); D=A-E; printf("D=%d\n",D); } MPI_Finalize();}sgiMPI培训教程-算例全文共72页,当前为第11页。实现二个进程的并行代码(一)#include"mpi.h"#include<stdio.h>
voidmain(argc,argv)intargc;char*argv[];{ intA,B,C,D,E,F,G; intnumprocs,myid;
MPI_Init(&argc,&argv); MPI_Comm_size(MPI_COMM_WORLD,&numprocs); MPI_Comm_rank(MPI_COMM_WORLD,&myid); if(numprocs!=2){ printf("numprocesmustequalto3!\n"); MPI_Finalize(); return; } sgiMPI培训教程-算例全文共72页,当前为第12页。实现二个进程的并行代码(二) if(myid==0){ B=1; C=2; A=B+C; MPI_Recv(&E,1,MPI_INT,1,80,MPI_COMM_WORLD); D=A-E; printf("D=%d\n",D); }elseif(myid==1){ F=3; G=4; E=F+G; MPI_Send(&E,1,MPI_INT,0,80,MPI_COMM_WORLD); } MPI_Finalize();}sgiMPI培训教程-算例全文共72页,当前为第13页。二:计算π的串行及并行程序例子sgiMPI培训教程-算例全文共72页,当前为第14页。
用数值积分法求∏的函数表达式,就是区间[0,1]内与函数曲线4/(1+X2)组成的面积,此面积就是π的近似值,为此先将区间[0,1]划分成N个等间隔的子区间,每个子区间的宽度为1/N;然后计算出各个子区间中点处的函数值;再将各个子区间面积相加就可以得出∏的近似值。sgiMPI培训教程-算例全文共72页,当前为第15页。计算公式sgiMPI培训教程-算例全文共72页,当前为第16页。计算π的C语言串行程序#include<stdio.h>#include<math.h>
#defineN1000000main(){ doublelocal,pi=0.0,w; longi;
w=1.0/N; for(i=0;i<N;i++){ local=(i+0.5)*w; pi=pi+4.0/(1.0+local*local); } printf(“piis%f\n”,pi*w);}sgiMPI培训教程-算例全文共72页,当前为第17页。计算π的C语言并行程序(1)#include"mpi.h"#include<stdio.h>#include<math.h>
doublef(a)doublea;{return(4.0/(1.0+a*a));}sgiMPI培训教程-算例全文共72页,当前为第18页。计算π的C语言并行程序(2)voidmain(argc,argv)intargc;char*argv[];{intdone=0,n,myid,numprocs,i;doublePI25DT=3.141592653589793238462643;doublemypi,pi,h,sum,x;
MPI_Init(&argc,&argv);MPI_Comm_size(MPI_COMM_WORLD,&numprocs);MPI_Comm_rank(MPI_COMM_WORLD,&myid);if(myid==0){n=1000000;}MPI_Bcast(&n,1,MPI_INT,0,MPI_COMM_WORLD);sgiMPI培训教程-算例全文共72页,当前为第19页。计算π的C语言并行程序(3)h=1.0/(double)n;/*计算区间宽度*/sum=0.0;for(i=myid;i<n;i+=numprocs){x=h*((double)i+0.5);sum+=f(x);}mypi=h*sum;MPI_Reduce(&mypi,&pi,1,MPI_DOUBLE,MPI_SUM,0,MPI_COMM_WORLD);if(myid==0){printf("piisapproximately%.16f,Erroris%.16f\n",pi,fabs(pi-PI25DT));}MPI_Finalize();}计算结果:piisapproximately3.1415926535897643,Erroris0.0000000000000289sgiMPI培训教程-算例全文共72页,当前为第20页。计算π的Fortran并行程序(1)programmaininclude'mpif.h'
doubleprecisionPI25DTparameter(PI25DT=3.141592653589793238462643d0)doubleprecisionmypi,pi,h,sum,x,f,aintegern,myid,numprocs,i,rccfunctiontointegratef(a)=4.d0/(1.d0+a*a)sgiMPI培训教程-算例全文共72页,当前为第21页。计算π的Fortran并行程序(2)callMPI_INIT(ierr)callMPI_COMM_RANK(MPI_COMM_WORLD,myid,ierr)callMPI_COMM_SIZE(MPI_COMM_WORLD,numprocs,ierr)sizetype=1sumtype=2
if(myid.eq.0)thenn=1000000endifcallMPI_BCAST(n,1,MPI_INTEGER,0,MPI_COMM_WORLD,ierr)h=1.0d0/nsum=0.0d0do20i=myid,n,numprocsx=h*(dble(i)+0.5d0)sum=sum+f(x)20continuemypi=h*sum
sgiMPI培训教程-算例全文共72页,当前为第22页。计算π的Fortran并行程序(3)
c0节点收集所有其它节点上的和callMPI_REDUCE(mypi,pi,1,MPI_DOUBLE_PRECISION,$MPI_SUM,0,MPI_COMM_WORLD,ierr)
c0节点输出if(myid.eq.0)thenwrite(6,97)pi,abs(pi-PI25DT)97format('piisapproximately:',F18.16,'Erroris:',F18.16)endif
callMPI_FINALIZE(rc)stopend计算结果:piisapproximately3.1415926535897643,Erroris0.0000000000000289sgiMPI培训教程-算例全文共72页,当前为第23页。(i,j)(i+1,j)(i-1,j)(i,j-1)(i,j+1)算例二:问题任务描述B(i,j)=0.25*(A(i-1,j)+A(i+1,j)+A(i,j-1)+A(i,j+1))数学描述:MPI培训教程-算例全文共72页,当前为第24页。算例三:问题任务描述B(i,j)=0.25*(A(i-1,j)+A(i+1,j)+A(i,j-1)+A(i,j+1))数学描述:其中i=1,000,000j=1,000,000A(i,j)=j+jMPI培训教程-算例全文共72页,当前为第25页。
REALA(0:n+1,0:n+1),B(1:n,1:n) ... !MainLoop DOWHILE(.NOT.converged) !perform4pointstencil DOj=1,n DOi=1,n B(i,j)=0.25*(A(i-1,j)+A(i+1,j)+A(i,j-1)+A(i,j+1)) ENDDO ENDDO
MPI培训教程-算例全文共72页,当前为第26页。!copyresultbackintoarrayA DOj=1,n DOi=1,n A(i,j)=B(i,j) ENDDO ENDDO ...!ConvergencetestomittedENDDOMPI培训教程-算例全文共72页,当前为第27页。1D划分2D划分矩阵的块划分方法(规模1)MPI培训教程-算例全文共72页,当前为第28页。1D划分2D划分矩阵的块划分方法(规模2)MPI培训教程-算例全文共72页,当前为第29页。雅可比迭代具有重叠的1D块分配和通信模式
MPI培训教程-算例全文共72页,当前为第30页。BA(i,j)BA(i,j)nn-1n+1n+1nn+2Rank=kRank=k+1雅可比迭代具有重叠的1D块分配和通信模式
MPI培训教程-算例全文共72页,当前为第31页。...REAL,ALLOCATABLEA(:,:),B(:,:)...!ComputenumberofprocessesandmyrankCALLMPI_COMM_SIZE(comm,p,ierr)CALLMPI_COMM_RANK(comm,myrank,ierr)!Computesizeoflocalblockm=n/pIF(myrank.LT.(n-p*m))THENm=m+1ENDIFMPI培训教程-算例全文共72页,当前为第32页。!AllocatelocalarraysALLOCATE(A(0:n+1,0:m+1),B(n,m))...
!MainloopDOWHILE(.NOT.converged)!ComputeDOj=1,mDOi=1,nB(i,j)=0.25*(A(i-1,j)+A(i+1,j)+A(i,j-1)+A(i,j+1))ENDDOENDDO采用send和recv通信MPI培训教程-算例全文共72页,当前为第33页。!CommunicateIF(myrank.GT.0)THENCALLMPI_SEND(B(1,1),n,MPI_REAL,myrank-1,tag,comm,ierr)CALLMPI_RECV(A(1,0),n,MPI_REAL,myrank-1,tag,comm,status,ierr)ENDIFIF(myrank.LT.p-1)THENCALLMPI_SEND(B(1,m),n,MPI_REAL,myrank+1,tag,comm,ierr)CALLMPI_RECV(A(1,m+1),n,MPI_REAL,myrank+1,tag,comm,status,ierr)ENDIF...ENDDO接上页MPI培训教程-算例全文共72页,当前为第34页。这种代码的通信模式是不安全的,因为每个处理器首先把消息发送到其2个相邻节点的处理器,随后接收它们发送的消息。获得这种代码安全版本的一种方法是交替发送和接收的次序。奇数序进程将先发送,后接收,而偶数序进程将先接收,后发送。MPI培训教程-算例全文共72页,当前为第35页。!MainloopDOWHILE(.NOT.converged)!ComputeDOj=1,mDOi=1,nB(i,j)=0.25*(A(i-1,j)+A(i+1,j)+A(i,j-1)+A(i,j+1))ENDDOENDDODOj=1,mDOi=1,nA(i,j)=B(i,j)ENDDOENDDO
奇偶数列分开发送接收的代码MPI培训教程-算例全文共72页,当前为第36页。!CommunicateIF(MOD(myrank,2).EQ.1)THENCALLMPI_SEND(B(1,1),n,MPI_REAL,myrank-1,tag,comm,ierr)CALLMPI_RECV(A(1,0),n,MPI_REAL,myrank-1,tag,comm,status,ierr)IF(myrank.LT.p-1)THENCALLMPI_SEND(B(1,m),n,MPI_REAL,myrank+1,tag,comm,ierr)CALLMPI_RECV(A(1,m+1),n,MPI_REAL,myrank+1,tag,comm,status,ierr)ENDIF
接上页MPI培训教程-算例全文共72页,当前为第37页。ELSE !myrankisevenIF(myrank.GT.0)THENCALLMPI_RECV(A(1,0),n,MPI_REAL,myrank-1,tag,comm,status,ierr)CALLMPI_SEND(B(1,1),n,MPI_REAL,myrank-1,tag,comm,ierr)ENDIFIF(myrank.LT.p-1)THENCALLMPI_RECV(A(1,m+1),n,MPI_REAL,myrank+1,tag,comm,status,ierr)CALLMPI_SEND(B(1,m),n,MPI_REAL,myrank+1,tag,comm,ierr)ENDIFENDIF...ENDDO接上页MPI培训教程-算例全文共72页,当前为第38页。在通信函数要求源和目标变元的任何地方都可以使用指定的值MPI_PROC_NULL,而不是序列。进程MPI_PROC_NULL通信无效,MPI_PROC_NULL发送成功,并立即返回,不要改变接收缓冲区。当执行source=MPI_PROC_NULL的接收时,状态目标返回source=MPI_PROC_NULL,tag=MPI_ANY_TAG和count=0。
空进程的应用MPI培训教程-算例全文共72页,当前为第39页。使用发送-接收以及空进程的版本
...REAL,ALLOCATABLEA(:,:),B(:,:)...!ComputenumberofprocessesandmyrankCALLMPI_COMM_SIZE(comm,p,ierr)CALLMPI_COMM_RANK(comm,myrank,ierr)
!Computesizeoflocalblockm=n/pIF(myrank.LT.(n-p*m))THENm=m+1ENDIF
MPI培训教程-算例全文共72页,当前为第40页。!ComputeneighborsIF(myrank.EQ.0)THENleft=MPI_PROC_NULLELSEleft=myrank-1ENDIFIF(myrank.EQ.p-1)THENright=MPI_PROC_NULLELSEright=myrank+1ENDIF
!AllocatelocalarraysALLOCATE(A(0:n+1,0:m+1),B(n,m))...接上页MPI培训教程-算例全文共72页,当前为第41页。!MainloopDOWHILE(NOT.converged)!ComputeDOj=1,mDOi=1,nB(i,j)=0.25*(A(i-1,j)+A(i+1,j)+A(i,j-1)+A(i,j+1))ENDDOENDDODOj=1,mDOi=1,nA(i,j)=B(i,j)ENDDOENDDO
接上页MPI培训教程-算例全文共72页,当前为第42页。!CommunicateIF(myrank.GT.0)THENCALLMPI_SENDRECV(B(1,1),n,MPI_REAL,myrank-1,tag,A(1,0),n,MPI_REAL,myrank-1,tag,comm,status,ierr)ENDIFIF(myrank.LT.p-1)THENCALLMPI_SENDRECV(B(1,m),n,MPI_REAL,myrank+1,tag,A(1,m+1),n,MPI_REAL,myrank+1,tag,comm,status,ierr)ENDIF...ENDDO这个代码是安全的,尽管是循环通信模式。对于替代变体需要增加中间缓冲,应该只使用一定量的缓冲区空间,否则,发送—接收不会比一对等效的阻塞发送和接收调用更健全。
使用发送-接收版本接上页MPI培训教程-算例全文共72页,当前为第43页。在许多系统中,通信与计算重叠进行可以提高性能。在智能通信控制器能自动执行通信的系统上就可以采用这种方法提高性能。多线程就是获得这种重叠的一种机制。当一个线程被阻塞,等待完成通信时,另一个线程可以在同一处理器上执行。使用无阻塞通信机制通常可以得到较好的性能。为了在计算和通信之间有最大的重叠,应尽可能快开始通信和尽可能迟完成通信,也就是说,待发送的数据是可用的,应立即投寄;接收缓冲区可重新使用时,应立即收取;仅在重新使用发送缓冲区之前完成发送和仅在使用接收缓冲区中的数据之前完成接收。有时可通过重新排序计算来增大重叠。使用无阻塞通信sgiMPI培训教程-算例全文共72页,当前为第44页。非阻塞发送启动发送立即返回计算计算完成释放发送缓存区发送消息非阻塞接收启动接收立即返回计算计算完成释放接收缓存区接收消息计算与通信重叠标准非阻塞消息发送和接收sgiMPI培训教程-算例全文共72页,当前为第45页。阻塞发送开始开始结束消息成功发送缓存区可释放阻塞接收开始开始结束消息成功接收缓存区数据可使用阻塞消息发送和接收sgiMPI培训教程-算例全文共72页,当前为第46页。通信调用使用本地数组B的最左边和最右边的列,并设置本地数组A的最左边和最右边的列。把对数组B最左边和最右边列的修改与数组B内部列的修改分开,以使发送缓冲区可用,由于这也是使用数组A最左边和最右边列的发送缓冲区,所以在这些列被修改后可以立即开始通信,而且可以在下一次迭代之前完成。
BA(i,j)BA(i,j)nn-1n+1n+1nn+2Rank=kRank=k+1边界和内部修改分开sgiMPI培训教程-算例全文共72页,当前为第47页。REAL,ALLOCATABLEA(:,:),B(:,:)INTEGERreq(4)INTEGERstatus(MPI_TATUS_SIZE,4)...!ComputenumberofprocessesandmyrankCALLMPI_COMM_SIZE(comm,p,ierr)CALLMPI_COMM_RANK(comm,myrank,ierr)
!Computesizeoflocalblockm=n/pIF(myrank.LT.(n-p*m))THENm=m+1ENDIF
使用无阻塞通信的版本
sgiMPI培训教程-算例全文共72页,当前为第48页。!ComputeneighborsIF(myrank.EQ.0)THENleft=MPI_PROC_NULLELSEleft=myrank-1ENDIFIF(myrank.EQ.p-1)THENright=MPI_PROC_NULLELSEright=myrank+1ENDIF
!AllocatelocalarraysALLOCATE(A(0:n+1,0:m+1),B(n,m))...
接上页sgiMPI培训教程-算例全文共72页,当前为第49页。!MainloopDOWHILE(.NOT.converged)
!先计算需要通信的边界数据DOi=1,nB(i,1)=0.25*(A(i-1,1)+A(i+1,1)+A(i,0)+A(i,2))B(i,m)=0.25*(A(i-1,m)+A(i+1,m)+A(i,m-1)+A(i,m+1))ENDDO
!执行非阻塞通信,将下一次计算需要的数据首先通信CALLMPI_ISEND(B(1,1),n,MPI_REAL,left,tag,comm,req(1),ierr)CALLMPI_ISEND(B(1,m),n,MPI_REAL,right,tag,comm,req(2),ierr)CALLMPI_IRECV(A(1,0),n,MPI_REAL,left,tag,comm,req(3),ierr)CALLMPI_IRECV(A(1,m+1),n,MPI_REAL,right,tag,comm,req(4),ierr)接上页MPI培训教程-算例全文共72页,当前为第50页。!!计算剩余部分,更新数据DOj=2,m-1DOi=1,nB(i,j)=0.25*(A(i-1,j)+A(i+1,j)+A(i,j-1)+A(i,j+1))ENDDOENDDODOj=1,mDOi=1,nA(i,j)=B(i,j)ENDDOENDDO!完成非阻塞通信DOi=1,4CALLMPI_WAIT(req(i),status(1,i),ierr)ENDDO...ENDDO
接上页sgiMPI培训教程-算例全文共72页,当前为第51页。使用发送-接收以及空进程的版本
...REAL,ALLOCATABLEA(:,:),B(:,:)...!ComputenumberofprocessesandmyrankCALLMPI_COMM_SIZE(comm,p,ierr)CALLMPI_COMM_RANK(comm,myrank,ierr)
!Computesizeoflocalblockm=n/pIF(myrank.LT.(n-p*m))THENm=m+1ENDIF
sgiMPI培训教程-算例全文共72页,当前为第52页。持久的通信请求
通常,在并行计算的内部循环中要重复执行具有相同变元表的通信。在这种情况下,可以将通信变元表一次合并成持久的通信请求,然后重复使用这个请求启动并完成消息,从而优化通信。持久的通信请求可看作是一个通信端口或一个“半信道”。它不提供常规的信道的全部功能,因为没有将发送端口与接收端口合并。这种结构能减少进程与通信控制器之间的通信开销,但不减少一个通信控制器与另一个通信控制器之间的通信开销。sgiMPI培训教程-算例全文共72页,当前为第53页。
MPI_SEND_INIT(buf,count,datatype,dest,tag,comm,request)IN buf 发送缓冲区的起始地址
IN count 发送的项数
IN datatype 每个项的数据类型
IN dest 目的地的等级(号)
IN tag 消息标记
IN comm 通信因子
OUT request 请求句柄
sgiMPI培训教程-算例全文共72页,当前为第54页。intMPI_Send_init(void*buf,intcount,MPI_Datatypedatatype,intdest,inttag,MPI_Commcomm,MPI_Request*request)
MPI_SEND_INIT(BUF,COUNT,DATATYPE,DEST,TAG,COMM,REQUEST,IERROR)<type> BUF(*)INTEGERREQUEST,COUNT,DATATYPE,DEST,TAG,COMM,REQUEST,IERRORsgiMPI培训教程-算例全文共72页,当前为第55页。
MPI_RECV_INIT(buf,count,datatype,source,tag,comm,repuest)OUT buf 接收缓冲区的起始地址
IN count 接收的最大项数
IN datatype 每个项的数据类型
IN source 源的等级(号)
IN tag 消息标记
IN comm 通信因子
OUT request 请求句柄sgiMPI培训教程-算例全文共72页,当前为第56页。
intMPI_Recv_init(void*buf,intcount,MPI_Datatypedatatype,intsource,inttag,MPI_Commcomm,MPI_Request*request)MPI_RECV_INIT(BUF,COUNT,DATATYPE,SOURCE,TAG,COMM,REQUEST,IERROR)<type> BUF(*)INTEGERCOUNT,DATATYPE,SOURCE,TAG,COMM,REQUEST,IERRORsgiMPI培训教程-算例全文共72页,当前为第57页。应用允许写入接收缓冲区。尽管上面两个函数建立了持久的通信请求,但它们至此仍是非活动的。使用MPI_START或MPI_STARTALL激活它们,并启动相关的通信操作。
MPI_START(request)INOUTrequest请求句柄intMPI_Start(MPI_Request*request)MPI_START(REQUEST,IERROR)INTEGERREQUEST,IERRORsgiMPI培训教程-算例全文共72页,当前为第58页。!CreatepersistentrequestsCALLMPI_SEND_INIT(B(1,1),n,MPI_REAL,left,tag,comm,req(1),ierr)CALLMPI_SEND_INIT(B(1,m),n,MPI_REAL,right,tag,comm,req(2),ierr)CALLMPI_RECV_INIT(A(1,0),n,MPI_REAL,left,tag,comm,req(3),ierr)CALLMPI_RECV_INIT(A(1,m+1),n,MPI_REAL,right,tag,comm,req(4),ierr)....
sgiMPI培训教程-算例全文共72页,当前为第59页。!MainloopDOWHILE(.NOT.converged)
!ComputeboundarycolumnsDOi=1,nB(i,1)=0.25*(A(i-1,1)+A(i+1,1)+A(i,0)+A(i,2))B(i,m)=0.25*(A(i-1,m)+A(i+1,m)+A(i,m-1)+A(i,m+1))ENDDO
!StartcommunicationCALLMPI_STARTALL(4,req,ierr)
sgiMPI培训教程-算例全文共72页,当前为第60页。并行化编程的几个概念
sgi任务:是程序所要完成的一个工作,其内容和大小是随意的,它是并行程序所能处理的并发性最小的单元,即一个任务只能由一个处理器执行,处理器直接的并发性只能在任务之间开发。进程是一个完成任务的抽象的实体。处理器是物理资源。粒度:一个任务所涉及的工作量的大小。MPI培训教程-算例全文共72页,当前为第61页。发现并发性的途径(分解)
sgi1.考察程序的循环结构2.研究数据的基本相关性3.研究求解问题本身的特征,而不遵循串行程序本身的依赖关系MPI培训教程-算例全文共72页,当前为
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 甘孜藏族自治州理塘县2025-2026学年第二学期三年级语文第八单元测试卷(部编版含答案)
- 玉溪市澄江县2025-2026学年第二学期五年级语文期末考试卷(部编版含答案)
- 池州市青阳县2025-2026学年第二学期五年级语文第七单元测试卷(部编版含答案)
- 临沂市苍山县2025-2026学年第二学期五年级语文第七单元测试卷(部编版含答案)
- 五指山市2025-2026学年第二学期四年级语文第八单元测试卷(部编版含答案)
- 项目五 任务3 解析机器学习在汽车中的典型应用场景
- 2026年海关非编人员考试试题及答案
- 网格型箱式结构件智能化生产线项目可行性研究报告模板-备案审批
- 2026年儿童美术初级考试试题及答案
- 行业的市场营销活动策划方案模板
- 校园防溺水安全教育课件
- 杭州地铁建设管理有限公司2026届校园招聘笔试参考题库及答案解析
- 肌内注射课件
- 2024新人教版初中英语单词表默写版(七~九年级)
- 2023年国家开放大学招聘考试真题
- 《经济与社会》韦伯
- 高二下学期期末英语读后续写画的风波:我和妹妹在奶奶家的冲突讲义
- DL-T5054-2016火力发电厂汽水管道设计规范
- GB/T 15587-2023能源管理体系分阶段实施指南
- 华兴数控7系列说明书(车)
- YY/T 0995-2015人类辅助生殖技术用医疗器械术语和定义
评论
0/150
提交评论