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 を実行する必要があるのはなぜですか?
  2. このような些細な例に 5 秒のオーバーヘッドが本当に必要なのでしょうか? 特に、Matlab ワーカーが既に起動されていることを考えると?
4

1 に答える 1

4

このDFEVAL関数は、1 つ以上のタスクを含むジョブを特定のスケジューラ (この場合は「ローカル」スケジューラ) に送信するためのラッパーです。「ローカル」スケジューラを使用すると、それぞれの新しいタスクが新しい MATLAB ワーカー セッションで実行されます。そのため、4.5 秒のオーバーヘッドが表示されます。これは、ワーカーを起動し、何をすべきかを考え出し、それを実行してから終了するまでにかかる時間です。

実行中のジョブの数をゼロにする必要がある理由は、ローカル スケジューラが限られた数のワーカーしか実行できないためです。

一般に、PARFORwithMATLABPOOLは よりも使いやすい組み合わせですDFEVAL。また、 を開くMATLABPOOLと、ワーカーが起動されて準備が整っているため、 のオーバーヘッドPARFORははるかに少なくなります (ただし、ループの本体をワーカーに送信する必要があるため、ゼロにはなりません)。

于 2011-08-03T06:41:11.820 に答える