Matlab 并行计算工具箱函数基本情况介绍_第1页
Matlab 并行计算工具箱函数基本情况介绍_第2页
Matlab 并行计算工具箱函数基本情况介绍_第3页
Matlab 并行计算工具箱函数基本情况介绍_第4页
Matlab 并行计算工具箱函数基本情况介绍_第5页
已阅读5页,还剩5页未读 继续免费阅读

下载本文档

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

文档简介

1、Matlab 并行计算工具箱的使用Matlab并行工具箱的产生一方面给大规模的数据分析带来了巨大的效益,另一方面且引入了分布式计算,借助matlab自身携带的MDCE,可以实现单机多核并行运行或者是同一个局域网络中的多台处理器组成的机群的并行运行。个人以为后者是前者的拓展,并行计算的最初目的是为了解决串行计算速度不能满足某些复杂运算而产生的技术,能够借助较低配置的处理,协同工作处理同一个程序,但是他们之间是并不会交互的,仅仅是有核心主机client进行大任务的分解,而后将它们分配给各个处理器,由处理器共同完成。所以说并行计算的实质还是主从结构的分布式计算。这里体现了数量的优势,同一个程序串行运

2、行可能需要40个小时,但是若是由10台处理器同时跑,则有望将计算时间降低到接近4个小时的水平。而且这十台处理器可以是一个多个多核CPU组成,例如一个8核心CPU和1个2核心CPU。也可以是由5个2核心CPU组成,形式灵活。而分布式计算在并行计算的基础上有功能上的扩展,一个很重要的方面就体现在,上述的十个处理器之间可以进行交互式通讯这是基于MPI(message passing interface)实现的,这对于大规模的分布式控制系统是很有需要的,也就是说,各个处理器之间要实现数据的实时传递,有时是共享某些信息,有时是lab1需要lab2的某些信息。相对于单纯的并行计算来说,后者将交互式通讯扩展

3、到了labs之间,而不仅仅是lab和client之间。Matlab 并行计算工具箱中的函数有:1. Parfor (FOR循环的并行计算);函数1:matlabpool 其作用是开启matlab并行计算池,单独的命令会以默认的配置开启并行计算环境。函数2:parforFor循环的并行计算替代关键词,需要注意的是,parfor不能像for一样嵌套。但是外部的parfor内部可以嵌套for循环。函数3:batch 用于在worker上运行matlab脚本或者是matlab函数。例如:batch(script.m) 语句会根据默认并行配置文件定义的集群将script脚本文件运行在worker上。2.

4、 批处理函数1:batch,其语法有:j = batch('aScript')j = batch(myCluster,'aScript')j = batch(fcn,N,x1, ., xn)j = batch(myCluster,fcn,N,x1,.,xn)j = batch(.,'p1',v1,'p2',v2,.)其中的变量:JThe batch job object.'aScript'The script of MATLAB code to be evaluated by the MATLAB pool job

5、.myClusterCluster object representing cluster compute resources.fcnFunction handle or string of function name to be evaluated by the MATLAB pool job.NThe number of output arguments from the evaluated function. x1, ., xnCell array of input arguments to the function.p1, p2Object properties or other ar

6、guments to control job behavior.v1, v2Initial values for corresponding object properties or arguments.3. 利用GPU计算(这一部分暂时略过)4. 分布式数组和SPMD函数1:distributed 分布式数组利用matlab计算池中所有worker的内存来存储数组。如此以来,就可以创建或者是操作对于一个机器无法存储的大型数组。函数2:gather 回收所有的分布式数组数据到当前工作空间。例如:x = gather(D);函数3:spmd (Single Program Multiple Da

7、ta)其使用方式一般情况下为:spmd<statement>end.当程序语句被放置在<statement>部分时,matlab会将程序语句在几个matlab worker中同时运行,并行计算。函数4:composite创建一个复合对象。对于在workers上运行spmd<statement>语句中的变量,在client端都可以通过构造函数获取变量值,当spmd<statement>语句运行时,会自动生成复合构造函数,也可以利用composite函数自行创建一个。例如对于,复合构造变量C:C1 表示变量C在worker 1上的值;C2 表示变量C

