主要内容

本页采用了机器翻译。点击此处可查看最新英文版本。

spmd

在并行池的工作单元上并行执行代码

语法

spmd
    statements
end

说明

spmd, statements, end 在一行上定义一个 spmd 语句。MATLAB® 在多个 MATLAB 工作单元进程上同时执行 spmd 表示的 statements 主体。每个工作单元可以对不同的数据集或分布式数据的不同部分进行操作,并且可以在执行并行计算时与其他参与的工作单元进行通信。仅当您拥有 Parallel Computing Toolbox™ 时才可使用 spmd 语句。要并行执行语句,必须先使用 parpool 创建一个 MATLAB 工作单元池,或者将并行设置设置为允许自动启动池。

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

spmd 语句主体返回的值在 MATLAB 客户端上转换为 Composite 对象。Composite 对象包含对存储在远程 MATLAB 工作单元上的值的引用,并且可以使用元胞数组索引来检索这些值。只要 Composite 存在于客户端并且并行池保持打开状态,工作单元上的实际数据就会在工作单元上保持可用,以供后续的 spmd 执行。

默认情况下,MATLAB 使用池中的所有工作单元。当没有活动池时,MATLAB 将创建一个池并使用该池中的所有工作单元。如果您的设置不允许自动创建池,MATLAB 将本地执行代码块主体,并根据需要创建复合对象。如果任何工作单元正忙于执行 spmd 请求,则您无法执行 parfeval 代码块,除非您使用 spmd(0)

有关 spmd 和 Composite 对象的更多信息,请参阅 分发数组并运行 SPMD

注意

如果要使用 clear,请使用 parfevalOnAll 而不是 parforspmd。这保留了工作区透明度。请参阅确保 parfor 循环或 spmd 语句的透明度

示例

spmd(n), statements, end 使用 n 来指定确切的 MATLAB 工作单元数量以评估 statements,前提是并行池中有 n 工作单元可用。如果没有足够的可用工作单元,则会引发错误。如果 n 为零,则 MATLAB 会在本地执行代码块主体并创建 Composite 对象,就像没有可用池一样。

示例

spmd(m,n), statements, end 使用最少 m 个工作单元和最多 n 个工作单元来评估 statements。如果没有足够的工作单元可用,则会引发错误。m 可以为零,这允许块在没有工作单元可用的情况下在本地运行。

示例

spmd(pool,___), statements, end 在由 parallel.Pool 对象 pool 指定的并行池上评估 statements。当您希望在与 gcp 函数返回的池不同的池上评估 spmd 语句时,请使用此语法。 (自 R2025a 起)

示例

示例

全部折叠

创建一个并行池,并使用 spmd 并行执行简单的计算。MATLAB 在并行池中的所有工作单元上执行 spmd 里面的代码。

parpool(3);
Starting parallel pool (parpool) using the 'Processes' profile ...
Connected to the parallel pool (number of workers: 3).
spmd
  q = magic(spmdIndex + 2);
end

绘制结果。

figure
subplot(1,3,1), imagesc(q{1});
subplot(1,3,2), imagesc(q{2});
subplot(1,3,3), imagesc(q{3});

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

delete(gcp);

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

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

availableGPUs = gpuDeviceCount("available")
availableGPUs = 3

启动一个并行池,其工作单元数量与可用的 GPU 数量相同。为了获得最佳性能,MATLAB 默认为每个工作单元分配不同的 GPU。

parpool("Processes",availableGPUs);
Starting parallel pool (parpool) using the 'Processes' profile ...
Connected to the parallel pool (number of workers: 3).

要识别每个工作单元正在使用哪个 GPU,请在 gpuDevice 代码块内调用 spmdspmd 代码块在每个工作单元上运行 gpuDevice

spmd
    gpuDevice
end

使用并行语言功能(例如 parforparfeval)将您的计算分配给并行池中的工作单元。如果您在计算中使用启用 gpuArray 的函数,这些函数将在工作单元的 GPU 上运行。有关详细信息,请参阅在 GPU 上运行 MATLAB 函数。有关示例,请参阅 在多个 GPU 上运行 MATLAB 函数

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

delete(gcp("nocreate"));

如果您想使用不同的 GPU,那么您可以使用 gpuDevice 在每个工作单元上选择特定的 GPU,并使用 GPU 设备索引。您可以使用 gpuDeviceCount 函数获取系统中每个 GPU 设备的索引。

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

[availableGPUs,gpuIndx] = gpuDeviceCount("available")
availableGPUs = 3
gpuIndx = 1×3

     1     2     3

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

useGPUs = [1 3];

启动您的并行池。使用 spmd 代码块和 gpuDevice 将每个工作单元与您想要使用的 GPU 之一关联起来,并使用设备索引。spmdIndex 函数标识每个工作单元的索引。

parpool("Processes",numel(useGPUs));
Starting parallel pool (parpool) using the 'Processes' profile ...
Connected to the parallel pool (number of workers: 2).
spmd
    gpuDevice(useGPUs(spmdIndex));
end

作为最佳做法,为了获得最佳性能,请为每个工作单元分配不同的 GPU。

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

delete(gcp("nocreate"));

自 R2025a 起

使用远程集群配置文件 myMJSCluster 启动并行池。

myClusterPool = parpool("myMJSCluster",15);
Starting parallel pool (parpool) using the 'myMJSCluster' profile ...
Connected to parallel pool with 15 workers.

myClusterPool 池进行分区,划分出一个包含 6 个工作单元的池。

spmdWorkers = myClusterPool.Workers(1:6);
[spmdPool,otherPool] = partition(myClusterPool,"Workers",spmdWorkers);

使用 spmdPool 工作单元计算 pi 的估计值。

fun = @(x) 4./(1 + x.^2);
spmd(spmdPool)
    a = (spmdIndex - 1)/spmdSize;
    b = spmdIndex/spmdSize;
    myIntegral = integral(fun,a,b);
    piApprox = spmdPlus(myIntegral);
end

approx1 = piApprox{1};
fprintf("pi           : %.18f\n" + ...
    "Approximation: %.18f\n" + ...
    "Error        : %g\n", pi,approx1,abs(pi - approx1));
pi           : 3.141592653589793116
Approximation: 3.141592653589793116
Error        : 0

输入参数

全部折叠

自 R2025a 起

池计算 spmd 语句,指定为 parallel.Pool 对象。

  • 要创建并行池,请使用 parpool

  • 要使用现有池中的子集,请使用 partition

提示

  • spmd 代码块在现有并行池的工作单元上运行。如果不存在池,则 spmd 将启动一个新的并行池,除非在并行设置中禁用了池的自动启动。如果没有并行池并且 spmd 无法启动并行池,则代码在客户端会话中串行运行。

  • 如果并行池的集群配置文件文件中的 AutoAttachFiles 属性设置为 true,则 MATLAB 将对 spmd 代码块执行分析,以确定其执行需要哪些代码文件,然后自动将这些文件附加到并行池作业,以便工作单元可以使用该代码。

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

  • 有关 spmd 和其他并行编程构造的性能的信息,请参阅 在 spmd、parfor 和 parfeval 之间选择

扩展功能

全部展开

版本历史记录

在 R2008b 中推出

全部展开