主要内容

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

partition

对并行池进行分区

自 R2025a 起

    说明

    partition 将现有的并行池划分为池分区,允许您使用现有池中的特定资源。使用 partition 函数创建针对特定资源的池,或创建多个池以同时执行多个并行工作流。

    newPool = partition(pool,"MaxNumWorkersPerHost",MaxNumWorkersPerHost) 创建一个池对象 newPool,每个主机最多提供 MaxNumWorkersPerHost 个工作单元到输入池 pool

    主机是指运行 MATLAB® 工作单元的计算机。在本地池中,主机是您的计算机。在集群池中,主机是集群中的计算机。集群池可以在多个主机上运行工作单元。

    如果主机运行的工作单元数少于您请求的工作单元数,则 partition 函数将该主机上的所有可用工作单元分配给 newPool

    示例

    newPool = partition(pool,"MaxNumWorkersPerGPU",MaxNumWorkersPerGPU) 创建一个池对象 newpool,输入池 pool 中的每个唯一 GPU 最多可有 MaxNumWorkersPerGPU 个工作单元。

    GPU 必须连接到与 MATLAB 工作单元相同的主机,才能被分配给该工作单元。如果 partition 函数无法将请求的工作单元数分配给 GPU,则该函数将所有可分配给 GPU 的工作单元分配给 newpool。在具有多个 GPU 的主机上,主机上的 MATLAB 工作单元和 GPU 的数量决定了 partition 函数可分配给每个 GPU 的最大工作单元数量。在没有 GPU 的主机上,除非池中的其他主机有 GPU,否则 partition 函数将返回一个空池。

    此分区方法使用每个并行池工作单元上的 gpuDevice 函数的结果来确定哪个工作单元与哪个 GPU 相关联。partition 函数只考虑分配了 GPU 的工作单元,不会修改任何 GPU 的属性值。partition 函数在 pool 中的所有工作单元上执行代码,以收集 gpuDevice 信息。如果任何工作单元正在执行 parfeval 计算,则 partition 函数将等待 parfeval 计算完成。

    示例

    newPool = partition(pool,"Workers",Workers) 对输入池对象 pool 进行分区,创建一个新池对象 newPool,该对象仅包含由对象 parallel.Worker 或对象数组 parallel.Worker 指定的工作单元,WorkersWorkers 中的每个工作单元都必须是输入池的 Workers 属性的成员。

    示例

    [newPool,remainingPool] = partition(pool,___) 还返回 remainingPool,这是一个池对象,包含 pool 中但 newpool 中没有的工作单元集。

    示例

    示例

    全部折叠

    将并行池分区,为每个 GPU 分配一个工作单元,这对于 GPU 密集型计算非常有用。

    在此示例中,myCluster 配置文件请求一个带有四个 GPU 的并行池。使用 myCluster 配置文件启动一个由 12 个工作单元组成的并行池。

    pool = parpool("myCluster",12);
    Starting parallel pool (parpool) using the 'myCluster' profile ...
    Connected to parallel pool with 12 workers.

    将池分区,为每个 GPU 分配一个工作单元。

    [gpuWorkers,cpuWorkers] = partition(pool,"MaxNumWorkersPerGPU",1);
    

    显示新池中的工作单元数。

    fprintf("Number of GPU workers: %d\n" + ...
        "Number of CPU workers: %d\n",gpuWorkers.NumWorkers,cpuWorkers.NumWorkers);
    
    Number of GPU workers: 4
    Number of CPU workers: 8

    您可以使用 CPU 池与 GPU 池同时执行任务。

    为每个主机分配一个工作单元对于每个工作单元需要大量内存或 CPU 资源的任务非常有用。

    使用远程集群配置文件 myMJSCluster 启动一个具有 15 个工作单元的并行池。myMJSCluster 创建了一个包含三个主机的池。

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

    myClusterPool 池分区,使每个主机有一个工作单元。

    [perHostPool,remainingPool] = partition(myClusterPool,"MaxNumWorkersPerHost",1);
    

    显示新池中的工作单元数。

    fprintf("Number of workers in perHostPool: %d\n" + ...
        "Number of workers in remainingPool: %d\n",perHostPool.NumWorkers,remainingPool.NumWorkers)
    
    Number of workers in perHostPool: 3
    Number of workers in remainingPool: 12

    当您需要在专用工作单元上运行任务时,隔离单个工作单元会非常有用。

    启动一个并行池,并使用池对象的 Workers 属性来获取池中工作单元的 parallel.Worker 对象。

    pool = parpool("Processes");
    allWorkers = pool.Workers;

    对并行池进行分区,以隔离数组 allWorkers 中的第一个工作单元。

    [singleWkrPool,remainingPool] = partition(pool,"Workers",allWorkers(1));
    

    检查分区的单个工作单元池。

    singleWkrPool
    singleWkrPool = 
    
     ProcessPool with properties: 
    
                Connected: true
               NumWorkers: 1
                     Busy: false
                  Cluster: Processes (Local Cluster)
            AttachedFiles: {}
        AutoAddClientPath: true
                FileStore: [1x1 parallel.FileStore]
               ValueStore: [1x1 parallel.ValueStore]
              IdleTimeout: 30 minutes (26 minutes remaining)
              SpmdEnabled: true

    输入参数

    全部折叠

    输入池对象,指定为 parallel.Pool 对象。

    示例: pool = parpool;

    每个 GPU 分配的用于分区的最大工作单元数,指定为正整数。

    partition 函数尝试为输入池中的每个唯一 GPU 分配至少 MaxNumWorkersPerGPU 个工作单元。如果 GPU 分配的工作单元少于 MaxNumWorkersPerGPU,则 partition 选择所有可用的工作单元。

    每个主机可分区的最大工作单元数,指定为正整数。

    partition 函数尝试为输入池中的每个唯一主机分配至少 MaxNumWorkersPerHost 个工作单元。如果主机可用的工作单元少于 MaxNumWorkersPerHost,则 partition 选择所有可用的工作单元。

    要分区的的工作单元,指定为 parallel.Worker 对象或 parallel.Worker 对象的数组。

    要获取 parallel.Worker 对象,可以使用输入池的 Workers 属性。您还可以对要针对的目标池工作单元使用 getCurrentWorker 函数,以返回其 parallel.Worker 对象。

    示例: allWorkers = pool.Workers;

    输出参量

    全部折叠

    并行池,带有分区的工作单元,以 parallel.Pool 对象返回。

    并行池与剩余的工作单元,以 parallel.Pool 对象返回。

    提示

    • 池分区包含输入池中的某些工作单元,因此输入池及其分区均可对同一工作单元进行调度。因此,使用一个池可能会延迟其他池中工作的执行。删除任何池实例都会删除其底层的工作单元集合以及在池上运行的任何并行作业。使用同一资源集合的所有池均失效。如果您不再需要并行池分区,请让实例超出作用域,而不是显式删除它。

    • 池分区的 NumWorkers 属性值反映了池可使用的 工作单元的数量。

    • 新池与输入池共享一些属性。这些属性的更改会影响所有池。这些共享属性为:

      • AttachedFiles

      • FileStore

      • ValueStore

      • IdleTimeout

    版本历史记录

    在 R2025a 中推出