8、在worker 2上的值;函数5:codistributed 用复制方式创建一个codistributed 数组。一个codistributed数组被分割为多个片段分别分布在不同lab的工作空间中。这种情况适用于每一个lab都要用到某一个大型数组的一个部分,这样提供了lab在访问这些数据的便利。一个codistributed数组和一个distributed数组之间差别很小,体现在其视角的不同。前者用于在一个lab上存取一个数组而后者则支持在client上存取一个数组。其语法:C = codistributed(X) distributes a replicated X using the de

9、fault codistributor. X must be a replicated array, that is, it must have the same value on all workers. Size(C) is the same as size(X).C = codistributed(X, codist) distributes a replicated X using the codistributor codist. For information on constructing codistributor objects, see the reference page

10、s for codistributor1d and codistributor2dbc.C = codistributed(X, codist, lab) distributes a local array X that resides on the worker identified by lab, using the codistributor codist. Local array X must be defined on all workers, but only the value from lab is used to construct C. size(C) is the sam

11、e as size(X). C = codistributed(C1, codist) where the input array C1 is already a codistributed array, redistributes the array C1 according to the distribution scheme defined by codistributor codist. This is the same as calling C = redistribute(C1, codist). If the specified distribution scheme is th

12、at same as that already in effect, then the result is the same as the input.函数6:redistribute 将一个codistributed数组从新按照其他分配规则进行重新分布。语法:redistribute(D1,CODISTR),将分布式数组D1按照CODISTR重新分配在labs中的分布方式。函数7:getLocalPart 获取一个分布式数组的本地部分,语法:L = getLocalPart(D)返回分布式数组D的本地部分,其格式取决于D的具体分配方案。函数8:globalIndices 根据分布式数组在各个

13、lab中的分配方案获取本地部分的全局索引。(如何使用还不清晰)5. 集群配置文件和计算规模函数1:parcluster 根据集群配置文件建立一个集群。其语法:C = parcluster;返回一个集群对象。该对象是由默认的集群配置文件确定;C = parcluster(profile);返回一个集群对象,该对象是由profile确定。函数2:parallel.defaultClusterProfile该函数获取或者设置默认的并行计算集群配置文件。语法:p = parallel.defaultClusterProfile,返回当前默认集群配置文件名oldprofile = parallel.de

14、faultClusterProfile(newprofile) 设置newprofile为默认配置文件,返回旧的配置文件名。可以通过saveProfile或者saveAsProfile来修改一个集群对象。函数3:parallel.importProfile 导入集群配置文件。语法:profilename = parallel.importProfile(filename).导入由filename确定的配置文件,而后返回导入的配置文件名。配置文件名后缀是.mat。需要注意的是,凡是导入的配置文件,在以后的matlab操作中都是有效的,不必重复导入。函数4:pctconfig 配置一个并行计算工具

15、箱会话。语法有:Pctconfig(p1,v1,):设置client端的配置属性P1的值为V1;Config = pctconfig(p1,v1,):返回一个结构体赋给config,结构体的字段名对应属性名称,字段值则对应属性值。Config = pctconfig();没有任何输入,以结构体形式返回当前所有属性以及属性值。6. 详细的作业和任务控制a) 作业和任务的建立函数1:createJob 在集群上建立作业,其语法:obj = createJob(cluster),为确定的cluster建立独立作业,作业所需要的数据存放在本地,由cluster的JobStorageLocation属性

