2011-08-03 8 views
1

J'ai un travail embarrassingly parallèle qui ne nécessite aucune communication entre les travailleurs. J'essaie d'utiliser la fonction dfeval, mais les frais généraux semblent énormes. Pour commencer, j'essaie de lancer l'exemple à partir de la documentation.Matlab dfeval frais généraux

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

L'exécution ultérieure entraîne des durées similaires. Donc mes questions sont:

  1. Pourquoi ai-je besoin d'exécuter matlabpool close force local pour faire passer le nombre à zéro, étant donné que je lance matlabpool open dans une nouvelle instance?
  2. Cinq secondes de surcharge sont-elles vraiment nécessaires pour un exemple si trivial? d'autant plus que les travailleurs de Matlab ont déjà démarré?

Répondre

4

La fonction DFEVAL est un wrapper autour de la présentation d'un travail avec une ou plusieurs tâches à un planificateur donné, dans votre cas, le planificateur « local ». Avec le planificateur 'local', chaque nouvelle tâche s'exécute dans une nouvelle session de travail MATLAB, c'est pourquoi vous voyez le temps système de 4,5 secondes - c'est le temps nécessaire pour lancer le travail, faire ce qu'il faut faire, puis quitter.

La raison pour laquelle le nombre de travaux en cours doit être égal à zéro est que le planificateur local ne peut exécuter qu'un nombre limité de tâches. En général, PARFOR avec MATLABPOOL est une combinaison plus facile à utiliser que DFEVAL. En outre, lorsque vous ouvrez un MATLABPOOL, les travailleurs sont lancés et prêts, de sorte que la surcharge de PARFOR est beaucoup moins (mais pas encore zéro car le corps de la boucle doit être envoyé aux travailleurs).

+0

Merci. Je pensais que les travailleurs étaient déjà ouverts, mais vous avez raison, c'est le lancement des trois travailleurs. Existe-t-il un planificateur qui permet la réutilisation des travailleurs, pour éviter le démarrage et les frais généraux? Je n'ai pas beaucoup d'accélération de la part de parfor car les données de chaque itération sont grandes et l'indexation est irrégulière, c'est pourquoi j'essaie d'utiliser les constructions de niveau inférieur. – MatlabSorter

+1

Oui, le gestionnaire de travaux propre à MathWorks peut réutiliser les travailleurs, tout comme l'intégration avec HPCServer en mode «SOA». Les deux nécessitent des licences MATLAB Distributed Computing Server supplémentaires. – Edric

Questions connexes