主要内容

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

介绍

单程序多数据(spmd)语言构造允许串行和并行编程的无缝交错。的spmd语句允许您定义一个代码块,以便在多个工作程序上同时运行。内部赋值的变量spmd语句允许直接从客户端通过引用访问它们的值复合对象。

这一章解释了spmd语句和复合对象。

何时使用spmd

spmd的“单一程序”方面意味着相同的代码在多个工作程序上运行。你在MATLAB中运行一个程序®客户,以及标记为的那些部分spmd砖块在工人身上运行。当spmd块完成时,您的程序将继续在客户机中运行。

“多数据”方面意味着即使spmd语句在所有工作程序上运行相同的代码,每个工作程序可以有不同的、唯一的代码数据。因此,多个工作人员可以容纳多个数据集。

适用于spmd当工作人员之间需要通信或同步时,需要在多个数据集上同时运行程序。一些常见的情况是:

  • 需要很长时间执行的程序 -spmd让几个工人同时计算解决方案。金宝搏官方网站

  • 在大数据集上操作的程序-spmd让数据分布到多个工作人员。

有关更多信息,请参见选择SPMD,Parfol和Parfeval之间

定义spmd语句

an的一般形式spmd声明:

spmd<描述>结束

请注意

如果并行池没有运行,spmd如果相应地设置了并行首选项,则使用默认集群配置文件创建池。

表示的代码块<描述>在并行池中的所有工作程序上同时并行执行。如果你想将执行限制在这些worker的一部分,请指定要运行的worker数量:

spmd(n) > <语句结束

这个声明要求n工人运行spmd代码。n必须小于或等于打开的并行池中的工作人员数量。如果水池足够大,但是nworker不可用,语句会等待,直到有足够的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会话,因此池中的任何图形输出(例如图形窗口)都不会显示。

MATLAB路径

所有执行spmd语句必须具有与客户端相同的MATLAB搜索路径,以便它们能够执行在其公共代码块中调用的任何函数。因此,无论何时使用cdaddpath.,或rmpath在客户机上,如果可能的话,它也会在所有的工作者上执行。有关更多信息,请参见parpool参考页面。当工作人员运行在与客户端不同的平台上时,使用该函数pctRunOnAll正确设置所有工作人员的MATLAB路径。

错误处理

在执行期间在工作期间发生错误时spmd语句,错误被报告给客户端。客户端试图中断所有工作程序的执行,并向用户抛出一个错误。

对工人产生的错误和警告用工人ID (labindex)并按Matlab客户端收到的顺序在客户端命令窗口中显示。

的行为lastwarn在末尾没有指定spmd如果在其体内使用。

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;结束结束

- code脚本

您可以从spmd声明,但P代码脚本不能包含一个spmd声明。要解决此问题,请使用p代码函数而不是p代码脚本。

ANS.多变的

引用ANS.变量的外部定义spmd语句内部不支持金宝appspmd声明。在…的体内spmd语句,则必须赋值ANS.变量,然后再使用它。

另请参阅

||||

相关话题