主要内容

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

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")
  • 启动一个由 4 个线程式工作单元组成的并行池。

    parpool("Threads",4)

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

使用名为 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,请在 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"));

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

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"

自 R2025a 起

在创建池时添加到工作单元的 MATLAB 搜索路径中的路径,指定为字符向量、字符串或字符串数组,或字符向量的元胞数组。

工作单元器上的默认搜索路径可能与客户端上的不同;路径差异可能是由于当前工作文件夹 (cwd)、平台或网络文件系统访问不同造成的。指定 AdditionalPaths 名称-值参量有助于确保工作单元在正确的位置查找文件,例如代码文件、数据文件或模型文件。

您可以使用 AdditionalPaths 访问共享文件系统中的文件。请注意,路径表示可能因目标计算机而异。AdditionalPaths 必须是集群中的计算机所看到的路径。例如,如果您本地 Windows® 计算机上的 Z:\data 是您的 Linux® 集群上的 /network/data,那么将后者添加到 AdditionalPaths。如果您使用数据存储,请使用 'AlternateFileSystemRoots' 来处理其他表示。有关详细信息,请参阅Set Up Datastore for Processing on Different Machines or Clusters

请注意,AdditionalPaths 仅在您使用相对路径或文件名引用文件时才有助于查找文件,而使用绝对路径则不起作用。

示例: "/network/data/"

数据类型: char | string | cell

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

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 settings menu options. 没有正在运行的池:The parallel pool status indicator indicating that no pool is running, showing the start parallel pool and parallel settings menu options.

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

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

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

  • 如果可能,MATLAB 最初将工作单元上的工作文件夹设置为与 MATLAB 客户端会话上的工作文件夹一致。随后,如果您在客户端上运行以下命令,MATLAB 也会在池中的所有工作单元上执行该命令:

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

    在具有 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 中推出

全部展开