1

我有一个令人尴尬的并行工作,不需要工人之间的沟通。我正在尝试使用 dfeval 函数,但开销似乎很大。首先,我正在尝试运行文档中的示例。

>> matlabpool open
Starting matlabpool using the 'local' configuration ... connected to 8 labs.
>> sched = findResource('scheduler','type','local')
sched =
Local Scheduler Information
===========================

                      Type : local
             ClusterOsType : pc
               ClusterSize : 8
              DataLocation : C:\Users\~\AppData\Roaming\MathWorks\MATLAB\local_scheduler_data\R2010a
       HasSharedFilesystem : true

- Assigned Jobs

           Number Pending  : 0
           Number Queued   : 0
           Number Running  : 1
           Number Finished : 8

- Local Specific Properties

         ClusterMatlabRoot : C:\Program Files\MATLAB\R2010a
>> matlabpool close force local
Sending a stop signal to all the labs ... stopped.
Did not find any pre-existing parallel jobs created by matlabpool.

>> sched = findResource('scheduler','type','local')
sched =
Local Scheduler Information
===========================

                      Type : local
             ClusterOsType : pc
               ClusterSize : 8
              DataLocation : C:\Users\~\AppData\Roaming\MathWorks\MATLAB\local_scheduler_data\R2010a
       HasSharedFilesystem : true

- Assigned Jobs

           Number Pending  : 0
           Number Queued   : 0
           Number Running  : 0
           Number Finished : 8

- Local Specific Properties

         ClusterMatlabRoot : C:\Program Files\MATLAB\R2010a
>> tic;y = dfeval(@rand,{1 2 3},'Configuration', 'local');toc
Elapsed time is 4.442944 seconds.

运行后续时间会产生类似的时间。所以我的问题是:

  1. 鉴于我在新实例中运行 matlabpool open,为什么我需要运行 matlabpool close force local 以使 Number Running 为零?
  2. 对于这样一个微不足道的例子,真的需要 5 秒的开销吗?特别是考虑到 Matlab 工作人员已经启动?
4

1 回答 1

4

DFEVAL函数是围绕将具有一个或多个任务的作业提交给给定调度程序的包装器,在您的情况下是“本地”调度程序。使用“本地”调度程序,每个新任务都在一个新的 MATLAB 工作程序会话中运行,这就是为什么您会看到 4.5 秒的开销 - 这是启动工作程序、确定要做什么、执行它然后退出所需的时间。

您需要运行作业数量为零的原因是本地调度程序只能运行有限数量的工作人员。

一般来说,PARFORwithMATLABPOOL是比 . 更容易使用的组合DFEVAL。此外,当您打开 a 时MATLABPOOL,工作人员已启动并准备就绪,因此 的开销PARFOR要少得多(但仍不为零,因为需要将循环的主体发送给工作人员)。

于 2011-08-03T06:41:11.820 回答