并行计算课件_第1页
并行计算课件_第2页
并行计算课件_第3页
并行计算课件_第4页
并行计算课件_第5页
已阅读5页,还剩70页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

并行计算——结构•算法•编程主讲:雷向东中南大学信息科学与工程学院Central

South

UniversityCollege

of

Information

Science

and

Engineering并行程序设计概述2并行程序设计难的原因并行语言的构造方法并行性问题交互/通信问题五种并行编程风范计算圆周率的样本程序1

并行程序设计难的原因3技术先行,缺乏理论指导程序的语法/语义复杂,需要用户自已处理任务/数据的划分/分配数据交换同步和互斥性能平衡并行语言缺乏代可扩展和异构可扩展,程序移植困难,重写代码难度太大环境和工具缺乏较长的生长期,缺乏代可扩展和异构可扩展2

并行语言的构造方法串行代码段for

(

i=

0;

i<N;

i++

)

A[i]=b[i]*b[i+1];for

(i=

0;

i<N;

i++)

c[i]=A[i]+A[i+1];(a)

使用库例程构造并行程序

id=my_process_id();p=number_of_processes();for

(

i=

id;

i<N;

i=i+p)

A[i]=b[i]*b[i+1];barrier();for

(i=

id;

i<N;

i=i+p)

c[i]=A[i]+A[i+1];例子: MPI,PVM,

Pthreads(b)扩展串行语言my_process_id,number_of_processes(),

and

barrier()A(0:N-1)=b(0:N-1)*b(1:N)c=A(0:N-1)+A(1:N)例子:Fortran

90(c)

加编译注释构造并行程序的方法#pragma

parallel#pragma

shared(A,b,c)4#pragma

local(i){#

pragma

pfor

iterate(i=0;N;1)for

(i=0;i<N;i++)

A[i]=b[i]*b[i+1];#

pragma

synchronize#

pragma

pfor

iterate

(i=0;

N;

1)for

(i=0;i<N;i++)c[i]=A[i]+A[i+1];}例子:SGI

power

C方法实例优点缺点库例程MPI,

PVM易于实现,不需要新编译器无编译器检查,分析和优化扩展Fortran90允许编译器检查、分析和优化实现困难,需要新编译器编译器注释SGI

powerC,

HPF介于库例程和扩展方法之间,在串行平台上不起作用.5三种并行语言构造方法比较2

并行语言的构造方法3

并行性问题6进程的同构性SIMD:

所有进程在同一时间执行相同的指令MIMD:各个进程在同一时间可以执行不同的指令SPMD:各个进程是同构的,多个进程对不同的数据执行相同的代码(一般是数据并行的同义语)常对应并行循环,数据并行结构,单代码MPMD:各个进程是异构的,多个进程执行不同的代码(一般是任务并行,或功能并行,或控制并行的同义语)常对应并行块,多代码要为有1000个处理器的计算机编写一个完全异构的并行程序是很困难的进程的同构性73

并行性问题并行块parbegin S1

S2 S3

…….Sn

parendS1

S2 S3

…….Sn可以是不同的代码并行循环:当并行块中所有进程共享相同代码时parbegin S1

S2 S3

…….Sn

parendS1

S2 S3

…….Sn是相同代码简化为parfor (i=1;

i<=n,

i++)

S(i)用单代码方法说明SPMD要说明以下SPMD程序:parfor

(i=0;

i<=N,

i++)

foo(i)用户需写一个以下程序:pid=my_process_id();numproc=number_of

_processes();

parfor

(i=pid;

i<=N,

i=i+numproc)

foo(i)此程序经编译后生成可执行程序A,用shell脚本将它加载到N个处理结点上:run

A

–numnodes

N用数据并行程序的构造方法要说明以下SPMD程序:parfor

(i=0;

i<=N,

i++){

C[i]=A[i]+B[i];}用户可用一条数据赋值语句:C=A+B或forall

(i=1,N)

C[i]=A[i]+B[i]进程的同构性83

并行性问题SPMD程序的构造方法用SPMD伪造MPMD要说明以下MPMD程序:parbegin S1

S2

S3

parend可以用以下SPMD程序:parfor

(i=0;

i<3,

i++)

{if

(i=0)

S1if

(i=1)

S2if

(i=2)

S3}因此,对于可扩展并行机来说,只要支持SPMD就足够了用多代码方法说明MPMD对不提供并行块或并行循环的语言要说明以下MPMD程序:parbegin S1

S2

S3