16、确定。obj = createJob(.,'p1',v1,'p2',v2,.) 建立有具体属性值的作业对象。job = createJob(.,'Profile','profileName',.)建立由profile确定具体属性的作业对象。函数2:createCommunicatingJob建立一个新的通讯作业,其语法:Job = createCommunicatingJob(cluster) 为特定的cluster建立一个通讯对象;Job = createCommunicatingJob(,p1,v1,p2,) 具体的属性值建立

17、作业对象;Job = createCommunicatingJob(,type,SPMD,)建立一个pool类型的通讯作业,该作业可以利用matlab池的资源完成具体的作业。Job = createCommunicatingJob(,Type,SPMD,)建立一个spmd类型的同学作业,具体的任务函数是同时在各个worker上同时运行的。Job = createCommunicatingJob(,Profile,profilename,)建立一个通讯作业,其各个属性是通过profile文件确定的。函数3:createTask 在已有个作业job中建立一个任务,其语法为:T = createTa

18、sk(j,F,N,X1,X2,XN)在作业j中建立一个新的任务对象,返回一个引用t。任务的目的是计算由F确定的函数值,输入参数中括号表示,输出参数个数为N。T = createTask(j,F,N,C1,C2,C3Cm)使用一个单元数组在作业j中建立m个任务对象,并返回一个引用向量T。T = createTask(,p1,v1,p2,v2,) 使用给定的属性值建立一个任务对象。T = createTask(,profile,profilename,) 使用给定的属性值建立一个任务对象。给定的属性卸载profile中。函数4:poolStartup 在MATLABpool启动后确定各个worke

19、r上的初试动作这个函数是每次在worker开始matlabpool中的一部分任务时就自动运行的,不需要在任务函数中具体化,或者是在client端去调用。具体的做法是:将matlab代码加到poolStartup.m文件中以定义worker的初试状态信息。Worker开始工作时,首先会按照下述顺序该文件:Included in the job's AttachedFiles property.In a folder included in the job's AdditionalPaths property.In the worker's MATLAB installat

20、ion at the locationmatlabroot/toolbox/distcomp/user/poolStartup.m第一个找到的将会被执行。函数5:jobStartup 确定每个worker的具体作业启动动作。语法为:JobStartup(job) 其中,job所指的作业即是本次启动开始的那个作业。该函数也是自动运行的,和poolStartup类似,不需要在任务函数中具体化,或者是在client端去调用。具体做法和函数4几乎一样,只是将poolStartup.m文件更换为:jobStartup.m文件。函数6:taskStartup 确定每个worker的任务启动动作。语法为:t

21、askStartup(task) 其中,task指的是对应worker要完成的当前作业的任务。其余的操作与函数4-5基本一样,不在赘述。区别只是将jobStartup.m文件更换为taskStartup.m文件。函数7:taskFinish 确定每个worker任务终结时的行为,语法为:TaskFinish(task), 其中的task指的也是对应worker即将要完成的当前作业的任务。其余的与上述几个类似,不再赘述。区别仅是将taskStartup.m文件更换为taskFinish.m文件。函数8:mpiLibConf 返回一个MPI实现的位置。其语法为:primaryLib,extras

22、= mpiLibConf,语句可以返回即将被并行作业使用的MPI库。其中,primaryLib是一个包含MPI入口节点信息的共享的库文件。而extras是一个单元数组,包含MPI需要的其他的库的名字。函数9:mpiSetting 设置MPI通讯选项,其语法为:mpiSettings('DeadlockDetection','on'),在调用labSend和labReceive时开启死锁检查。在并行作业中默认是off,但是在pmode模式和spmd语句中时默认on的。mpiSettings('MessageLogging','on'

23、) 打开MPI消息记录。默认是关闭状态,默认的记录位置是matlab命令窗口。mpiSettings('MessageLoggingDestination','CommandWindow')将MPI消息发送到matlab命令窗口中,如果并行作业的任务设置为扑捉命令窗口输出,则MPI消息记录信息将会出现在任务的CommandWindowsOutput 属性中。mpiSettings('MessageLoggingDestination','stdout') 将MPI记录信息发送到matlab标准输出文件。如果使用了job manag

