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

Threads & Processus C++ Discussion :

Utiliser MPI dans une bibliotheque


Sujet :

Threads & Processus C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2011
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2011
    Messages : 4
    Par défaut Utiliser MPI dans une bibliotheque
    Bonjour,

    Je suis en stage, et je dois paralléliser un code de calcul avec MPI.
    Le problème que j'ai c'est que le code est constitué d'une partie calcul faite en C++ qui est dans une dll, et d'une partie java qui gère les données et mets à jours certains éléments lors du calcul.
    Avec MPICH2, je peu paralléliser la partie c++ mais pas la partie java et avec MPJ (Message Passing interface for Java) c'est l'inverse.

    Est-il possible de paralléliser seulement la bibliotheque de manière à lancer le code java sur un seul processeur et la partie calcul sur plusieurs?

    Sinon, quelqu'un a peut-être une idée sur une manière de procéder. J'ai essayé de lancer la commande mpiexec avant le code java de manière à avoir plusieurs processeurs en marche, mais la dll ne peut pas être chargé plusieurs fois. Donc au final, un seul processeur charge la partie c++ et donc pas de parallélisme possible.

    Merci pour votre aide,
    Mathieu

  2. #2
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2011
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2011
    Messages : 4
    Par défaut
    J'ai un peu progressé dans mon problème, je pense qu'il faut utiliser une implémentation MPI pour java pour paralléliser la partie java en premier.

    Cependant, la dll ne se charge que sur un seul processeur, et j'ai le message d'erreur suivant pour les autres:

    "java.lang.UnsatisfiedLinkError: Native Library D:\Mathieu\CodeCpp\src\ZomayetEclipse.dll already loaded in another classloader"

    Il semble donc que le programme pense que la bibliothèque est déjà chargée alors que lors de l'appel aux fonctions qu'elle contient, seul le processeur 0 les lance.

    Comment peut-on charger le dll sur tous les processeurs ?

    Merci.

  3. #3
    Membre éclairé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2007
    Messages
    697
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Janvier 2007
    Messages : 697
    Par défaut
    Citation Envoyé par caribou.lf Voir le message
    Je dois paralléliser un code de calcul avec MPI.
    Le problème que j'ai c'est que le code est constitué d'une partie calcul faite en C++ qui est dans une dll, et d'une partie java qui gère les données et mets à jours certains éléments lors du calcul.
    Avec MPICH2, je peu paralléliser la partie c++ mais pas la partie java et avec MPJ (Message Passing interface for Java) c'est l'inverse.
    Lu comme ça (parties en gras) tu as déjà résolu ton problème non ?
    Est-il important de paralléliser la partie Java ? A moins que tu ais besoin de MPI au niveau du Java pour les reduces mais tu dois pouvoir le faire au niveau du C++.

  4. #4
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2011
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2011
    Messages : 4
    Par défaut
    Merci pour ta réponse atha2.

    Oui, c'est vrai que l'utilisation de MPI en C++ ne pose pas de problème lors de la compilation.
    C'est lors de l'exécution que j'ai des difficultés, car il faut lancer l'exécutable mpirun (qui permet de lire le programme par tous les processeurs) avant le programme, donc avant la partie Java. Le code Java se lance ainsi 4 fois (si 4 processeurs) et cela entraine des problèmes de chargement de la dll (qui doit être chargé 4 fois) et d'écriture des données.

    Le mieux serait de pouvoir charger la dll plusieurs fois, mais comme je n'ai pas trouvé de solution pour le faire, j'ai créé 4 dll identiques avec des noms différents et chaque proc en charge une (je sais c'est un peu du bricolage...). C'est pour faire cela que je dois utiliser des routines MPI en Java.
    Le code Java n'a donc pas besoin d'être parallélisé sauf dans le cas ci-dessus.

    De plus, en utilisant ces 4 dll, je dois initialisé MPI (MPI_Init) dans chaque dll , se qui cause encore des erreurs car sensé n'être utilisé qu'une seule fois.

    Je cherche donc:
    -soit un moyen d'utiliser la dll sur chaque processeur;
    -soit une manière d'utiliser la JNI pour lancer MPI_Init dans le code Java.

    Merci,
    Mathieu

  5. #5
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2011
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2011
    Messages : 4
    Par défaut
    Bonjour,

    J'ai trouvé la solution au problème.

    Pour rappel: le but est de paralléliser avec MPI un code de calcul contenant deux langages: Java et C++ .

    Pour cela on peut utiliser n'importe quel implémentation MPI (dans mon cas c'est MPICH2 avec le compilateur mingw donc sous Windows) pour la partie C++.
    Pour le java, il faut utiliser une implémentation MPI avec un wrapper JNI (j'ai utilisé mpiJava). Il permet d'utiliser les fonctions MPI pour le C++ dans le code Java.
    Les deux parties du code utilise donc la même implémentation de MPI ce qui permet de paralléliser les deux comme si l’on avait qu’un seul programme.

    Attention, certaines implémentations MPI pour java sont faites en pure java (tel que MPJExpress ou autres...). Si elles sont très bien pour paralléliser du code Java, mais elles ne fonctionnent pas pour les deux langages car dans ce cas , on aurait deux implémentations MPI différentes et donc des problèmes de compatibilité.

    J'espère que cela aidera quelques personnes.

    PS: Pour le problème de chargement de dll, mpi permet de charger plusieurs fois la même dll car chaque processus à sa propre adresse mémoire.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Utiliser ssh dans une application java
    Par Samanta dans le forum Sécurité
    Réponses: 12
    Dernier message: 28/02/2007, 16h30
  2. Réponses: 23
    Dernier message: 21/02/2007, 12h53
  3. [JNI]récupérer un code c dans une bibliotheque dll
    Par elalia dans le forum Entrée/Sortie
    Réponses: 1
    Dernier message: 29/10/2005, 13h08
  4. Réponses: 1
    Dernier message: 05/10/2005, 14h52
  5. utiliser mysql++ dans une classe
    Par Yevetrovitch dans le forum Bibliothèques
    Réponses: 2
    Dernier message: 11/04/2005, 10h53

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