parend用户需写3个程序,分别编译生成3个可执行程序S1S2

S3,用shell脚本将它们加载到3个处理结点上:run

S1

on

node1run

S2

on

node1run

S3

on

node1S1,S2和S3是顺序语言程序加上进行交互的库调用.进程的同构性93

并行性问题MPMD程序的构造方法3.2静态和动态并行性程序的结构:由它的组成部分构成程序的方法10静态并行性的例子:parbegin

P,

Q,

R

parend其中P,Q,R是静态的动态并行性的例子:while

(C>0)

beginfork

(foo(C));C:=boo(C);end3

并行性问题静态并行性:程序的结构以及进程的个数在运行之前(如编译时,连接时或加载时)就可确定,就认为该程序具有静态并行性.动态并行性:否则就认为该程序具有动态并行性.即意味着进程要在运行时创建和终止Process

A:beginProcess

B:beginProcess

C:beginZ:=1fork(C);Y:=foo(Z);fork(B);X:=foo(Z);endT:=foo(3);join(C);endoutput(X+Y);end11静态和动态并行性3

并行性问题开发动态并行性的一般方法:Fork/JoinFork:

派生一个子进程Join:

强制父进程等待子进程3.3进程编组目的:支持进程间的交互,常把需要交互的进程调度在同一组中一个进程组成员由:组标识符+成员序号唯一确定.3.4划分与分配原则:使系统大部分时间忙于计算,而不是闲置或忙于交互;同时不牺牲并行性(度).划分:切割数据和工作负载分配:将划分好的数据和工作负载映射到计算结点(处理器)上分配方式显式分配:由用户指定数据和负载如何加载隐式分配:由编译器和运行时支持系统决定就近分配原则:进程所需的数据靠近使用它的进程代码123

并行性问题并行度(Degree

of

Parallelism,DOP):同时执行的分进程数.并行粒度(Granularity):两次并行或交互操作之间所执行的计算负载.指令级并行块级并行进程级并行任务级并行并行度与并行粒度大小常互为倒数:增大粒度会减小并行度.增加并行度会增加系统(同步)开销133

并行性问题4

交互/通信问题14交互:进程间的相互影响4.1交互的类型通信:两个或多个进程间传送数的操作 通信方式:共享变量父进程传给子进程(参数传递方式)消息传递同步:导致进程间相互等待或继续执行的操作同步方式:原子同步控制同步(路障,临界区)数据同步(锁,条件临界区,监控程序,事件)15例子:原子同步parfor

(i:=1;

i<n;

i++)

{atomic{x:=x+1;

y:=y-1}}路障同步parfor(i:=1;

i<n;

i++){PibarrierQi}临界区parfor(i:=1;

i<n;

i++){critical{x:=x+1;

y:=y+1}}数据同步(信号量同步)parfor(i:=1;

i<n;

i++){lock(S);x:=x+1;y:=y-1;unlock(S)}4

交互/通信问题交互的类型164

交互/通信问题聚集(aggregation):用一串超步将各分进程计算所得的部分结果合并为一个完整的结果,每个超步包含一个短的计算和一个简单的通信或/和同步.聚集方式:归约扫描例子:计算两个向量的内积parfor(i:=1;

i<n;

i++){X[i]:=A[i]*B[i]inner_product:=aggregate_sum(X[i]);}4.2交互的方式4

交互/通信问题交互代码C……17P1

P2Pn相对于交互代码C,可对进程P定义如下状态:到达(arrived):P刚到达C,但还未进入在内(in): P在代码中完成(finished):P刚完成执行代码C,但还未离开在外(out): P不在代码中(未到达或已离开)同步的交互:所有参与者同时到达并执行交互代码C异步的交互:进程到达C后,不必等待其它进程到达即可执行C入口条件出口条件交互方式当事进程状态其它进程状态当事进程状态其它进程状态到达(arrived)到达(arrived)完成(finished)完成(finished)同步发送/接收到达(arrived)×完成(finished)×锁定发送到达(arrived)×完成(finished)完成(finished)锁定接收到达(arrived)×在内(in)×非锁定发送/接收到达(arrived)到达(arrived)完成(finished)在内(in)或完成(finished)路障到达(arrived)在外(out)完成(finished)在外(out)临界区18交互方式与入口/出口条件的组合4

交互/通信问题锁定的发送:消息已发完,但不一定已收到锁定的接收:消息已收到非锁定的发/收:只是发出发/收的请求4.3交互的模式按交互模式是否能在编译时确定分为:静态的动态的按有多少发送者和接收者参与通信分为一对一:点到点(point

to

point)一对多:广播(broadcast),播撒(scatter)多对一:收集(gather),归约(reduce)多对多:全交换(Tatal

Exchange),扫描(scan),置换/移位(permutation/shift)194

交互/通信问题135P1P2P3135,1P1P2P3135P1P2P31,13,15,1P1P2P31,3,5P1P2P31,3,535P1P2P3135P1P2P31,3,535P1P2P3(a)点对点(一对一):P1发送一个值给P320(b)

广播(一对多):P1发送一个值给全体(c)播撒(一对多):P1向每个结点发送一个值(d)

收集(多对一):P1从每个结点接收一个值4

交互/通信问题135P1P2P31,53,15,3P1P2P31,2,34,5,67,8,9P1P2P31,4,72,5,83,6,9P1P2P3135P1P2P31,13,45,9P1P2P3135P1P2P31,935P1P2P3(e)全交换(多对多):每个结点向每个结点发送一个不同的消息21(f)移位(置换,多对多):每个结点向下一个结点发送一个值并接收来自上一个结点的一个值.(g)

归约(多对一):P1得到和1+3+5=9(h)

扫描(多对多):P1得到1,P2得到

1+3=4,P3得到1+3+5=94

交互/通信问题相并行(Phase

Parallel)分治并行(Divide

and

Conquer

Parallel)流水线并行(Pipeline

Parallel)主从并行(Master-Slave

Parallel)工作池并行(Work

Pool

Parallel)225

五种并行编程风范相并行(PhaseParallel)一组超级步(相)步内各自计算步间通信、同步BSP(4.2.3)方便差错和性能分析计算和通信不能重叠CCCSynchronous

Interaction......CCCSynchronous

Interaction......23主-从并行(Master-Slave

Parallel)主进程:串行、协调任务子进程:计算子任务划分设计技术与相并行结合主进程易成为瓶颈MasterSlaveSlaveSlave24分治并行(Divide

and

Conquer

Parallel)父进程把负载分割并指派给子进程递归重点在于归并分治设计技术难以负载平衡25流水线并行(PipelineParallel)一组进程流水线作业流水线设计技术P1P2P326工作池并行(Work

PoolParallel)初始状态:一件工作进程从池中取任务执行可产生新任务放回池中直至任务池为空易与负载平衡临界区问题(尤其消息传递)Work

PoolP1P2P327并行程序设计模型28隐式并行(Implicit

Parallel)数据并行(Data

Parallel)共享变量(Shared

Variable)消息传递(Message

Passing)隐式并行(Implicit

Parallel)29概况:程序员用熟悉的串行语言编程编译器或运行支持系统自动转化为并行代码特点:语义简单可移植性好单线程,易于调试和验证正确性效率很低数据并行(Data

Parallel)30概况:SIMD的自然模型局部计算和数据选路操作特点:单线程并行操作于聚合数据结构(数组)松散同步单一地址空间隐式交互作用显式数据分布共享变量(Shared

Variable)31概况:PVP,SMP,DSM的自然模型特点:多线程:SPMD,MPMD异步单一地址空间显式同步隐式数据分布隐式通信消息传递(Message

Passing)32概况:MPP,

COW的自然模型特点:多线程异步多地址空间显式同步显式数据映射和负载分配显式通信MPI并行程序设计33MPI是目前最重要的并行编程工具,它具有移植性好功能强大、效率高等多种优点,而且有多种不同免费、高效、实用的实现版本,几乎所有的并行计算机厂商都提供对它的支持,这是其他的并行编程环境所无法比拟的。什么是MPI?34MPI(Message

Passing

Interface

)MPI是一个库,而不是一门语言;MPI是一种标准或规范的代表,而不特指某一个对它的具体实现;MPI是一种消息传递编程模型,并成为这种编程模型的代表和事实上的标准;消息传递模型假设底层的消息传递模型是一组处理器,每一个处理器有自己的本地内存,并且通过互连网络实现与其他处理器的消息传递处理器内存处理器内存处理器内存处理器内存处理器内存处理器内存处理器内存互连网络处理器内存35MPI的历史36MPI初稿:美国并行计算中心工作会议(92年4月)MPI-1公布:第一届MPI大会(93年2月)MPI标准正式发布:1994年5月MPI-1.1发布:1995年6月MPI-2发布:(以前的版本统称MPI-1),