24、er,则该文件就是MDCE日志文件,而如果你使用mpiexec cluster, 则该文件就是mpiexec debug 日志,我们可以用函数getDebugLog.查看。mpiSettings('MessageLoggingDestination','File','filename') 将MPI记录消息发送到指定路径的filename文件。函数10:pctRunOnAll 在matlabpool中所有成员上运行一个命令。语法为:pctRunOnAll command,命令command将会在client以及所有worker上同时运行,并且将可能

25、出现的任何输出都反馈到client命令窗口中来。但是command命令应该是没有返回变量的b) 作业提交和结果的获取函数1:submit,提交作业到worker的序列中排队。语法为:Submit(job). 将作业对象job在集群中排队,该项作业所使用的cluster在job对象被创建时就被确定了。函数2:wait,将当前作业暂停直到timer停止计时。其语法为:Wait(job)。函数3:fetchOutputs,将作业中所有的输出变量取回本地。语法为:Data = fetchOutput(job),如果job中包含多个任务,则data是一个单元数组,其行数对应任务个数,列数对应相应任务中的

26、变量数,取最大值,对于变量个数少于最大值的任务,多出的位置是空。调用fetchOutput并不会删除本地数据,而是复制一份,而delete可以删除。此外,调用fetchOutput成功的前提是当前作业的状态是已经完成,finished。函数4:diary, 保存命令窗口文本到文件。其语法为:Diary创建一个以diary为名字的ASCII文件,用于保存当前命令窗口中的键盘输出以及窗口结果输出文本。Diary(filename) 与上述diary区别是文件名更改为:filename。Diary off/on 控制diary是否工作。函数5:load,将mat文件加载在工作空间。其语法为:S= l

27、oad(filename) 将filename中的变量导入到结构体数组中,或者是ASCII文件导入到双精度的数组。S = load(filename, variables)导入特定的变量;S = load(filename,'-mat', variables) 强制导入文件,而且将文件当作mat文件,无视其原本的扩展名。S = load(filename,'-ascii') 强制导入文件,而且将文件当作ASCII文件,无视其原本的扩展名。load(filename, _) (没看懂)load filename _c) 队列管理和作业信息函数1:pause,暂时中

28、断作业执行,等待用户相应。其语法为:Pause 暂停当前程序执行等待用户按下任意键。pause(n) 暂停当前程序n秒。pause on/off 开启pause功能或者关闭它。pause query 检查当前matlab设置中是否允许暂停。state = pause('query') 返回当前pause状态。以字符数组形式on/off。oldstate = pause(newstate) newstate = on/off ,返回状态更改前的状态。函数2:resume,重新开始作业调度程序中程序处理队列。其语法:resume(mjs), mjs指被重新开始的matlab作业调度

29、对象。如果MJS没有被暂停,这个语句不会有任何动作。函数3:cancel,取消作业,不论作业目前处于什么状态。其语法为:Cancel(J), 取消作业J,而且其状态属性被更改为已完成。自然地,作业中所有任务都被取消,但是已经计算出的变量会被保存,并且可以存取。Cancel(J,MESSAGE),取消作业,并附加用户定义的消息,该消息会被添加到默认的取消消息中。函数4:删除当前作业或者是任务。其语法为:Delete(obj),从当前会话中删除obj,并且将它从簇的JobSTorageLocation中删除。函数5:promote,将作业在队列中的位置提前。其语法为:Promote(c,job).

30、 其中,c指的是MJS簇,包含的作业对象为job。也就是说如果job不在队列的第一位置时,会和它的前一个job进行位置调换。函数6:demote,与函数5对应。函数7:getDebugLog,获取通讯作业的输出消息或者是独立的任务的讯息。其语法为:str = getDebugLog(mycluster,jobOrtask)。函数8:getJobClusterData,获取簇上的作业对应的详细的用户数据。语法为:userdata = getJobClusterData(cluser,job); 函数9:setJobClusterData(cluster,job,userdata);,与函数8是配

