主要内容

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

parallel.pool.Constant

从数据或函数句柄构建并使用常量

    说明

    使用 Constant 对象避免不必要地将数据从当前 MATLAB® 会话多次复制到并行池中的工作单元。您可以在客户端上构建一次 Constant 对象,并将常量传输给工作单元一次。在多个 parfor 循环、spmd 代码块或 parfeval 调用中访问 Constant。您在 Constant 对象中访问的值是常量。您可以与没有 Parallel Computing Toolbox™ 的 MATLAB 用户共享使用 Constant 对象的并行代码。有关详细信息,请参阅 parallel.pool.Constant

    创建对象

    使用 parallel.pool.Constant 从数组、函数句柄或 Composite 对象创建 Constant 对象。使用 Value 属性访问底层数据。

    描述

    C = parallel.pool.Constant(X) 将数组 X 复制到每个工作单元,并返回一个 Constant 对象。

    每个工作单元都可以使用 Value 属性访问并行语言构造 (parforspmdparfeval) 中的数组 X 来读取数据。

    示例

    C = parallel.pool.Constant(FH) 评估每个工作单元上的函数句柄 FH 并将结果存储在 Constant 对象 C 中。使用 Value 属性来访问具有一个输出的运行 FH() 的结果。

    使用此语法在并行池上创建和使用任何句柄类型的资源,例如文件句柄和数据库连接。如果您想要评估每个工作单元上的一个函数以在计算之前设置工作单元,请改用 parfevalOnAll

    示例

    C 被清除时,C = parallel.pool.Constant(FH,cleanupFH) 会评估每个工作单元上的 cleanupFH(C.Value)

    示例

    C = parallel.pool.Constant(COMP)Composite 对象 COMP 的条目中的值存储在每个工作单元上的 Constant 对象 C 中。

    当您希望仅在工作单元上构建数据时使用此语法,例如当数据太大而无法方便地放入客户端时,或者当您从只有工作单元可以访问的文件中加载数据时。使用 Value 属性访问值。

    示例

    输入参量

    全部展开

    输入数据,指定为任何可以保存和加载的 MATLAB 变量。

    构建函数的函数句柄,指定为函数句柄。

    MATLAB 评估构建函数以获取 Constant 对象的 Value 属性。该函数不能接受任何输入参量,并且必须返回一个输出参量。

    • 当您在 MATLAB 会话中或并行池工作单元上第一次读取 Value 属性时,MATLAB 会将该环境中运行 fcn() 的结果存储为 Value 属性。

    • 该函数仅在您的 MATLAB 会话或并行池工作单元中运行一次。当您第一次之后读取 Value 属性时,您会读取存储的结果。

    • 如果您在不同的并行池工作单元上读取 Value 属性,则 MATLAB 将返回在该工作单元上运行 fcn() 的结果。

    示例: @() fopen(tempname(pwd),'wt')

    清理函数的函数句柄,指定为函数句柄。该函数必须接受一个输入参量,即 Constant 对象的 Value 属性。

    C 被清除时,MATLAB 运行清理函数。当您执行以下操作时,Constant 对象 C 将被清除:

    • 在函数中创建 C 并且不从该函数返回 C

    • 从工作区中清除 Constant 对象。

    示例: @fclose

    构建 Constant 对象的 Composite 对象,指定为 Composite 对象。

    COMP 对象必须在每个工作单元上有一个定义的值,否则您将收到错误。

    示例: spmd COMP = rand(3); end; C

    属性

    全部展开

    底层数据或句柄类型资源的独立副本,指定为任何可以保存和加载的 MATLAB 变量或句柄变量。

    使用 ConstantValue 属性来访问底层数据或处理变量。

    示例

    全部折叠

    从客户端上的数组创建一个数值 Constant,并在同一个池中的多个 parfor 循环中使用它。

    在客户端创建一些大数据,然后构建一个 Constant 对象,C 仅将数据传输到池中一次。

    data = rand(1000);
    C = parallel.pool.Constant(data);

    运行多个 parfor 循环来访问数据。为了提高效率,预先分配结果数组。

    x = eye(5);
    for ii = 1:5
        parfor jj = 1:5
            x(ii,jj) = C.Value(ii,jj);
        end
    end
    x
    x = 5×5
    
        0.0016    0.5273    0.3794    0.9148    0.2620
    
    

    要在 parfeval 计算中使用 Constant,必须在 parfeval 调用中指定 Constant 对象,然后通过工作单元上的 Value 属性访问数据。

    在客户端生成一些数据。

    data = rand(1000,1);

    创建一个 Constant 对象,用于将数据传输给工作单元。

    C = parallel.pool.Constant(data);

    为了提高效率,预先分配一个 future 对象数组。

    f(1:10) = parallel.Future;

    安排多个 parfeval 计算任务,这些任务将执行一个匿名函数。将 Constant 对象指定为 parfeval 的参量,并使用 Value 属性访问工作单元上的数据。

    for idx = 1:5
        f(idx) = parfeval(@(C,idx) mean(C.Value+idx),1,C,idx);
    end

    或者,如果您有一个自定义函数,可以编写该函数使其接受 Constant 对象作为参量,并使用 Value 属性来访问 Constant 对象中的数据。

    function r = myFunc(C,idx)
    r = mean(C.Value+idx);
    end

    安排额外的 parfeval 计算任务来运行该自定义函数。将 Constant 对象指定为 parfeval 的参量之一。

    for idx = 6:10
        f(idx) = parfeval(@myFunc,1,C,idx);
    end

    获取 parfeval 计算的结果。

    out = fetchOutputs(f);
    disp(out)
        1.4888
        2.4888
        3.4888
        4.4888
        5.4888
        6.4888
        7.4888
        8.4888
        9.4888
       10.4888
    

    创建一个具有函数句柄和清理函数的 Constant 对象。

    使用 parallel.pool.Constanttempname 在每个工作单元上创建一个临时文件。当您将 fclose函数作为 cleanup 函数句柄传递时,当 C 被清除时,文件会自动关闭。

    C = parallel.pool.Constant(@() fopen(tempname(pwd),'wt'),@fclose);

    显示临时文件名。

    spmd
       disp(fopen(C.Value));
    end
    Worker 1: 
      C:\myTemporaryFiles\tpb2d60042_d684_4705_b084_63496d07b936
    Worker 2: 
      C:\myTemporaryFiles\tpc6bef84f_bebe_44fc_acb2_ddd2fcba5026
    Worker 3: 
      C:\myTemporaryFiles\tpf6775778_b06a_46ba_b502_27e2c253c66f
    Worker 4: 
      C:\myTemporaryFiles\tp4dc6e57a_6b65_437a_8eb7_82877403eee3
    Worker 5: 
      C:\myTemporaryFiles\tpd0e279ac_a141_49f0_a0b6_90c4cad137a4
    Worker 6: 
      C:\myTemporaryFiles\tpf02acaad_60a5_441a_b1a1_46e4c66f33a1
    

    将数据写入每个工作单元上的文件。

    parfor idx = 1:1000
        fprintf(C.Value,'Iteration: %d\n',idx);
    end

    清除 C 以关闭临时文件。

    clear C;   

    Constant 代码块内的池工作单元上从 Composite 对象构建 spmd 对象。

    使用spmdBroadcast创建一个 Composite 对象,将一些大数据发送给 spmd 代码块中的所有工作单元。

    spmd
      if spmdIndex == 1
        x = spmdBroadcast(1,rand(5000));
      else
        x = spmdBroadcast(1);
      end
    end
    Starting parallel pool (parpool) using the 'Processes' profile ...
    Connected to parallel pool with 6 workers.
    

    使用 Constant 对象构建 Composite 对象并在 parfor 循环中使用它。

    xc = parallel.pool.Constant(x);
    parfor idx = 1:10
      s(idx) = sum(xc.Value(:,idx));
    end
    s
    s = 1×10
    103 ×
    
        2.5110    2.5256    2.5060    2.4909    2.5078    2.5187    2.4791    2.4842    2.4926    2.4903
    
    

    提示

    您必须在 MATLAB 客户端会话中使用 parallel.pool.Constant 函数。

    您可以将 Constant 对象与已经运行的并行池或后续并行池一起使用。

    扩展功能

    全部展开

    版本历史记录

    在 R2015b 中推出

    全部展开