运行单一程序在多个数据集
介绍
单一项目多个数据(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
声明中不能包含打破
,继续
,或返回
语句。考虑parfeval
或parfevalOnAll
而不是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
没有一个函数参数使用
narginchk
或nargoutchk
验证的输入或输出参数调用的函数正在执行
原因是工人没有访问的工作区MATLAB桌面。为了解决这一问题,之前调用这些函数spmd
。
myFunction (“一个”,“b”)函数myFunction (a, b) nin =输入参数个数;spmdX = spmdIndex * nin;结束结束
- code脚本
你可以叫p从在一个脚本文件spmd
不能包含一个声明,但p代码脚本spmd
声明。为了解决这一问题,使用p代码函数代替- code脚本。
答
变量
引用答
变量定义在一个spmd
声明中不支持金宝appspmd
声明。体内的spmd
声明中,你必须分配答
变量在你使用它。
另请参阅
spmd
|parfor
|parfeval
|parfevalOnAll
|复合