主要内容

spmd

在并行池的worker上并行执行代码

语法

spmd语句结束

描述

例子

spmd,语句,最后定义了一个spmd语句在单行上。MATLAB®执行spmd主体表示为语句同时在几个MATLAB worker上。每个工作人员可以操作不同的数据集或分布式数据的不同部分,并且可以在执行并行计算时与其他参与工作人员通信。的spmd语句只能在具有并行计算工具箱™时使用。要并行执行语句,必须首先使用parpool或者让您的并行首选项允许自动启动池。

的内部spmd语句中,每个MATLAB worker都有一个唯一的值spmdIndex,而spmdSize表示并行执行该块的工人总数。的主体内spmd语句,用于通信作业的通信函数(例如spmdSend而且spmdReceive)可以在工作人员之间传输数据。

类的体返回的值spmd语句被转换为复合对象的MATLAB客户端。Composite对象包含对存储在远程MATLAB worker上的值的引用,这些值可以使用cell-array索引检索。关于工作者的实际数据在后续的工作者上仍然可用spmd只要Composite在客户端上存在,并且并行池保持打开状态,就可以执行。

默认情况下,MATLAB使用池中的所有worker。当没有活动池时,MATLAB将创建一个池并使用该池中的所有worker。如果您的首选项不允许自动创建池,MATLAB将在本地执行块体,并根据需要创建Composite对象。您不能执行spmd阻塞,如果任何工作人员正在忙着执行parfeval请求,除非你使用spmd (0)

欲了解更多有关spmd和复合对象,参见分发数组并运行SPMD

请注意

使用parfevalOnAll而不是parforspmd如果你想用的话清晰的.这保持了工作空间的透明性。看到确保parfor-Loops或spmd语句的透明度

例子

spmd (n),语句,最后使用n来指定要计算的MATLAB worker的确切数量语句,条件是n并行池中有工作人员可用。如果没有足够的工作人员可用,则抛出一个错误。如果n为零时,MATLAB在本地执行块体并创建Composite对象,就像没有可用的池一样。

例子

spmd (n),语句,结束使用最少的最大值为n员工评估语句.如果没有足够的工作人员可用,则抛出一个错误。可以为0,如果没有可用的worker,则允许块在本地运行。

例子

全部折叠

创建一个并行池,并在并行使用中执行一个简单的计算spmd.中的MATLAB执行代码spmd在平行池的所有工作人员身上。

parpool (3);
使用'Processes'配置文件启动并行池(parpool)…连接到并行池(工人数:3)。
spmdq = magic(spmdIndex + 2);结束

画出结果。

图subplot(1,3,1), imagesc(q{1});次要情节(1、3、2),显示亮度图像(问{2});次要情节(1、3、3),显示亮度图像(问{3});

计算完成后,可以删除当前的并行池。

删除(gcp);

如果您可以访问多个gpu,则可以使用并行池在多个gpu上并行执行计算。

若要确定可在MATLAB中使用的gpu数量,请使用gpuDeviceCount函数。

availableGPUs = gpuDeviceCount(“可用”
availableGPUs = 3

用尽可能多的可用gpu启动一个并行池。为了获得最佳性能,MATLAB默认为每个worker分配不同的GPU。

parpool (“过程”, availableGPUs);
使用'Processes'配置文件启动并行池(parpool)…连接到并行池(工人数:3)。

要识别每个工作人员使用的GPU,请调用gpuDevice在一个spmd块。的spmd块运行gpuDevice每个工人身上。

spmdgpuDevice结束

使用并行语言特性,例如parforparfeval,将计算分发给并行池中的工作人员。如果你使用gpuArray在你的计算中启用函数,这些函数在worker的GPU上运行。有关更多信息,请参见在图形处理器上运行MATLAB函数.有关示例,请参见在多gpu上运行MATLAB函数

完成计算后,关闭并行池。您可以使用gcp函数获取当前的并行池。

删除(gcp (“nocreate”));

如果你想使用不同的gpu选择,那么你可以使用gpuDevice来选择每个worker上的特定GPU,使用GPU设备索引。方法可以获取系统中每个GPU设备的索引gpuDeviceCount函数。

假设您的系统中有三个可用的gpu,但您希望只使用两个gpu进行计算。获取设备的索引。

[availableGPUs,gpuIndx] = gpuDeviceCount(“可用”
availableGPUs = 3
gpuIndx =1×31 2 3

定义要使用的设备的索引。

useGPUs = [1 3];

开始你的平行泳池。使用一个spmd块和gpuDevice使用设备索引将每个worker与你想要使用的一个gpu关联起来。的spmdIndex函数标识每个worker的索引。

parpool (“过程”元素个数(useGPUs));
使用'Processes'配置文件启动并行池(parpool)…连接到并行池(工人数:2)。
spmdgpuDevice (useGPUs (spmdIndex));结束

作为最佳实践,为了获得最佳性能,为每个worker分配不同的GPU。

完成计算后,关闭并行池。

删除(gcp (“nocreate”));

提示

  • 一个spmd块在现有并行池的worker上运行。如果不存在存储池,spmd将启动一个新的并行池,除非在并行首选项中禁用了池的自动启动。如果没有平行池和spmd不能启动,代码在客户端会话中串行运行。

  • 如果AutoAttachFiles属性设置为真正的, MATLAB对spmd块来确定其执行所需的代码文件,然后自动将这些文件附加到并行池作业,以便工作线程可以使用这些代码。

  • 有关使用时的限制和限制的信息spmd,请参阅在多个数据集上运行单个程序

  • 的性能信息spmd和其他并行编程结构,请参见选择spmd, parfor和parfeval

版本历史

在R2008b中引入

Baidu
map