1997年7月MPI的实现37MPICH:最重要的MPI实现与MPI-1规范同步发展的版本支持部分MPI-2的特征(如动态生成进程等)LAM(Local

Area

puter)Ohio

State

University开发它主要用于异构的计算机网络计算系统下载地址38MPICH2(最新版本1.0.3)LAM-MPI(最新版本7.1.2)http://机房环境39软件部分操作系统:Windows

Server

2003MPI实现:MPICH-1.2.5硬件部分集群系统有4个刀片(每片主要参数):2CPU

(Xeon3.2GHZ),2GB

RAM,2(4)个千兆网卡,2个SCSI硬盘机房集群环境40一个主节点(一个刀片)启用双网卡,设置内/外网IP地址,用于用户登陆、提交调试程序、管理员管理集群等。主节点开启SSH、Ftp等服务。三个从节点用于从主节点接受计算任务并执行计算(返回结果)。节点开启SSH服务。节点之间的通信通过SSH协议来实现六个接口构成的MPI子集41在MPI-1中,共有128个调用接口,在MPI-2中有287个。从理论上说,MPI所有的通信功能可以用它的6个基本的调用来实现,掌握了这6个调用,就可以实现所有的消息传递并行程序的功能。所有的MPI标识符,都以MPI前缀开头,后面紧跟一个大写字母和一系列小写字母以及下划线。MPI调用的参数说明IN:调用部分传递给MPI的参数,MPI除了使用该参数外不允许对这一参数做任何修改。OUT:MPI返回给调用部分的结果参数,该参数的初始值对MPI没有任何意义。INOUT:调用部分首先将该参数传递给MPI,MPI对这一参数引用、修改后,将结果返回给外部调用。1、MPI初始化:MPI_Init函数用法:MPI_Init(&argc,&argv)每一个MPI进程调用的第一个MPI函数都是MPI_Init。该函数指示系统完成所有的初始化工作,以备对后续

MPI库的调用进行处理。2、MPI结束:MPI_Finalize函数 用法:MPI_Finalize()在一个进程执行完其全部MPI库函数调用后,将调用函数MPI_Finalize,从而让系统释放分配给MPI的资源。它是MPI程序的最后一条可执行语句,否则程序的运行结果是不可预知的。423、确定进程的标识符用法:MPI_Comm_rank(

MPI_COMM_WORLD

,&id)。当MPI初始化后,每一个活动进程变成了一个叫做MPI_COMM_WORLD的通信域中的成员。通信域是一个不透明的对象,提供了在进程之间传递消息的环境。在一个通信域内的进程是有序的。在一个有p个进程的通信域中,每一个进程有一个唯一的序号(ID号),取值为0~p-1。进程可以通过调用函数MPI_Comm_rank来确定它在通信域中的序号。4、确定进程数量用法:MPI_Comm_size(

MPI_COMM_WORLD

,&p)。进程通过调用函数MPI_Comm_size来确定一个通信域中的进程总数。435、消息发送函数MPI_SEND(

m)参数说明:44IN buf:发送缓冲区的起始地址IN count:将要发送的数据的个数IN datatype:发送数据的数据类型IN dest:目的进程标识号IN tag:消息标志IN comm:通信域

MPI_SEND将发送缓冲区中的count个datatype数据类型的数据发送到目的进程,目的进程在通信域中的标识号是dest,本次发送的消息标志是tag,使用这一标志,就可以把本次发送的消息和本进程向同一目的进程发送的其他消息区别开。OUT buf:发送缓冲区的起始地址IN count:将发送的数据的个数

