Main Content

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

parfeval

在并行池工作进程上运行函数

说明

示例

F = parfeval(fcn,numFcnOut,X1,...,Xm) 安排运行函数 fcn。如果有可用并行池,MATLAB® 将使用并行池运行该函数。否则,它将以串行方式运行该函数。

您可以与没有 Parallel Computing Toolbox™ 的 MATLAB 用户共享使用此语法的并行代码。

MATLAB 以指定的输入参量 X1,…Xm 异步评估每个工作进程上的函数 fcn,并返回 numFcnOut 输出参量。

MATLAB 在函数 fcn 运行完成之前返回 Future 对象 F。您可以使用 fetchOutputs 来检索未来的结果。要停止运行函数 fcn,请使用 cancel 函数。有关期货的更多信息,请参阅 Future

如果并行池打开,MATLAB 将使用该并行池来运行函数 fcn

如果并行池未打开,则行为取决于是否启用了自动池创建。

  • 启用自动池创建 - MATLAB 使用默认集群配置文件启动并行池,然后使用该并行池运行函数 fcn。默认情况下启用自动池创建。

    您可以通过将 parpool 指定给池参量 pool 来手动强制此行为。

  • 自动池创建被禁用 - MATLAB 使用延迟执行来运行函数 fcn

    您可以通过将 parallel.Pool.empty 指定给池参量 pool 来手动强制此行为。

示例

F = parfeval(pool,fcn,numFcnOut,X1,...,Xm) 调度函数 fcn 使用池 pool 运行。当您想要在运行时指定一个池时请使用此语法。

要在后台运行代码,请参阅 MATLAB 函数页面 parfeval

示例

全部折叠

使用 parfeval 请求在工作进程上异步执行某个函数。

向并行池提交单个请求。使用 fetchOutputs 函数检索输出。

f = parfeval(@magic,1,10);
Starting parallel pool (parpool) using the 'Processes' profile ...
Connected to parallel pool with 6 workers.
value = fetchOutputs(f);
value(1)
ans = 92

for 循环中指定多个未来请求,并在结果可用时将其收集到向量中。为了提高效率,请在开始循环之前预先分配一个未来对象数组。

f(1:10) = parallel.FevalFuture;
for idx = 1:10
    f(idx) = parfeval(@magic,1,idx);
end

使用 fetchNext 检索可用的各个未来输出。如果在调用 fetchNextFevalFuture 对象数组中没有可用的元素,则 MATLAB 将等待,直到有元素可用。

magicResults = cell(1,10);
for idx = 1:10
    [completedIdx,value] = fetchNext(f);
    magicResults{completedIdx} = value;
    fprintf("Got result with index: %d.\n",completedIdx)
end
Got result with index: 1.
Got result with index: 2.
Got result with index: 3.
Got result with index: 7.
Got result with index: 8.
Got result with index: 9.
Got result with index: 10.
Got result with index: 4.
Got result with index: 5.
Got result with index: 6.

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

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

使用 parfeval 计算池 myClusterPool 上 1000×1000 矩阵中每列元素的总和。检索结果。

f = parfeval(myClusterPool,@sum,1,rand(1000));
results = fetchOutputs(f)'
results = 1000×1

  509.8296
  483.2762
  505.1542
  479.3408
  489.2463
  512.2336
  495.8580
  499.5442
  487.5374
  491.4364
      ⋮

此示例显示如何在计算完成时更新用户界面。当您使用 parfeval 将计算卸载给工作进程时,工作进程执行计算时所有用户界面都会做出响应。您可以使用 waitbar 来创建一个简单的用户界面。

  • 每次计算完成后使用 afterEach 更新用户界面。

  • 所有计算完成后使用 afterAll 更新用户界面。

使用 waitbar 创建图形手柄,h。当您使用 afterEachafterAll 时,waitbar 函数会更新图形句柄。有关句柄对象的更多信息,请参阅 句柄对象行为

h = waitbar(0,'Waiting...');

使用 parfeval 计算随机矩阵特征值的实部。使用默认首选项,如果尚未创建并行池,parfeval 会自动创建一个。为了提高效率,预先分配一个 Future 对象数组。

f(1:100) = parallel.FevalFuture;
for idx = 1:100
    f(idx) = parfeval(@(n) real(eig(randn(n))),1,5e2); 
end

您可以使用 afterEach 自动对 parfeval 计算的每个结果调用函数。使用 afterEach 来安排另一组未来对象,以在 f 中的每个未来完成后计算每个输出数组中的最大值。

maxFuture = afterEach(f,@max,1);

您可以使用 State 属性来获取期货的状态。定义一个匿名函数,将 h 的分数等待条长度更新为已完成执行的 Future 对象的比例。如果 f 中对应 Future 对象的 State 属性为 "finished",则 updateWaitbar 匿名函数计算元素为 true 的逻辑数组的平均值。

updateWaitbar = @(~) waitbar(mean({f.State} == "finished"),h);

使用 afterEachupdateWaitbarmaxFuture 中的每个未来完成后更新分数等待条长度。所有计算完成后,使用 afterAlldelete 关闭等待栏。

updateWaitbarFutures = afterEach(f,updateWaitbar,0);
afterAll(updateWaitbarFutures,@(~) delete(h),0)

使用 afterAllhistogram 来显示所有期货完成后 maxFuture 中结果的直方图。

showsHistogramFuture = afterAll(maxFuture,@histogram,0);

输入参数

全部折叠

在工作进程上运行的函数,指定为函数句柄。

示例: fcn = @sum

数据类型: function_handle

从函数 fcn 请求的输出参量的数量,指定为非负整数。

numFcnOut 是运行 fcn(X1,...,Xm) 时请求的输出参量的数量。

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

输入参量,指定为以逗号分隔的变量或表达式列表。并行池工作进程将这些参量输入到函数 fcn

池,指定为 parallel.Pool 对象。

示例: parpool("Processes");

示例: backgroundPool;

输出参量

全部折叠

未来,作为 parallel.FevalFuture 对象返回。

扩展功能

版本历史记录

在 R2013b 中推出

全部展开