Main Content

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

spmd

在并行池的工作进程上并行执行代码

语法

spmd
    statements
end

说明

示例

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

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

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

默认情况下,MATLAB 使用池中的所有工作进程。当没有活动池时,MATLAB 将创建一个池并使用该池中的所有工作进程。如果您的偏好不允许自动创建池,MATLAB 会在本地执行块体并根据需要创建复合对象。如果任何工作进程正忙于执行 parfeval 请求,则您无法执行 spmd 代码块,除非您使用 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 并行执行简单的计算。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,请在 spmd 代码块内调用 gpuDevicespmd 代码块在每个工作进程上运行 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"));

提示

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

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

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

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

扩展功能

版本历史记录

在 R2008b 中推出