IN datatype:发送数据的数据类型IN dest:目的进程标识号IN tag:消息标志IN comm:通信域456、消息接收函数MPI_RECV(

m,status)参数说明:OUT status:返回类型(是由三个域组成的结构类型,这三个域分别是:MPI_SOURCE、MPI_TAG和MPI_ERROR。MPI_RECV从指定的进程source接收消息,并且该消息的数据类型和消息标识和本接收进程的datatype和tag相一致,接收到的消息所包含的数据元素的个数最多不能超过count。MPI预定义数据类型46MPI预定义类型与C数据类型对应关系MPI

预定义数据类型相应的C

数据类型MPI_CHARsigned

charMPI_SHORTsigned

short

intMPI_INTsigned

intMPI_LONGsigned

long

intMPI_UNSIGNED_CHARunsigned

charMPI_UNSIGNED_SHORTunsigned

short

intMPI_UNSIGNEDunsigned

intMPI_UNSIGNED_LONGunsigned

long

intMPI_FLOATfloatMPI_DOUBLEdoubleMPI_LONG_DOUBLElong

doubleMPI_BYTE无对应类型MPI_PACKED无对应类型一般的MPI程序设计流程图MPI_Init()MPI_Comm_rank()MPI_Comm_size

()建立新的通信器、定义新的数据类型和进程拓扑结构应用程序实体:计算控制程序体;进程间通信;MPI_Finalize

()退出MPI系统47程序参数说明End一个简单的发送和接收的例子48首先输出几个进程分别运行在哪一台机子.这里调用一个MPI_Get_processor_name获得本机的名字.接着进程0向其他进程发送问候信息,其他进程接收进程0的消息.并输出这一过程.#include"mpi.h"#include<

iostream.h>#include<

string.h>void

main

(int

argc,

char

**argv){char

message[20];int

i,myid,numprocs;int

namelen;MPI_Status

status;char

processor_name[MPI_MAX_PROCESSOR_NAME];MPI_Init (&argc,

&argv);MPI_Comm_size(MPI_COMM_WORLD,

&numprocs);MPI_Comm_rank(MPI_COMM_WORLD,

&myid);MPI_Get_processor_name(processor_name,

&namelen);49cout<<"Hello

World!"<<"process"<<myid<<"

of"<<numprocs<<"

on

"<<processor_name<<endl;if(myid==0){strcpy

(message,“

Hello,

World!");for

(i=1;i<numprocs

;

i++){MPI_Send(message,strlen(message),MPI_CHAR,i,99,MPI_COMM_WORLD);cout<<"process

0

send"<<message<<"to

“<<"process

"<<myid<<endl;}}50else{MPI_Recv(message,20,MPI_CHAR,MPI_ANY_SOURCE,0,MPI_COMM_WORLD,&status);cout<<"process"<<myid<<"recvived"<<message<<"from

"<<"process

0"<<endl;}MPI_Finalize();}51开启4个进程运行结果:52开启6个进程运行结果:53MPI并行程序的两种基本模式54两种最基本的并行程序设计模式:对等模式:各个部分地位相同,功能和代码基本一致,只不过是处理的数据或对象不同,也容易用同样的程序来实现。(典型应用如Jacobi迭代)主从模式:具有主进程和从进程,主进程接收从进程的处理结果,并进行汇总处理。典型应用如矩阵向量乘法对等模式—并行jacobi程序55这里的jacobi迭代是计算一个矩阵的数据二维数组A(M,M)。其边界值边界赋为8,内部初值为0,通过迭代求矩

阵各点的值.假设需要迭代的数据是M*M的二维数组A(M,M),令M=4*N,按上图进行数据划分,则分布在4个不同进程上的数据分别是:进程0:A(M,1:N);进程1:A(M,N+1:2*N);

进程2:A(M,2*N+1:3*N);进程3:A(M,3*N+1:4*N).由于在迭代过程中,边界点新值的计算需要相邻边界其他块的数据,因此在每一个数据块的两侧各增加1列的数据空间,用于存放从相邻数据块通信得到的数据。每个数据块的大小就从M*N扩大到M*(N+2)。为了并行求解,这里将参加迭代的数据按列进行分割,假设有4个进程同时并行计算,数据的分割结果如图:边界点新值的计算需要相邻边界其他块的数据,因此在每一个数据块的两侧各增加1列进程056进程1进程2进程3按列划分进程0进程1进程2进程3发送发送接收发送

接收发送

接收接收接收

发送接收

发送57例子:并行jacobi程序58迭代计算一个二维数组A(M,M)program

maininclude

‘mpif.h’integer

totalsize,mysize,stepsParameter

(totalsize

=16)(定义全局数组的规模)parameter

(mysize

=totalsize/4,steps=10)integer

n,myid,numprocs,i,j,rcReal

a(totalsize,mysize+2),b(totalsize,mysize+2)Integer

begin_col,end_col,ierrInteger

status(MPI_STATUS_SIZE)call

MPI_INIT(ierr)call

MPI_COMM_RANK(MPI_COMM_WORLD,myid,ierr)call

MPI_COMM_SIZE(MPI_COMM_WORLD,numprocs,ierr)print

*,”Process”,

myid,”

of”,

numprocs,”

is

alive”doj=1,mysize+2doi=1,totalsizea(i,j)=0.0enddoenddoIf

(myid.eq.0)

thendoi=1,totalsizea(i,2)=8.0enddoend

ifIf

(myid.eq.3)

thendoi=1,totalsizea(i,mysize+1)=8.0enddoend

ifdoi=1,mysize+2a(1,i)=8.0a(totalsize,i)=8.0enddo59(Jacobi迭代部分)do

n=1,steps(从右侧的邻居得到数据)if(myid.lt.3)thencallMPI_RECV(a(1,mysize+2),totalsize,MPI_REAL,myid+1,10,MPI_COMM_WORLD,status,ierr)end

if(向左侧的邻居发送数据)if(myid.gt.0)thencall

MPI_SEND(a(1,2),totalsize,MPI_REAL,myid-1,10,MPI_COMM_WORLD,ierr)end

if6061(向右侧的邻居发送数据)if

(myid.lt.3)

thencallMPI_SEND(a(1,mysize+1),totalsize,MPI_REAL,myid+1,10,MPI_COMM_WORLD,ierr)end

if(从左侧的邻居接收数据)if

(myid.gt.0)

thencall

MPI_RECV(a(1,1),totalsize,MPI_REAL,myid-1,10,MPI_COMM_WORLD,status,ierr)end

ifbegin_col

=2end_col

=mysize+1if (myid.eq.0)

thenbegin_col

=3end

ifif (myid.eq.3)

thenend_col

=mysizeend

ifdo

j=begin_col,

end_coldo

i=2,totalsize-1b

(i,j)=0.25*(a(i,j+1)+a(i,j-1)+a(i+1,j)+a(i-1,j))end

doend

dodo

j=begin_col,

end_coldo

i=2,totalsize-1a(i,j)=b(i,j)end

doend

doend

dodo

i=2,totalsize-1print

*,myid,

(a(i,j),

j=begin_col

,end_col)end

docall

MPI_FINALIZE(rc)end62主从模式—矩阵向量乘对于矩阵C=A*B,主进程将向量B广播给所有的从进程,然后将矩阵A的各行依次发送给从进程。从进程计算一行和B相乘的结果然后将结果发送给主进程。主进程循环向各个从进程发送一行的数据直到将A各行的数据发送完毕。一旦主进程将A的各行发送完毕则每收到一个结果就向相应的从进程发送结束标志,从进程接收到结束标志后退出执行主进程收集完所有的结果后也结束。从进程主进程发送矩阵A的各行数据回收各行与B相乘的结果计算计算计算计算送回结果63例子:矩阵向量乘64计算矩阵C=A*Bprogram

maininclude

“mpif.h”integer

MAX_ROWS,MAX_COLS,rows,colsparameter

(MAX_ROWS=1000,MAX_COLS=1000)double

precision

a(MAX_ROWS,MAX_COLS),b(MAX_COLS),

c(MAX_COLS)double

presicion

buffer(MAX_COLS),ansintegermyid,master,numprocs,ierr,status(MPI_STATUS_SIZE)integer

i,j,numsent,numrcvd,senderinteger

anstype,rowcall

MPI_INIT(ierr)call

MPI_COMM_RANK(MPI_COMM_WORLD,myid,ierr)

call

MPI_COMM_SIZE(MPI_COMM_WORLD,numprocs,ierr)master=0rows=100cols=100If

(myid.eq.master)

then(主进程对矩阵A和B赋初值)do

i=1,colsb(i)=1do

j=1,rowsa(i,j)=iend

doend

do6566numsent

=0numrcvd

=0(将矩阵B发送给所有其他的从进程,通过下面的广播语句实现)callMPI_BCAST(b,cols,MPI_DOUBLE_PRECISION,master,MPI_COMM_WORLD,ierr)(依次将矩阵A的各行发送给其他的numprocs-1个从进程)do

i=1,min(numprocs-1,rows)do

j=1,cols(将一行的数据取出来依次放到缓冲区中)buffer(j)=a(i,j)end

do(将准备好的一行数据发送出去)callMPI_SEND(buffer,cols,MPI_DOUBLE_PRECISION,i,i,

MPI_COMM_WORLD,ierr)numsent

=numsent+1end

do(对所有的行,依次接收从进程对一行数据的计算结果)do

i=1,rowcallMPI_RECV(ans,1,MPI_DOUBLE_PRECISION,MPI_ANY_SOURCE,*MPI_ANY_TAG,MPI_COMM_WORLD,status,ierr)sender=status

(MPI_SOURCE)anstype

=status

(MPI_TAG)(将该行数据赋给结果数组C的相应单元)c(anstype)=ans(如果还有

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论