Main Content

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

parpool

在集群上创建并行池

说明

parpool 使用默认配置文件启动并行工作进程池。使用默认首选项,MATLAB® 会在本地机器上启动一个池,每个物理 CPU 核心配备一个工作进程,直至达到默认配置文件中设置的限制。有关并行首选项的更多信息,请参阅 指定您的并行首选项

一般来说,池大小由默认配置文件的 PreferredPoolNumWorkers 属性指定。要了解可能影响池大小的所有因素,请参阅 影响池大小的因素

parpool 通过在工作进程池上创建特殊作业,并将 MATLAB 客户端连接到并行池,启用 MATLAB 中并行语言功能的全部功能。并行语言功能包括 parforparfevalparfevalOnAllspmddistributed。如果可能的话,将工作进程上的工作文件夹设置为与 MATLAB 客户端会话的工作文件夹相匹配。

示例

parpool(poolsize) 创建并返回具有指定数量工作进程的池。poolsize 可以是正整数或指定为 2 元素整数向量的范围。如果 poolsize 是一个范围,则生成的池在请求的范围内具有尽可能大的大小。

指定 poolsize 将覆盖 PreferredPoolNumWorkers 属性中指定的任何值,并启动一个具有该数量工作进程的池,即使必须等待它们可用。大多数集群对于可以启动的工作进程的最大数量是有限制的。如果配置文件指定了 MATLAB 作业调度器集群,则 parpool 将从该 MATLAB 作业调度器下已在运行且可用的工作程序中保留其工作进程。如果配置文件指定了本地或第三方调度器,parpool 会指示调度器启动池中的工作进程。

示例

parpool(resources)parpool(resources,poolsize)resources 指定的资源上启动一个工作进程池。

示例

parpool(___,Name,Value) 在启动池时应用某些属性的指定值。

示例

poolobj = parpool(___)parallel.Pool 对象返回到代表集群上的池的客户端工作区。您可以使用池对象以编程方式删除池或访问其属性。使用 delete(pool) 关闭并行池。

示例

示例

全部折叠

使用默认配置文件启动并行池来定义工作进程的数量。使用默认首选项时,默认池位于本地机器上。

parpool

您可以在本地机器上的不同类型的并行环境上创建池。

  • 启动一个并行进程工作进程。

    parpool("Processes")
  • 启动并行并行工作进程池。

    parpool("Threads")

有关并行环境的更多信息,请参阅 在基于线程和基于进程的环境之间进行选择

使用名为 myProf 的配置文件启动一个由 16 个工作进程组成的并行池。

parpool("myProf",16)

创建一个代表默认配置文件所标识的集群的对象,并使用该集群对象启动并行池。池大小由默认配置文件决定。

c = parcluster
parpool(c)

使用默认配置文件启动并行池,并将两个代码文件传递给工作进程。

