主要内容

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

Composite

从客户端创建并访问多个工作单元上的非分布式变量

    说明

    Composite 对象包含对运行 spmd 语句的并行工作单元上存储的变量的引用。Composite 对象类似于一个元胞数组,每个工作单元有一个元素,并且可以包含每个工作单元的不同值。您可以使用元胞数组索引检索值,并使用索引或 spmd 代码块为条目定义值。工作单元上的实际数据仍然可用于后续的 spmd 执行,而 Composite 存在于客户端上并且并行池保持打开状态。

    创建对象

    spmd 语句主体返回值时,spmd 语句会在客户端自动创建 Composite 变量。因此,您很少需要直接创建 Composite 对象。

    您还可以使用 Composite 函数明确创建 Composite 对象。

    描述

    c = Composite 使用来自当前并行池的工作单元在客户端上创建一个 Composite 对象。

    对象引用的实际工作单元数量取决于池的大小以及任何现有的 Composite 对象。如果并行池未打开,Composite 函数将使用默认配置文件启动并行工作单元池。

    要手动创建 Composite 对象,您必须在任何 spmd 语句之外执行此操作。最初,手动创建的 Composite 对象的每个条目不包含任何数据。使用索引或 spmd 代码块定义条目的值。

    示例

    c = Composite(nworkers) 指定用于创建 Composite 对象的工作单元数量。实际工作单元线程数是与当前并行池的大小以及任何其他现有的 Composite 对象兼容的最大工作单元线程数。如果软件无法满足工作单元数量的约束,就会返回错误。

    示例

    c = Composite(pool,___) 使用由 parallel.Pool 对象 pool 指定的并行池中的工作单元创建一个 Composite 对象。当您要在 gcp 函数返回的池之外的池中创建 Composite 对象时,请使用此语法。 (自 R2025a 起)

    示例

    输入参量

    全部展开

    创建 Composite 对象的工作单元数量,指定为正整数、Inf 或包含正整数或 Inf 值的二元素向量。如果 nworkers 是一个标量,它指定要使用的工作单元的确切数量。如果 nworkers 是一个二元素向量,则其第一个和第二个元素分别指定要使用的最小工作单元数量和最大工作单元数量。

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

    自 R2025a 起

    创建 Composite 对象,指定为 parallel.Pool 对象。

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

    • 要使用当前池中的子集,请使用 partition

    输出参量

    全部展开

    客户端上使用并行池中工作单元的 Composite 数组,以 Composite 对象的形式返回。

    对象函数

    existCheck whether Composite is defined on workers
    gatherTransfer distributed array, Composite object, or gpuArray object to local workspace
    subsasgnSubscripted assignment for Composite
    subsrefSubscripted reference for Composite

    Composite 对象的其他对象函数的行为与这些 MATLAB® 数组函数类似:

    disp显示变量的值
    end终止代码块或指示最大数组索引
    isempty确定数组是否为空
    length最大数组维度的长度
    ndims数组维度数目
    numel数组元素的数目
    size数组大小

    示例

    全部折叠

    此示例显示如何创建一个没有定义元素的 Composite 对象,然后使用客户端上的 for 循环分配值。

    启动一个有四个工作单元的并行池,并为每个工作单元创建一个包含一个元素的 Composite 对象。

    p = parpool("Processes",4);
    Starting parallel pool (parpool) using the 'Processes' profile ...
    Connected to parallel pool with 4 workers.
    
    c = Composite
     
    c =
     
       Worker 1: No data
       Worker 2: No data
       Worker 3: No data
       Worker 4: No data
     
    

    在客户端上使用 for 循环来定义 Composite 对象元素的值。您分配给每个元素的值都存储在工作单元身上。显示 Composite 对象。

    for w = 1:length(c)
        c{w} = rand;
    end
    c{:}
    ans = 0.8147
    
    ans = 0.9058
    
    ans = 0.1270
    
    ans = 0.9134
    

    此示例显示如何指定工作单元的数量,从而指定 Composite 对象中的元素数量。

    使用名为 my_Profile 的配置文件启动一个由 10 个工作单元组成的并行池。

    parpool("my_Profile",10);
    Starting parallel pool (parpool) using the 'my_Profile' profile ...
    Connected to parallel pool with 10 workers.
    

    从当前并行池中创建一个仅具有四个工作单元的 Composite 对象,并将值分配给 Composite 代码块中的 spmd 元素。显示 Composite 对象。

    c = Composite(4);
    spmd
        c = spmdIndex;
    end
    c{:}
    ans = 1
    
    ans = 2
    
    ans = 3
    
    ans = 4
    

    此示例显示如何使用 spmd 代码块和分布式数组在客户端上创建 Composite 对象。

    启动一个有四个工作单元的并行池,并将四个整数的数组分配给工作单元。每个工作单元都会得到一个整数。

    p = parpool("Processes",4);
    d = distributed([3 1 4 2]);

    使用每个工作单元上的分布式数组的各个部分来设置 Composite 对象 c 的值。

    spmd
    c = getLocalPart(d);
    end

    显示并查看有关 c 的信息。

    c{:}
    ans = 3
    
    ans = 1
    
    ans = 4
    
    ans = 2
    
    whos c
      Name      Size            Bytes  Class        Attributes
    
      c         1x4               489  Composite              
    

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

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

    myClusterPool 分区,以准备运行 spmd 语句。使用 partition 函数创建一个新池 spmdPool,其中每个主机最多限制一个工作单元。此设置有助于在主机之间均匀分配任务。

    [spmdPool,otherPool] = partition(myClusterPool,"MaxNumWorkersPerHost",1);

    创建一个 Composite 对象,其中 spmdPool 中的每个工作单元都有一个元素。

    j = Composite(spmdPool);

    在客户端使用 for 循环来定义 Composite 对象的元素值。

    m = 1000000;
    for w = 1:length(j)
        j{w} = rand(m,2);
    end

    使用 Composite 对象对 pi 进行蒙特卡罗近似。

    spmd
       for p = drange(1:spmdSize)
          z = j(:,1) + 1i*j(:,2);
          c = sum(abs(z) < 1); 
       end
       k = spmdPlus(c);
       p = 4*k/(m*spmdSize);
    end
    approxPi = p{1}
    approxPi = 
    3.1418
    

    提示

    • Composite 函数在现有并行池的工作单元上创建一个 Composite 对象。如果不存在池,则 Composite 函数将启动一个新的并行池,除非在并行设置中禁用了自动启动池。如果不存在并行池并且 Composite 无法启动并行池,则结果是客户端工作区中存在 1×1 的 Composite 对象。

    扩展功能

    全部展开

    版本历史记录

    在 R2008a 中推出

    全部展开