31、合使用的。用来设置用于特定簇上的作业所需要的数据。d) 任务控制和worker之间的通讯函数1:labindex,返回当前lab的ID。语法为:id = labindex,这个ID仅在某项作业执行过程中有效。函数2:numlabs ,返回所有并行参与的lab的个数。其语法:N = numlabs,这个数也决定了labSend或者是labReceive可用最大值。函数3:gcat,全局连接。(么有懂。)其语法:Xs = gcat(X) 从每个worker上从第二维度连接变量数组X,并将结果在所有的worker上复制。Xs = gcat(X, dim) 从每个worker上从dim维度连接变量数组

32、X,并将结果在所有的worker上复制。Xs = gcat(X, dim, targetlab),将结果仅仅放置到targetlab指定的lab中的res,所有的worker的res默认都是。函数4:gop,全局操作。其语法:Res = gop(F,x) ,通过函数句柄F将每个lab中的x变量进行操作,结果在每个worker上复制。例如,lab1和lab2中都有x变量。但是前者x =3,后者x = 4, 如果函数是min时,则会将lab1/lab2中的x值都改变为x = 3;。Res = gop(F,x,targetlab),操作过程与上述语法相同,区别是最后将结果仅放置在targetlab确

33、定的lab中,不是所有lab都替换。而没有替换成结果的量都是。函数5:gplus,全局加法。语法为:S = gplus(X),将所有lab中x相加,并将结果复制到所有woeker中。S = gplus(X, targetlab) 将所有lab中x相加,并将结果复制到targetlab中。同样地,所有的其他worker的res位置为.函数6:pload,将file加载到并行会话中。其语法:Pload(fileroot), 从文件名为fileroot num2str(labindex)的文件中加载数据到当前运行并行会话的worker中。而改文件必须是psave创建的。文件个数与labs个数必须相等

34、。所有文件必须存放在共享文件系统。函数7:psave,在并行会话中存放数据。其语法为:Psave(fileroot) 将worker中工作空间的数据存放近文件:filerootnum2str(labindex)中,该文件可以被pload加载。函数8:labBarrier, 用于同步同一个作业中的各个lab的。其语法:labBarrier,只有所有的lab执行到该语句处时,并行程序才会继续执行下去。这个语句在数据文件共享的时候会发挥很好的作用,避免部分lab读取的数据不完整。函数9:labBroadcast 向所有的lab广播数据。其语法:Out_data = labBroadcast(root

35、,in_data); 将in_data数据发送到所有正在执行的lab处。Out_data = labBroadcast(root), 接收来自root的lab的数据,当然只有对index=root的才有效。函数10:labProbe,测试看消息是否准备好可以被接收。其语法为:Is_data_available = labProbe, 返回一个逻辑值指明是否有数据准备好被接受。is_data_available = labProbe(source) 将测试的消息来源确定为source。is_data_available = labProbe('any',tag) 将测试的消息来源

36、确定为标签tag所指定的任意worker。is_data_available = labProbe(source,tag) 将测试的消息来源确定为source+tag确定的worker。is_data_available, source, tag = labProbe 返回准备好的消息源的labindex和tag。如果没有满足要求的,则source和tag都会是.函数11:labReceive,通其他lab接收数据。其语法为:data = labReceive, 从任何的lab接收数据data = labReceive(source) 从确定的lab处接收数据。data = labReceive('any',tag) 从确定的带有标签tag的lab处接收数据。data = labReceive(source,tag) 从带有标签tag的确定lab出接收数据。data, source, tag = labReceive 返回发送数据的source和对应的tag。函数12:labSend,向其他的lab发送数据。其语法为:l

温馨提示

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

评论

0/150

提交评论