主要内容

运行单一程序在多个数据集

介绍

单一项目多个数据(spmd)语言构造允许无缝交错的串行和并行编程。的spmd声明允许您定义的代码块上同时运行多个工人。变量分配在spmd声明的工人允许直接访问它们的值从客户机通过引用通过复合对象。

本章解释了的一些特点spmd语句和复合对象。

何时使用spmd

“单个项目”方面的spmd意味着相同的代码运行在多个工人。你在MATLAB运行一个程序®客户端,并贴上的那部分spmd块上运行工人。当spmd块完成,程序继续运行在客户端。

“多个数据”方面意味着即使spmd语句运行相同的代码在所有工人,每个工人可以有不同的,独特的数据代码。所以可以容纳多个数据集由多个工人。

典型应用适合spmd是那些需要运行同时执行程序在多个数据集,当工人之间的沟通或同步是必需的。一些常见的情况有:

  • 项目,需要很长时间来执行spmd同时让几个工人计算解决方案。金宝搏官方网站

  • 项目操作大型数据集spmd让数据被分发到多个工人。

有关更多信息,请参见选择spmd、parfor parfeval

定义一个spmd声明

的一般形式spmd声明:

spmd<报告>结束

请注意

如果一个平行池没有运行,spmd使用默认创建一个池集群配置文件,如果你的相应设置平行的偏好。

为代表的代码块<报告>上同时并行地执行所有工人在并行池。如果你想限制只执行这些工人的一部分,指定到底有多少工人上运行:

spmd(n) <报告>结束

这个声明要求n工人运行spmd代码。n的数量必须小于或等于工人开放平行池中。如果池足够大,但是n工人没有声明等到足够的工人。如果n是0,spmd语句使用没有工人,在客户机上本地运行,如果有一样不是当前池运行。

您可以指定一个范围的工人数量:

spmd(m, n) <报告>结束

在这种情况下,spmd声明要求最少的工人,它使用最多n工人。

如果是很重要的控制执行您的工人数量spmd声明中,设置或确切数字集群中的概要文件spmd声明,而不是使用一个范围。

例如,创建一个随机矩阵三个工人:

spmd(3)R =兰德(4,4);结束

请注意

本章后面所有的例子假定平行池是序列之间开放,开放spmd语句。

parfor用于一个循环,工人们spmd声明中都有一个惟一的值spmdIndex。这只允许您指定代码运行在特定的工人,或自定义执行,通常为目的的访问的数据。

例如,根据创建不同大小的数组spmdIndex:

spmd(3)如果spmdIndex = = 1 R =兰德(9,9);其他的R =兰德(4,4);结束结束

负载独特的数据在每一个工人的根据spmdIndex,每个工人上使用相同的函数计算的结果数据:

spmd(3)labdata =负载([“datafile_”num2str (spmdIndex)“.ascii”结果])= MyFunction (labdata)结束

工人执行spmd声明同时运作,相互了解。与沟通工作,你可以直接控制的工人之间的通信,它们之间传输数据,并使用codistributed数组。

例如,使用一个codistributed数组中spmd声明:

spmd(3)RR =兰德(30日codistributor ());结束

每个工人都有一个30-by-10部分codistributed数组RR。关于codistributed数组的更多信息,请参阅使用Codistributed数组

显示输出

当运行一个spmd声明一个平行的池,所有命令行输出从工人显示在客户端命令窗口。因为工人们MATLAB会话没有显示,任何图形输出(例如,图windows)从池中不显示。

MATLAB路径

所有工人执行spmd声明必须与客户端相同的MATLAB搜索路径,这样他们就可以执行任何功能共同的代码块。因此,每当你使用cd,目录,或rmpath在客户端,它也执行所有的工人,如果可能的话。有关更多信息,请参见parpool参考页面。当工人们比客户端运行在不同的平台,使用函数pctRunOnAll对所有工人正确设置MATLAB路径。

错误处理

当一个错误发生在一个工人在执行的spmd声明中,错误报告给客户端。客户端试图中断执行在所有工人,并抛出一个错误给用户。

错误和警告生产工人与工人ID(注释spmdIndex)和客户的命令窗口中显示的顺序由MATLAB接收端。

的行为lastwarn未指明的最后一个吗spmd如果使用在其身体。

spmd局限性

嵌套函数

在一个函数,一个的身体spmd声明不能引用一个嵌套的函数。然而,它可以调用一个嵌套函数通过一个变量定义为一个函数处理嵌套函数。

因为spmd身体上执行工人,变量被嵌套的函数调用在一个更新spmd在工作区中声明不更新的外部函数。

嵌套的spmd语句

的身体spmd声明不能直接包含另一个spmd。然而,它可以调用一个函数,其中包含另一个spmd声明。内spmd声明没有并行运行在另一个平行的池,但连续运行在单个线程工人其包含功能运行。

嵌套的parfor循环

一个spmd语句不能包含一个parfor循环,的身体parfor循环不能包含一个spmd声明。原因是工人不能启动或访问进一步平行池。

打破,继续,返回语句

的身体spmd声明中不能包含打破,继续,或返回语句。考虑parfevalparfevalOnAll而不是spmd,因为你可以使用取消在他们身上。

全球和持久的变量

的身体spmd声明中不能包含全球持续的变量声明。原因是这些变量之间的不同步的工人。您可以使用全球持续的函数内的变量,但它们的价值只是看到工人创造了他们。而不是全球变量,它是一个更好的实践使用函数参数共享价值观。

匿名函数

的身体spmd声明中不能定义一个匿名函数。然而,它可以引用一个匿名函数通过函数的句柄。

inputname功能

使用inputname返回工作空间变量名称对应于一个参数数量不支持金宝appspmd。原因在于,spmd工人没有访问的工作区MATLAB桌面。为了解决这一问题,电话inputname之前spmd,如以下示例所示。

一个=“一个”;myFunction (a)函数name = inputname X = myFunction (a) (1);spmdx(名字)= spmdIndex;结束X = X ({}):;结束

负载功能

的语法负载没有分配到一个输出结构内部不支持金宝appspmd语句。内部spmd,总是分配的输出负载一个结构。

输入参数个数nargout功能

以下内部使用不支持金宝appspmd声明:

  • 使用输入参数个数nargout没有一个函数参数

  • 使用narginchknargoutchk验证的输入或输出参数调用的函数正在执行

原因是工人没有访问的工作区MATLAB桌面。为了解决这一问题,之前调用这些函数spmd

myFunction (“一个”,“b”)函数myFunction (a, b) nin =输入参数个数;spmdX = spmdIndex * nin;结束结束

- code脚本

你可以叫p从在一个脚本文件spmd不能包含一个声明,但p代码脚本spmd声明。为了解决这一问题,使用p代码函数代替- code脚本。

变量

引用变量定义在一个spmd声明中不支持金宝appspmd声明。体内的spmd声明中,你必须分配变量在你使用它。

另请参阅

||||

相关的话题