单程序多数据(spmd)语言构造允许串行和并行编程的无缝交错。的spmd
语句允许您定义一个代码块,以便在多个工作程序上同时运行。内部赋值的变量spmd
语句允许直接从客户端通过引用访问它们的值复合对象。
spmd的“单一程序”方面意味着相同的代码在多个工作程序上运行。你在MATLAB中运行一个程序®客户,以及标记为的那些部分spmd
砖块在工人身上运行。当spmd块完成时,您的程序将继续在客户机中运行。
“多数据”方面意味着即使spmd
语句在所有工作程序上运行相同的代码,每个工作程序可以有不同的、唯一的代码数据。因此,多个工作人员可以容纳多个数据集。
适用于spmd
当工作人员之间需要通信或同步时,需要在多个数据集上同时运行程序。一些常见的情况是:
需要很长时间执行的程序 -spmd
让几个工人同时计算解决方案。金宝搏官方网站
在大数据集上操作的程序-spmd
让数据分布到多个工作人员。
有关更多信息,请参见选择SPMD,Parfol和Parfeval之间.
an的一般形式spmd
声明:
spmd<描述>结束
请注意
如果并行池没有运行,spmd
如果相应地设置了并行首选项,则使用默认集群配置文件创建池。
表示的代码块<描述>
在并行池中的所有工作程序上同时并行执行。如果你想将执行限制在这些worker的一部分,请指定要运行的worker数量:
spmd(n) > <语句结束
这个声明要求n
工人运行spmd
代码。n
必须小于或等于打开的并行池中的工作人员数量。如果水池足够大,但是n
worker不可用,语句会等待,直到有足够的worker可用。如果n
是0,spmd
语句不使用worker,并在客户端本地运行,就像当前没有运行池一样。
你可以指定一个工人的数量范围:
spmd(m, n) < >语句结束
在这种情况下spmd
语句要求最小值米
工人,它使用的最大值n
工人。
如果控制执行你的任务的工人数量很重要spmd
声明,在群集配置文件中设置确切的数字或使用spmd
语句,而不是使用range。
例如,在三个工人上创建一个随机矩阵:
spmd(3) R = rand(4,4);结束
请注意
本章后面的所有例子都假设并行池是打开的,并且在序列之间保持打开状态spmd
语句。
与parfor
-loop,工人们用来表示anspmd
语句每个都有一个唯一的值labindex
.这允许您指定代码只在特定的工作程序上运行,或者定制执行,通常是为了访问唯一的数据。
例如,创建大小不同的数组labindex
:
spmd(3)如果labindex==1 R = rand(9,9);其他的R =兰德(4,4);结束结束
根据,在每个worker上加载唯一的数据labindex
,并对每个worker使用相同的函数从数据中计算结果:
spmd(3) labdata = load([“datafile_”num2str (labindex)“.ascii”) result = MyFunction(labdata)结束
执行死刑的工人spmd
语句同时操作,并且相互感知。与通信作业一样,允许您直接控制工作人员之间的通信,在它们之间传输数据,并在它们之间使用协同分布数组。
例如,在spmd
声明:
spmd(3) RR = rand(30, codistributor());结束
每个工人都有一个30乘10的共分布数组段RR
.有关协分布数组的更多信息,请参见使用协同分布数组.
运行时spmd
语句时,工作人员的所有命令行输出都会显示在客户端命令窗口中。由于工作者是没有显示的MATLAB会话,因此池中的任何图形输出(例如图形窗口)都不会显示。
所有执行spmd
语句必须具有与客户端相同的MATLAB搜索路径,以便它们能够执行在其公共代码块中调用的任何函数。因此,无论何时使用cd
,addpath.
,或rmpath
在客户机上,如果可能的话,它也会在所有的工作者上执行。有关更多信息,请参见parpool
参考页面。当工作人员运行在与客户端不同的平台上时,使用该函数pctRunOnAll
正确设置所有工作人员的MATLAB路径。
在执行期间在工作期间发生错误时spmd
语句,错误被报告给客户端。客户端试图中断所有工作程序的执行,并向用户抛出一个错误。
对工人产生的错误和警告用工人ID (labindex
)并按Matlab客户端收到的顺序在客户端命令窗口中显示。
的行为lastwarn
在末尾没有指定spmd
如果在其体内使用。
函数的主体spmd
语句不能引用嵌套函数。但是,它可以通过定义为嵌套函数句柄的变量来调用嵌套函数。
因为spmd
对象中调用的嵌套函数更新的worker和变量spmd
语句不会在外部函数的工作空间中更新。
spmd
语句身体spmd
语句不能直接包含其他语句spmd
.但是,它可以调用包含另一个函数的函数spmd
声明。内spmd
语句不会在另一个并行池中并行运行,而是在运行其包含函数的worker上的单个线程中串行运行。
parfor
循环一个spmd
语句不能包含parfor
- 和一个身体parfor
-loop不能包含spmd
声明。原因是worker不能启动或访问更多的并行池。
打破
,继续
,返回
语句身体spmd
声明不能包含打破
,继续
,或返回
语句。考虑parfeval
要么parfevalOnAll
而不是spmd
,因为你可以使用取消
在他们身上。
身体spmd
声明不能包含全球
要么持续的
变量声明。原因是这些变量在工作人员之间不是同步的。您可以使用全球
要么持续的
函数中的变量,但它们的值仅对创建它们的工作人员可见。而不是全球
变量,使用函数参数共享值是一种更好的实践。
身体spmd
语句不能定义匿名函数。但是,它可以通过函数句柄引用匿名函数。
inputname
功能使用inputname
内部不支持返回与参数编号对应的工作区变量名金宝appspmd
.原因是spmd
工作人员无法访问MATLAB桌面的工作空间。为了解决这个问题,打电话inputname
之前spmd
,如以下示例所示。
一个=“一个”;myFunction (a)函数X = myFunction(a) name = inputname(1);spmdx(名字)= labindex;结束X = X ({}):;结束
负载
功能的语法负载
不赋值给输出结构的函数在内部是不支持的金宝appspmd
语句。内部spmd
,总是将输出赋值为负载
一个结构。
输入参数个数
要么露狼
功能内部不支持以下用途金宝appspmd
声明:
使用输入参数个数
要么露狼
没有函数论点
使用narginchk
要么nargoutchk
验证当前执行的函数调用中输入或输出参数的数量
原因是工作人员无法访问MATLAB桌面的工作空间。要解决这个问题,请先调用这些函数spmd
.
myFunction (“一个”,“b”)函数myFunction(a,b) nin = nargin;spmdX = labindex * nin;结束结束
您可以从spmd
声明,但P代码脚本不能包含一个spmd
声明。要解决此问题,请使用p代码函数而不是p代码脚本。
ANS.
多变的引用ANS.
变量的外部定义spmd
语句内部不支持金宝appspmd
声明。在…的体内spmd
语句,则必须赋值ANS.
变量,然后再使用它。
复合
|parfeval
|parfevalOnAll
|parfor
|spmd