IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

MATLAB Discussion :

exécution de deux fonctions simultanément.


Sujet :

MATLAB

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre à l'essai
    Inscrit en
    Juillet 2010
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Juillet 2010
    Messages : 6
    Par défaut exécution de deux fonctions simultanément.
    Bonjour à tous,
    voilà, je souhaite dans une fonction appeler une autre fonction qui sera exécuter en parallèle et ainsi ne pas attendre qu'elle soit terminée pour exécuter de nouvelles lignes sur le premier code.
    J'espère être assez clair, j'ai chercher sur Mathworks, etc... mais rien de bien utiles à part les "parfor".
    Si quelqu'un pouvait détailler comment faire et comment récupérer l'état d'avancement de la seconde fonction ainsi que le résultat dans le premier code.

    Je vous remercie d'avance de l'aide que vous pourrez m'apporter.

  2. #2
    Membre Expert
    Avatar de kmaniche
    Inscrit en
    Janvier 2006
    Messages
    1 717
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 1 717
    Par défaut
    Bonjour,

    Une idée est d'utiliser par exemple une timer !!


  3. #3
    Membre à l'essai
    Inscrit en
    Juillet 2010
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Juillet 2010
    Messages : 6
    Par défaut
    Bonjour Kmaniche et merci de ta réponse,
    j'ai regardé la doc sur les timer object et je ne vois pas comment m'en servir pour exécuter un code en parallèle. La doc stipule que cela "tourne" sur un seul thread donc si je ne me trompe pas le code que je souhaite exécuter en parallèle (et qui est très long) ne fera que s'ajouter au reste du code ?
    Merci de m'éclairer sur les solutions envisageables.

  4. #4
    Membre éclairé
    Homme Profil pro
    Inscrit en
    Juin 2010
    Messages
    319
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Juin 2010
    Messages : 319
    Par défaut
    Bonjour,

    Peut-être qu'une fusion des deux fonctions serait envisageable ? Car si je ne me trompe pas, exécuter deux lignes de codes "en même temps" dans MatLab serait rentrer dans le codage même de MatLab, puisque c'est lui qui gère ça ... et à moins d'avoir un multi-core, c'est souvent augmenter le temps total d'exécution comparé à une exécution classqiue.

    J'aimerai cepandant un point sur le contexte : est-ce pour montrer à l'utilisateur la progression ? Car dans ce cas, un simple "waitbar" à l'intérieur de ta seconde fonction suffit amplement.

  5. #5
    Membre à l'essai
    Inscrit en
    Juillet 2010
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Juillet 2010
    Messages : 6
    Par défaut
    Bonjour Vampirella,

    malheureusement je ne peux pas faire attendre l'utilisateur...
    Mon programme est censé fonctionner sur des Multi coeur donc pour ça il n'y a pas de problème, bien que je pense que si l'on touche au multi-thread sous Matlab, celui-ci est surtout optimisé pour exécuter un même code sur les n (2 pour moi) processeurs, c'est le spmd (single program multi data) si je ne me trompe.
    Une solution serait l'appel asynchrone de ma deuxième fonction, mais je ne trouve vraiment pas comment faire.

  6. #6
    Membre Expert
    Avatar de kmaniche
    Inscrit en
    Janvier 2006
    Messages
    1 717
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 1 717
    Par défaut
    un début de réponse :

    Est la solution avec :

  7. #7
    Membre à l'essai
    Inscrit en
    Juillet 2010
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Juillet 2010
    Messages : 6
    Par défaut
    Merci Kmaniche,
    j'ai regardé la doc et en effet cela semble la méthode pour effectuer ma fonction en parallèle du 1er code.

    Il suffit donc d'initialiser le matlabpool par le code suivant :
    matlabpool open local 2
    le 'local' car je le fait sur ma machine, mais matlab peut aussi partager le travail avec des ordinateurs en réseau...
    le '2' car j'ouvre 2 labs, si j'ai bien compris 1 lab = 1 thread. D'après ce que j'ai lu dans la doc, avoir le même nombre de threads que de coeurs est le plus efficace (j'ai un processeur dualcore donc j'en mets 2).

    Ensuite lorsqu'il y a une partie du code que l'on veut exécuter sur les 2 labs, il faut le mettre entre spmd (pour single program multiple data) et end comme suit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    spmd
    % mon code qui sera effectuer sur chacun des labs
    end %le code ne sera plus effectuer sur les 2 labs
    attention : le code ne sera pas plus rapide en faisant ça mais sera exécuter 2 fois, une fois dans chaque lab. De plus JAVA ne semble pas fonctionner entre le spmd/end, par exemple un imshow fait afficher un message d'erreur.

    Dans mon cas je voulais exécuter deux codes différents sur chacun des labs, j'utilise 'labindex' pour connaître le lab qui exécute mon code.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    spmd
    if(labindex==1)
    %premiercode
    elseif(labindex==2)
    %deuxièmecode
    end
    end
    Le code fonctionne mais il n'y a aucun gain de temps , je continue de triturer mon code pour voir si je peux améliorer tout ça !
    Si vous avez des suggestions je suis preneur et désolé si mon post n'est pas très limpide.

    p.s: j'oubliais : une fois le matlabpool initialisé, on le ferme avec un matlabpool close

  8. #8
    Membre à l'essai
    Inscrit en
    Juillet 2010
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Juillet 2010
    Messages : 6
    Par défaut
    Pour ceux que ça intéresse,

    le code que j'ai posté ci-dessus est optimisé pour scinder un même code sur les n processeurs.

    Moi qui attribuais une fonction à un des processeur et une autre fonction à l'autre, je n'y gagne rien ! Tout simplement parce qu'à la fermeture de mon spmd, le programme attends que les deux fonctions soient terminées.

    A l'origine je cherchais à exécuter un code extrêmement long tout en continuant l'exécution du programme principal.

    Pour ce faire il parait plus efficace de faire appel à un mex-file (en c ou c++) et d'y créer un nouveau thread dédié au code en c ou c++.

    Je posterais le code quand j'aurais réussi à le faire

  9. #9
    Membre éprouvé
    Profil pro
    Inscrit en
    Novembre 2009
    Messages
    134
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2009
    Messages : 134
    Par défaut
    Pour effectuer n travaux distincts sur n cores (en local ou sur des machines en réseau) utilise les commandes de la boîte à outils DCS (réseau) et PCT :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    findResource
    createJob
    createTask

Discussions similaires

  1. Exécution de deux fonctions simultanémment
    Par p1k1 dans le forum VB.NET
    Réponses: 3
    Dernier message: 15/08/2013, 18h22
  2. comment lancer deux fonctions simultanément
    Par typhou dans le forum MATLAB
    Réponses: 1
    Dernier message: 15/09/2010, 17h31
  3. Réponses: 5
    Dernier message: 28/02/2009, 23h10
  4. [AJAX] Deux fonctions simultanées
    Par Topheur dans le forum Général JavaScript
    Réponses: 0
    Dernier message: 17/06/2008, 16h04
  5. Exécution de deux fonction avec ie
    Par musicann dans le forum Général JavaScript
    Réponses: 7
    Dernier message: 15/06/2007, 14h25

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo