主要内容

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

介绍

单个程序多个数据(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.声明需要最少的m工人,它最多使用N工人。

如果控制执行您的工人数量是重要的SPMD.语句,在集群配置文件中或使用SPMD.声明,而不是使用范围。

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

SPMD.(3)r =兰特(4,4);结尾

笔记

本章中的所有后续示例假定并行池是打开的,并且在序列之间保持打开SPMD.陈述。

与A不同议案-loop,工人使用SPMD.声明每个都有一个唯一的价值Labindex.。这允许您指定仅在某些工人上运行的代码,或者通常用于访问唯一数据的目的。

例如,创建不同大小的阵列,具体取决于Labindex.

SPMD.(3)如果labindex == 1 r = rand(9,9);别的r = rand(4,4);结尾结尾

根据每个工人加载唯一数据Labindex.,并在每个工作人员上使用相同的函数来计算来自数据的结果:

SPMD.(3)LabData = Load(['datafile_'num2str(labindex)'.ascii'])结果= myFunction(LabData)结尾

工作人员执行一个SPMD.声明同时运作并彼此了解。与通信作业一样,您可以直接控制工人之间的通信,在它们之间传输数据,并在其中使用编码阵列。

例如,使用编码阵列SPMD.陈述:

SPMD.(3)RR = RAND(30,Codistributor());结尾

每个工人都有一个30×10段的编码阵列rr.。有关编码阵列的更多信息,请参阅使用编码阵列

显示输出

当运行一个SPMD.在并行池中的语句,从工人输出的所有命令行都在客户端命令窗口中显示。由于工人是Matlab会话而不显示,因此池中的任何图形输出(例如,图窗口)根本不会显示。

马铃薯小路

所有工作的工人都在执行SPMD.语句必须具有与客户端相同的MATLAB搜索路径,以便它们可以执行在常见代码块中调用的任何函数。因此,每当你使用时光盘目录, 或者rmpath.在客户端上,它还可以在所有工人上执行,如果可能的话。有关更多信息,请参阅parpool.参考页面。当工人在不同的平台上运行而不是客户端,使用该函数PCTRunonall.正确设置所有工人的MATLAB路径。

误差处理

在执行过程中,当工作人员发生错误时SPMD.语句,错误向客户端报告。客户端尝试在所有工人身上中断执行,并对用户抛出错误。

工人制作的错误和警告与工人ID注释(Labindex.),并按照MATLAB客户端接收到的顺序显示在客户端的命令窗口中。

行为背空是未指定的SPMD.如果在其身体内使用。

SPMD限制

嵌套功能

在一个功能内,身体SPMD.语句不能引用嵌套函数。但是,它可以通过定义为嵌套功能的函数句柄来调用嵌套功能。

因为这SPMD.身体在工人身上执行,通过嵌套函数更新的变量SPMD.语句不会在外部功能的工作空间中更新。

嵌套的SPMD.陈述

一个人的身体SPMD.声明不能直接包含另一个SPMD.。但是,它可以调用包含另一个函数SPMD.声明。内在SPMD.语句不会在另一个并行池中并行运行,但在运行其包含功能的工作人员上串行运行。

嵌套的议案- 酥油

一个SPMD.声明不能包含一个议案-loop函数的函数体议案-loop无法包含SPMD.声明。原因是工人无法启动或访问其他平行池。

休息继续, 和返回陈述

一个人的身体SPMD.声明中不能包含休息继续, 或者返回陈述。考虑Parfeval.Parfevalonall.代替SPMD.,因为你可以使用取消在他们。

全局和持久变量

一个人的身体SPMD.声明中不能包含全球的执着的变量声明。原因是工人之间不会同步这些变量。您可以使用全球的执着的函数中的变量,但它们的值仅适用于创建它们的工作人员。代替全球的变量,使用函数参数来共享值是更好的做法。

匿名功能

一个人的身体SPMD.语句无法定义匿名功能。但是,它可以通过函数句柄引用匿名功能。

InputName.职能

使用InputName.要返回与参数编号对应的工作空间变量名称不受支持金宝appSPMD.。原因是SPMD.工人无法访问MATLAB桌面的工作空间。解决此问题,致电InputName.SPMD.,如下面的示例所示。

A ='一种';myfunction(a)功能x = myfunction(a)name = inputname(1);SPMD.X.(name)= labindex;结尾x = [x {:}];结尾

加载职能

语法加载没有分配到输出结构的内部不支持金宝appSPMD.陈述。里面SPMD.,始终分配输出加载到一个结构。

nargout职能

内部不支持以下使用金宝appSPMD.陈述:

  • 使用nargout没有函数参数

  • 使用Narginchk.Nargoutchk.验证对当前正在执行的函数中的输入或输出参数的数量

原因是工人无法访问Matlab桌面的工作空间。要解决此问题,请先调用这些函数SPMD.

myfunction('一种''B'功能myfunction(a,b)nin = nargin;SPMD.x = labindex * nin;结尾结尾

P代码脚本

您可以从内部调用p代码脚本文件SPMD.语句,但是P-code脚本不能包含SPMD.声明。要解决这个问题,请使用P-code函数而不是P-code脚本。

变量

参考文献在外面定义的变量SPMD.在内部不支持声明金宝appSPMD.声明。在…的体内SPMD.声明,您必须分配在使用之前变量。

也可以看看

||||

相关的话题