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

API standards et tierces Java Discussion :

Parallélisation de code Java sur plusieurs machines


Sujet :

API standards et tierces Java

  1. #1
    Membre éprouvé Avatar de Jester
    Inscrit en
    Septembre 2003
    Messages
    813
    Détails du profil
    Informations forums :
    Inscription : Septembre 2003
    Messages : 813
    Points : 1 058
    Points
    1 058
    Par défaut Parallélisation de code Java sur plusieurs machines
    Bonjour,

    J'ai actuellement un algorithme génétique qui en lance un thread par individu (en clair une opération de quelques minutes). En parallèle il utilise 20 threads, puis il attend la fin des threads, puis il en relance 20, ...

    J'ai à ma disposition un cluster de bi-processeurs. Pour l'instant les 20 threads tournent sur un ordinateur et le facteur de parallélisation est donc de 2. J'aimerai pouvoir envoyer des threads sur d'autres machines du clusters et donc savoir s'il existe des API qui font ça.

    Je me dit qu'il suffirait juste de sérialiser les Threads puis les rouvrir sur une autre machine, l'exécuter le sérialiser le renvoyer à la machine maitre et le désérialiser. Le coût du transfert n'est pas un problème dans mon cas, tout compris chaque thread a besoin de moins de 10Mo de données. Je n'ai pas forcément besoin de reprise sur erreur ou de choses complexes, je cherche plutôt un truc simple.

    J'imagine bien sur que ce n'est pas aussi simple à faire, mais j'espère qu'une telle API existe me permettant littéralement de lui donner un thread et qu'elle l'envoie ailleurs.

    Si jamais vous la connaissez ou avez des API qui ressemblent, n'hésitez pas à poster.

    Merci d'avoir lu et de votre réponse.

  2. #2
    Membre expérimenté
    Avatar de fabszn
    Homme Profil pro
    Développeur Java
    Inscrit en
    Mars 2002
    Messages
    974
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Mars 2002
    Messages : 974
    Points : 1 638
    Points
    1 638
    Par défaut
    Hello,

    Idée 1
    Tu pourrais peut être voir du coté du RMI..
    Tu pourrais invoquer à distance (depuis un serveur central) des traitements reparti sur toutes tes machines.

    Idée 2
    Aussi tu pourrais installer sur chaque machine un petit prog en Java qui écoute et réceptionne tes données pour les traiter et renvoyer le resultat...

    Ca doit être interessant à mettre en place!

    je serai interessé par la solution que tu envisageras, même si ce n'est pas une évoquée ci dessus!
    @+

    Fabszn
    Twitter : @fsznajderman

    N'oubliez pas le bouton
    Comment bien poser ses questions sur le forum


  3. #3
    Membre expert
    Avatar de ®om
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    2 815
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 815
    Points : 3 080
    Points
    3 080
    Par défaut
    Ca n'est pas les threads qu'il faudrait sérialiser (les Threads n'étant pas sérialisables).

    Sinon, une question, pourquoi 20 threads sur ta machine, et non 1 seul (c'est juste pour savoir si c'est volontaire, ou si c'est bien parce qu'il faut 20 threads)?

    Car lancer trop de threads ralenti la vitesse globale (par processeur)...

  4. #4
    Membre éprouvé Avatar de Jester
    Inscrit en
    Septembre 2003
    Messages
    813
    Détails du profil
    Informations forums :
    Inscription : Septembre 2003
    Messages : 813
    Points : 1 058
    Points
    1 058
    Par défaut
    Ok je ne savais pas qu'un Thread n'étais pas sérialisable, il suffit alors d'hériter de Runnable (me semble pas sur du nom).

    En fait les 20 threads c'est par facilité de code (1 par individus). Mais aussi parce que sur le cluster, l'unité de base pour l'allocation des ressources et le thread. Donc avec 20 threads quand les autres en font 2, j'ai 95% de la puissance , ce n'est pas éthiquement grave, je suis sensé être prioritaire sur ce noeud.

    fabszn: je ne dis pas que c'est forcément dur, juste que j'aimerai une API toute faite que de l'écrire et de perdre 2 jours.

  5. #5
    Membre expert
    Avatar de ®om
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    2 815
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 815
    Points : 3 080
    Points
    3 080
    Par défaut
    Citation Envoyé par Jester
    Ok je ne savais pas qu'un Thread n'étais pas sérialisable, il suffit alors d'hériter de Runnable (me semble pas sur du nom).
    Je ne sais pas dans quel but, mais les "actions" (le corps des méthodes) n'est pas sérialisé, c'est juste l'état qui est sérialisé, le corps des méthodes (plus généralement la classe) doit être présente sur la machine qui désérialise.

    Citation Envoyé par Jester
    En fait les 20 threads c'est par facilité de code (1 par individus). Mais aussi parce que sur le cluster, l'unité de base pour l'allocation des ressources et le thread. Donc avec 20 threads quand les autres en font 2, j'ai 95% de la puissance , ce n'est pas éthiquement grave, je suis sensé être prioritaire sur ce noeud.
    Il n'est pas dit que parce que tu lances plus de threads tu aies plus de processeur...

    L'ordonnanceur du processeur essaye de distribuer les ressources entre chaque processus LOURD, et si un processus lourd possède des threads (processus LEGER), ils sont gérés entre eux... Et il y a aussi des priorités sur les processus...[/QUOTE]
    Bref, il vaut mieux éviter, pour les performances, de lancer plein de threads lorsque c'est inutile (le but des threads/processus, c'est de donner l'illusion d'être en multiprocesseur en partageant un seul processeur, c'est pas pour les perfs).

  6. #6
    Membre éprouvé Avatar de Jester
    Inscrit en
    Septembre 2003
    Messages
    813
    Détails du profil
    Informations forums :
    Inscription : Septembre 2003
    Messages : 813
    Points : 1 058
    Points
    1 058
    Par défaut
    En fait sur cette machine si, c'est une ubuntu 64bits, je ne sais pas si le noyau a été recompilé ou pas et donc si c'est l'ordonnanceur par défaut de Linux. En tout cas sur ce linux c'est ainsi.

    D'autant que si le noyau est bien fait, le quantum de temps entre chaque context switch a du être augmenté vu que c'est un serveur. mais effectivement dans un monde parfait je ne devrait faire que 2 threads actifs.

    Pour la parallélisation, j'avais un peu oublié qu'il faut aussi que le code soit sur le serveur, mais ce n'est pas une contrainte trop forte dans mon cas.

  7. #7
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 840
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Information Technologies Specialist (Scientific Computing)
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2005
    Messages : 6 840
    Points : 22 855
    Points
    22 855
    Billets dans le blog
    51
    Par défaut
    Peut-etre pas directement la reponse appropriee mais il existe des logiciel/API/framework qui peuvent s'occuper de la distribution de taches sur des machines libres/non-occupee du reseau. Nottament Condor que l'on utilise ici depuis peu en univers Vanilla (c'est a dire sans linker nos programmes C/C++ avec Condor) et ca marche bien. Il existe egalement un mode Java dans Condor (non-teste pour le moment et donc j'ignore si on peut linker ses progs Java avec - le fait le linker avec Condor permet la creation de points de sauvegarde et leur transfert sur d'autres machines lors que celle ou le prog tourne est a nouveau utilisee. Tandis que dans l'univers Vanilla, celon la configuration, l'execution est juste stoppee et le programme reste en memoire jusqu'a ce que la machine soit a nouveau disponible ou alors il est vide de la memoire et reprend a zero sur une autre machine).

    Tout ca pour dire qu'on peut utiliser Condor pour dispatcher des clients d'executions sur les machines libres du reseau qui peuvent ensuite contacter le serveur Java et recuperer les donnees/threads a lancer localement, etc...
    Merci de penser au tag quand une réponse a été apportée à votre question. Aucune réponse ne sera donnée à des messages privés portant sur des questions d'ordre technique. Les forums sont là pour que vous y postiez publiquement vos problèmes.

    suivez mon blog sur Développez.

    Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the universe trying to produce bigger and better idiots. So far, the universe is winning. ~ Rich Cook

  8. #8
    Membre éprouvé Avatar de Jester
    Inscrit en
    Septembre 2003
    Messages
    813
    Détails du profil
    Informations forums :
    Inscription : Septembre 2003
    Messages : 813
    Points : 1 058
    Points
    1 058
    Par défaut
    Merci je regarderais si j'ai le temps.

  9. #9
    Membre émérite
    Avatar de alexismp
    Homme Profil pro
    Inscrit en
    Janvier 2005
    Messages
    1 503
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 1 503
    Points : 2 777
    Points
    2 777
    Par défaut
    http://www.terracotta.org/ ?
    OpenSource depuis hier...

Discussions similaires

  1. deploiment de code sur plusieurs machines et problème avec une dll
    Par eric1708 dans le forum GTK+ avec C & C++
    Réponses: 7
    Dernier message: 17/12/2013, 08h55
  2. Exécuter un programme java sur plusieurs machine
    Par sinfos dans le forum Langage
    Réponses: 4
    Dernier message: 23/09/2008, 11h14
  3. CORBA sur plusieur machine
    Par ced2004 dans le forum CORBA
    Réponses: 5
    Dernier message: 05/12/2007, 12h28
  4. Executer un code en java sur plusieurs fichiers xml en même temps
    Par med_ellouze dans le forum Format d'échange (XML, JSON...)
    Réponses: 3
    Dernier message: 12/08/2007, 16h33
  5. Script sur plusieur machine avec perl (cluster)
    Par vodevil dans le forum Programmation et administration système
    Réponses: 3
    Dernier message: 27/02/2006, 20h04

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