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

  1. #1
    Nouveau Candidat au Club
    Inscrit en
    Juillet 2010
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Juillet 2010
    Messages : 6
    Points : 1
    Points
    1
    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 chevronné
    Avatar de kmaniche
    Inscrit en
    Janvier 2006
    Messages
    1 717
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 1 717
    Points : 1 884
    Points
    1 884
    Par défaut
    Bonjour,

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

    Les règles Les cours La fonction rechercher

    N'oubliez pas de mettre en et de voter.

    La terre n'est pas un héritage de nos parents, mais un emprunt que nous faisons à nos enfants. La protection de notre environnement est la responsabilité de tous. Ne reculez plus devant l'urgence, agissez !

  3. #3
    Nouveau Candidat au Club
    Inscrit en
    Juillet 2010
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Juillet 2010
    Messages : 6
    Points : 1
    Points
    1
    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 : 36
    Localisation : France

    Informations forums :
    Inscription : Juin 2010
    Messages : 319
    Points : 843
    Points
    843
    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.
    "Donnez un poisson à un Homme, et il mangera un jour. Apprenez-lui à pêcher, et il mangera tous les jours."

  5. #5
    Nouveau Candidat au Club
    Inscrit en
    Juillet 2010
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Juillet 2010
    Messages : 6
    Points : 1
    Points
    1
    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 chevronné
    Avatar de kmaniche
    Inscrit en
    Janvier 2006
    Messages
    1 717
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 1 717
    Points : 1 884
    Points
    1 884
    Par défaut
    un début de réponse :

    Est la solution avec :
    Les règles Les cours La fonction rechercher

    N'oubliez pas de mettre en et de voter.

    La terre n'est pas un héritage de nos parents, mais un emprunt que nous faisons à nos enfants. La protection de notre environnement est la responsabilité de tous. Ne reculez plus devant l'urgence, agissez !

  7. #7
    Nouveau Candidat au Club
    Inscrit en
    Juillet 2010
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Juillet 2010
    Messages : 6
    Points : 1
    Points
    1
    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
    Nouveau Candidat au Club
    Inscrit en
    Juillet 2010
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Juillet 2010
    Messages : 6
    Points : 1
    Points
    1
    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 habitué
    Profil pro
    Inscrit en
    Novembre 2009
    Messages
    134
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2009
    Messages : 134
    Points : 129
    Points
    129
    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
    Au taf : Quad Core/8Go de RAM sous Win Seven 64 - Matlab 2009b 64bit.
    Perso : Core 2 Duo/8Go de RAM Mac OS X 10.6 - Matlab 2009b 64bit

  10. #10
    Nouveau Candidat au Club
    Inscrit en
    Juillet 2010
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Juillet 2010
    Messages : 6
    Points : 1
    Points
    1
    Par défaut
    Merci HAL,

    finalement je ne cherche plus à assigner une tache spécifique à chacun de mes processeurs mais simplement à créer un nouveau thread. Pour ceux que cela intéresse il y a un petit tuto bien pratique sur MathWorks : http://www.mathworks.com/support/sol...lution=1-V3B5T

    S'il on veut faire des choses simple la difficulté est "faible" autrement il ne faut pas avoir peur des crashs de MatLab !

    p.s : le tuto n'est utile que si l'on est sur Windows...

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