parpool(AttachedFiles=["mod1.m","mod2.m"]

如果您可以访问多个 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"));

使用默认配置文件创建一个并行池,然后删除该池。

poolobj = parpool;

delete(poolobj)

查找当前并行池中的工作进程数量。

poolobj = gcp("nocreate"); % If no pool, do not create new one.
if isempty(poolobj)
    poolsize = 0;
else
    poolsize = poolobj.NumWorkers
end

输入参数

全部折叠

并行池的大小,指定为正整数或以 2 元素整数向量指定的范围。如果 poolsize 是一个范围,则生成的池在请求的范围内具有尽可能大的大小。设置集群配置文件中的默认首选工作进程数量。

parpool 支持最多具有 2000 个工作进程的池。 (自 R2024a 起)

示例: parpool("Processes",2)

数据类型: single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64

启动池的资源,指定为 "Processes""Threads"、集群配置文件名称或集群对象。

示例: parpool("Processes")

示例: parpool("Threads")

示例: parpool("myClusterProfile",16)

示例: c = parcluster; parpool(c)

数据类型: char | string | parallel.Cluster

名称-值参数

将可选参量对指定为 Name1=Value1,...,NameN=ValueN,其中 Name 是参量名称,Value 是相应的值。名称-值参量必须出现在其他参量之后,但对的顺序并不重要。

在 R2021a 之前,使用逗号分隔每个名称和值,并将 Name 括在引号中。

示例: AttachedFiles="myFun.m"

要附加到池的文件,指定为字符向量、字符串或字符串数组、或字符向量单元格数组。

通过这对参量,parpool 启动一个并行池并将识别的文件传递给池中的工作进程。此处指定的文件将附加到适用的并行配置文件中指定的 AttachedFiles 属性,以形成附加文件的完整列表。AttachedFiles 属性名称区分大小写,并且必须按所示显示。

示例: ["myFun.m","myFun2.m"]

数据类型: char | cell

标志指定是否在启动时将客户端路径上的用户添加的条目添加到每个工作进程的路径中,指定为逻辑值。

数据类型: logical

从客户端会话复制到工作进程的环境变量的名称,指定为字符向量、字符串或字符串数组、或字符向量单元数组。此处指定的名称附加到适用的并行配置文件中指定的 EnvironmentVariables 属性,以形成完整的环境变量列表。任何未设置的列出的变量都不会复制到工作进程。这些环境变量是在并行池持续期间在工作进程上设置的。

数据类型: char | cell

标志指定池上是否启用了 spmd 支持,指定为逻辑值。您只能在本地或 MATLAB 作业调度器集群上禁用支持。parfor 迭代不涉及工作进程之间的通信。因此,如果 SpmdEnabledfalse,则即使在循环执行期间一个或多个工作进程中止,parfor 循环仍会继续。

数据类型: logical

池在空闲时关闭的时间(以分钟为单位),指定为大于零的整数。如果池未在工作进程上运行代码,则该池处于空闲状态。默认情况下,IdleTimeout 属性值与并行选项中的值相同。有关并行首选项的更多信息,请参阅 指定您的并行首选项

示例: pool = parpool(IdleTimeout=120)

输出参量

全部折叠

从客户端访问并行池,作为 parallel.Pool 对象返回。

提示

  • 桌面左下角的池状态指示器显示客户端会话与池的连接以及池的状态。点击图标可查看支持的池操作菜单。

    池正在运行:The parallel pool status indicator indicating that a pool is running, showing the start parallel pool and parallel preferences menu options. 没有正在运行的池:The parallel pool status indicator indicating that no pool is running, showing the start parallel pool and parallel preferences menu options.

  • 如果您将并行选项设置为在必要时自动创建并行池,则无需明确调用 parpool 命令。您可以明确创建一个池来控制何时产生设置它的开销时间,以便该池可以为后续的并行语言构造做好准备。

  • delete(poolobj) 关闭并行池。如果没有并行池,spmdparfor 将作为客户端中的单个线程运行,除非您的并行选项设置为自动为它们启动并行池。

  • 当您使用 MATLAB 编辑器更新连接到并行池的客户端上的文件时,这些更新会自动传播到池中的工作进程。(此自动更新不适用于 Simulink® 模型文件。要将更新的模型文件传播给工作进程,请使用 updateAttachedFiles 函数。)

  • 如果可能的话,工作进程上的工作文件夹最初被设置为与 MATLAB 客户端会话的工作文件夹相匹配。随后,在客户端命令窗口中输入的以下命令也会在池中的所有工作进程上执行:

    此行为允许您在所有工作进程上设置工作文件夹和命令搜索路径,以便后续池活动(例如 parfor-loops)在适当的上下文中执行。

    在具有 Windows® 操作系统的客户端上更改文件夹或添加带有 cdaddpath 的路径时,发送给工作进程的值(如果可能)是该文件夹的 UNC 路径。对于使用 Linux® 操作系统的客户端,它是绝对文件夹位置。

    如果任何这些命令在客户端不起作用,它也不会在工作进程上执行。例如,如果 addpath 指定了客户端无法访问的文件夹,则 addpath 命令不会在工作进程上执行。但是,如果可以在客户端上设置工作文件夹,但无法在任何工作进程上按指定方式设置,则不会收到返回到客户端命令窗口的错误消息。

    在混合平台环境中要小心这种行为上的细微差别,在这种环境中,客户端与工作进程不是同一平台,客户端本地的或从客户端映射的文件夹对工作进程来说不能以相同的方式使用,或者文件夹位于非共享的文件系统中。例如,如果 MATLAB 客户端在 Microsoft® Windows 操作系统上运行,而 MATLAB 工作进程都在 Linux 操作系统上运行,则 addpath 的相同参量不能在两者上都起作用。在这种情况下,您可以使用函数 pctRunOnAll 来确保命令在所有工作进程上运行。

    客户端和工作进程之间的另一个区别是,matlabroot 文件夹的任何 addpath 参量都未在工作进程上设置。假设 MATLAB 安装基础已经包含在工作进程的路径中。addpath 关于池中工作进程的规则是:

    • matlabroot 文件夹的子文件夹不会发送给工作进程。

    • 在第一次出现 matlabroot 文件夹之前出现的任何文件夹都将添加到工作进程路径的顶部。

    • 在第一次出现 matlabroot 文件夹之后出现的任何文件夹都将添加到工作进程路径上的 matlabroot 文件夹组之后。

    例如,假设客户端上的 matlabrootC:\Applications\matlab\。在打开并行池的情况下,执行以下操作来设置客户端和所有工作进程上的路径:

    addpath("P1",
            "P2",
            "C:\Applications\matlab\T3",
            "C:\Applications\matlab\T4",
            "P5",
            "C:\Applications\matlab\T6",
            "P7",
            "P8");

    因为 T3T4T6matlabroot 的子文件夹,所以它们没有设置在工作进程路径上。因此对于工作进程来说,该命令产生的路径的相关部分是:

    P1
    P2
    <worker original matlabroot folders...>
    P5
    P7
    P8
  • 如果您使用的是 Macintosh 或 Linux,并且在创建大型并行池期间遇到问题,请参阅 针对 Macintosh 和 Linux 的建议系统限制

版本历史记录

在 R2013b 中推出

全部展开