Main Content

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

parallel.pool.Constant

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

    说明

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

    创建对象

    使用 parallel.pool.Constant 从数组、函数句柄或复合对象创建 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 对象。

    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
        0.1965    0.8118    0.7953    0.5239    0.4186
        0.3482    0.5745    0.6334    0.1987    0.5588
        0.2405    0.6587    0.4238    0.0736    0.6463
        0.8566    0.5241    0.0332    0.7331    0.9080
    
    

    创建一个具有函数句柄和清理函数的 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;   

    spmd 代码块内的池工作进程上从复合对象构建 Constant 对象。

    使用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.
    

    使用 Composite 对象构建 Constant 对象并在 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 中推出

    全部展开