XCode et MPICH

claw59

Membre actif
14 Décembre 2005
119
1
Dunkerque
bonjour,

j'aimerai me mettre doucement, mais surement à la programmation parallèle.
pour se faire, j'ai installer mpich via darwinport:

sudo port install mpich

Le téléchargement, la configuration et l'installation s'est ainsi effectué sans aucun problème.

oui, mais....

à chaque fois que je crée un projet Xcode, il me produit des erreurs du genre:

#include <mpi.h> // mpi.h no such file or directory for this

variable MPI_COMM_WORLD undeclared

j'ai rajouté dans les préférences de Xcode sous l'onglet 'Open Quickly' la localisation des headers, mais aucun changement toujours les mêmes erreurs !!

dans de la documentation MPI, j'ai trouvé que pour lancer un appli MPI, il fallait préciser le nombre de processeur dédié par une commande du style:

mpicc -np 4 exemple.out

comment configurer efficacement Xcode pour faire tourner de simple projet d'apprentissage ???

merci de votre aide.
 
claw59 a dit:
à chaque fois que je crée un projet Xcode, il me produit des erreurs du genre:

#include <mpi.h> // mpi.h no such file or directory for this

variable MPI_COMM_WORLD undeclared
c'est qu'il ne trouve pas le fichier en question puisqu'il n'est probablement pas dans ton includepath par défaut. donc il faudrait l'ajouter a ta variable d'environnement, ou définir un chemin d'accès plus complet.

claw59 a dit:
comment configurer efficacement Xcode pour faire tourner de simple projet d'apprentissage ???
merci de votre aide.
Xcode n'est à mon gout pas du tout pensé pour une programmation parallèle. du moins la version que nous pouvons avoir.
je te conseillerai de passer par le terminal d'abord.

http://www.sdsc.edu/~tkaiser/mac_stuff/mpi_osx.html
http://hpc.sourceforge.net/

++
 
j'ai rajouté sous l'onglet 'build' dans 'header search path' la localistation de mpi et là effectivement ca fonctionne mais, parce qu'il existe toujours un mais,

j'ai désormais droit à une nouvelle erreur !

impossible de finir le build, il me met:

gcc exit with code 1
multiple definition of symbol _main

si je comprends bien il existerai plusieurs section main{...} ???
le problème, c'est que j'en ai seulement 1 seul !
et impossible de lancer le mode debug, il coince sur la même erreur !!

alors bug ou ignorance de ma part ??

merci.
 
A moins bien sur,.....

qu'il ne faudrait utiliser MPI (lancer un algorithme de calcul) sous Xcode seulement à partir

d'un 'thread' de départ pour ne être géner avec le bloc 'Main{....' qui serait reproduit pour n processeur à partir d'une seule application.

c'est une hypothèse de travail que je vérifierai.
 
ndlr:

En tout cas cette méthode aurai l'avantage de faciliter le débobage puisque l'on isolerai l'étude de MPI des threads connus et ceux de l'application d'un autre côté.

.....

....
 
et puis ma motivation réelle à persévérer d'utiliser XCode au lieu du terminal pour faire de la programmation parallèle, c'est qu'Xcode n'est qu'un 'Front End' pour GCC, et dans les documentations MPI, on lit facilement que l'on peut désigner par défaut quel compilateur utiliser 'mpicc ou fortran ou gcc etc...'.

c'est juste une question de convivialité.
 
je dis pas le contraire Xcode est convivial et tt joli mais perso je trouve que quand on découvre qqc c mieux de comprendre au moins a peu près comment ca marche en ligne de commande. ca permet de mieux comprendre ce que va faire xcode ou de repérer trés facilement des erreurs betes.

pour moi l'inconvénient est que xcode n'est pas des plus pratiques lorsque on veut passer des paramètres aux librairies à l'execution.

mais donc deja tu as cet article qui explique pas mal de choses : http://developer.apple.com/hardwaredrivers/hpc/mpionmacosx.html

sinon oui si il te dit qu'il trouve plusieurs objet main c'est qu'il truve plusieurs fonctions main!

il ne faudrait utiliser MPI sous Xcode seulement à partir
d'un 'thread' de départ pour ne être géner avec le bloc 'Main{....' qui serait reproduit pour n processeur à partir d'une seule application.

pour moi il y a forcément un thread de départ, (provoqué par le bloc main) qui va pouvoir alors se dupliquer pour créer de nouveau thread donc je comprends pas bien..

il faudrait voir des extraits de code pour comprendre si pb il y a.

PS : tu peux éditer tes messages plutot qu'en créer un nouveau à chaque fois!;)
 
A mons avis la duplication des processus incluant la fonction main{..} est du à l'utilisation de :

ierror=MPI_Comm_rank(MPI_COMM_WORLD,&&idproc);

par défaut 'MPI_COMM_WORLD' définit un 'communicator' qui est la représentation de 7 processus.
 
claw59 a dit:
j'ai rajout&#233; sous l'onglet 'build' dans 'header search path' la localistation de mpi et l&#224; effectivement ca fonctionne mais, parce qu'il existe toujours un mais,

j'ai d&#233;sormais droit &#224; une nouvelle erreur !

impossible de finir le build, il me met:

gcc exit with code 1
multiple definition of symbol _main

si je comprends bien il existerai plusieurs section main{...} ???
le probl&#232;me, c'est que j'en ai seulement 1 seul !
et impossible de lancer le mode debug, il coince sur la m&#234;me erreur !!

alors bug ou ignorance de ma part ??

merci.

peut etre une redefinition de prototype main

ou alors l'erreur est avant

pour les CFLAGS -I &#224; ajouter -< > edit project settings
 
en fait j'ai lancé récemment la méthode à partir d'un NSThread, et là je n'ai plus eu ce genre de problème. en utilisant le débogage, l'initialisation s'est fait correctement y compris le nombre de processus engendré.

par contre, j'ai obtenu une nouvelle erreur:

symbol not found :_kyo
expected in flat namespace.


apparemment ma librairie n'est pas tout à fait compatible avec mon 10.4.7

je vais donc essayé plus tard avec une autre librairie MPI

ps:

MPI_COMM_WORLD consiste à créé 7 processus indépendant par défaut
MPI_COMM_SELF consiste à utiliser seulement le processus en cours d'utiilisation

si j'ai bien compris
 
claw59 a dit:
en fait j'ai lancé récemment la méthode à partir d'un NSThread, et là je n'ai plus eu ce genre de problème. en utilisant le débogage, l'initialisation s'est fait correctement y compris le nombre de processus engendré.

par contre, j'ai obtenu une nouvelle erreur:

symbol not found :_kyo
expected in flat namespace.


apparemment ma librairie n'est pas tout à fait compatible avec mon 10.4.7

je vais donc essayé plus tard avec une autre librairie MPI

ps:

MPI_COMM_WORLD consiste à créé 7 processus indépendant par défaut
MPI_COMM_SELF consiste à utiliser seulement le processus en cours d'utiilisation

si j'ai bien compris

pthread ?

_kyo c'est à toi ?

grep -R kyo /path/2/src

?

peut etre une librairie qui n'est pas liée
ou un objet non créé ?
 
message obtenu au d&#233;bogage:

No symbol table is loaded. Use the "file" command.
No symbol table is loaded. Use the "file" command.

tty /dev/ttyp2
Program loaded.
run
[Switching to process 274 local thread 0xf03]
Running&#8230;
Program received signal: "SIGTRAP".
dyld: Symbol not found: __kio
Referenced from: /usr/local/lib/libmpi.0.dylib
Expected in: flat namespace

question toute b&#234;te, comment fais t on pour charger les symb&#244;les d'une librairie sous Xcode ??
 
claw59 a dit:
message obtenu au d&#233;bogage:

No symbol table is loaded. Use the "file" command.
No symbol table is loaded. Use the "file" command.

tty /dev/ttyp2
Program loaded.
run
[Switching to process 274 local thread 0xf03]
Running&#8230;
Program received signal: "SIGTRAP".
dyld: Symbol not found: __kio
Referenced from: /usr/local/lib/libmpi.0.dylib
Expected in: flat namespace

question toute b&#234;te, comment fais t on pour charger les symb&#244;les d'une librairie sous Xcode ??
essaye de bind_at_load au lieu d'ecraser le namespace ( c'est une priouette assez crado
( c'&#233;tait bien pour 10.2) et c'est souvant utilis&#233; &#224; tort par plein de projet )

tu as utilis&#233; un pkg lam/mpi ou as tu compil&#233; toi meme la lib
car le linkeur se plaint de ne pas trouv&#233; ce symbol
Referenced from: /usr/local/lib/libmpi.0.dylib
dans l'espace de nom &#233;cras&#233; car il n' y est probablement pas

nm /usr/local/lib/libmpi.0.dylib | grep kio ?
cela donne quoi ?

man nm
 
en fait au d&#233;part j'avais install&#233; mpich mais j'ai eu un probl&#232;me &#224; l'installation durant ./configure donc je l'ai enlev&#233;, puis j'ai trouv&#233; sur internet le site lan-mpi qui consacre un package sp&#233;cial pour tiger, je l'ai donc install&#233;.

ta commande sous terminal a provoqu&#233; la r&#233;ponse suivante:

U __kio
U __kio
U __kio
U __kio
U __kio
U __kio
U __kio
U __kio
U __kio
U __kio
U __kio
U __kio
U __kio
U __kio
U __kio
U __kio
U __kio

et encore j'ai raccourci la quantit&#233; !

un d&#233;tail int&#233;ressant, si je relance ta commande sans le grep:

000016d8 T _MPI_Accumulate
U ___error
U _lam_err_comm
U _lam_err_win
U _lam_errfunc
U _lam_initerr
U _lam_mpi_comm_world
U _lam_osd_fillheader
U _lam_osd_push
U _lam_osd_send
U _lam_osdhdr_type
U _lam_resetfunc
U _lam_setfunc
U _malloc
u dyld_stub_binding_helper

/usr/local/lib/libmpi.0.dylib(address.o):
0000192c T _MPI_Address
U _lam_errfunc
U _lam_initerr
U _lam_mkerr
U _lam_mpi_comm_world
U _lam_resetfunc
U _lam_setfunc

etc.....
etc ....

donc il s'est effectivement pass&#233; quelque chose, peut &#234;tre que le package que j'ai install&#233; ne s'est pas fait correctement ou que l'ancienne version que j'avais (MPICH) ne s'est pas compl&#233;tement d&#233;sinstall&#233;, un truc dans le genre &#224; mon avis...... ou alors c'est parce que c'est une librairie qui ne contient aucun symb&#244;le externe &#224; des fins de d&#233;bogage.

int&#233;ressant comme commande 'nm'.merci.
 
claw59 a dit:
en fait au départ j'avais installé mpich mais j'ai eu un problème à l'installation durant ./configure donc je l'ai enlevé, puis j'ai trouvé sur internet le site lan-mpi qui consacre un package spécial pour tiger, je l'ai donc installé.

ta commande sous terminal a provoqué la réponse suivante:

U __kio
U __kio
U __kio
U __kio
U __kio
U __kio
U __kio
U __kio
U __kio
U __kio
U __kio
U __kio
U __kio
U __kio
U __kio
U __kio
U __kio

et encore j'ai raccourci la quantité !

un détail intéressant, si je relance ta commande sans le grep:

000016d8 T _MPI_Accumulate
U ___error
U _lam_err_comm
U _lam_err_win
U _lam_errfunc
U _lam_initerr
U _lam_mpi_comm_world
U _lam_osd_fillheader
U _lam_osd_push
U _lam_osd_send
U _lam_osdhdr_type
U _lam_resetfunc
U _lam_setfunc
U _malloc
u dyld_stub_binding_helper

/usr/local/lib/libmpi.0.dylib(address.o):
0000192c T _MPI_Address
U _lam_errfunc
U _lam_initerr
U _lam_mkerr
U _lam_mpi_comm_world
U _lam_resetfunc
U _lam_setfunc

etc.....
etc ....

donc il s'est effectivement passé quelque chose, peut être que le package que j'ai installé ne s'est pas fait correctement ou que l'ancienne version que j'avais (MPICH) ne s'est pas complétement désinstallé, un truc dans le genre à mon avis...... ou alors c'est parce que c'est une librairie qui ne contient aucun symbôle externe à des fins de débogage.

intéressant comme commande 'nm'.merci.

sur le site en question: lam-mpi.org
je viens de me rendre compte de ceci:

The OS X Developer Tools are requied for using LAM. They are available free of charge from the Apple Developers site. The Developer Tools do not include a Fortran compiler, so you will either have to provide a Fortran compiler or build LAM with the --without-fc option to configure.

a tout les coups l'installation a été foireuse parce que je n'ai pas de compilateur fortran
et que je n'ai pas lu en détail le site avant de lancer le package.
quoique le package aurait du le détecter ??

maybe.
 
claw59 a dit:
sur le site en question: lam-mpi.org
je viens de me rendre compte de ceci:

The OS X Developer Tools are requied for using LAM. They are available free of charge from the Apple Developers site. The Developer Tools do not include a Fortran compiler, so you will either have to provide a Fortran compiler or build LAM with the --without-fc option to configure.

a tout les coups l'installation a été foireuse parce que je n'ai pas de compilateur fortran
et que je n'ai pas lu en détail le site avant de lancer le package.
quoique le package aurait du le détecter ??

maybe.

en consultant ce genre d'erreur sur internet, je me suis rendu compte que ce n'est pas le seul cas:

exemple: trouver ici

SQL> connect / as sysdba;
dyld: Symbol not found: _kumain_globals
Referenced from: /g_opt/oracle/lib/libcommon9.dylib
Expected in: flat namespace

apparemment, il existerai un problème récurrent entre gcc et les symbols d'exportations.
 
claw59 a dit:
en consultant ce genre d'erreur sur internet, je me suis rendu compte que ce n'est pas le seul cas:

exemple: trouver ici

SQL> connect / as sysdba;
dyld: Symbol not found: _kumain_globals
Referenced from: /g_opt/oracle/lib/libcommon9.dylib
Expected in: flat namespace

apparemment, il existerai un probl&#232;me r&#233;current entre gcc et les symbols d'exportations.
il ya une option pour exporter les symboles priv&#233;es

exemple :
export-all-symbols

ouvre man gcc c'est un probleme de drapeaux pass&#233;s au compilateur
et certainement que lam est compil&#233; avec un -flat namespace
qui n'est peut etre pas justifi&#233; car l'api libc/ld depuis la version Darwin 7.6
a completement &#233;t&#233; revue

pour le flag --without-fc
je pense que le script de configure a fait son travail sinon cela ne serait pas passer

freepascal ou gnupascal c'est pas le top
mais si tu as absolument besoin d'un compilo pascal
prefere freepascal

mais bon --without-fc est tres bien
 
bien, revue de d&#233;tail de la journ&#233;e :

j'ai exp&#233;riment&#233; l'outil de commande 'nm' sous le terminal, en particulier par:

nm -o *.dylib | grep "T kio"
nm -o *.dylib | grep "T _MPI"

l'&#233;tude de ces r&#233;sultats m'on permis de trouver que dans les sources &#224; compiler de lam-mpi dans le dossier 'share/include', il existe un fichier de d&#233;claration 'kio.h" r&#233;f&#233;ren&#231;ant les symb&#244;le manquants [define template and constant for the kernel input output block]. J'en conclu que le probl&#232;me vient d'abord d'un probl&#232;me de construction probablement durant ./configure

aussi, ai-je r&#233;ussi &#224; r&#233;installer plusieurs configurations diff&#233;rentes dont la derni&#232;re:
./configure --disable-share -enable-static --disable-tv-queue --without-fc --without-romio

en fait, je me suis rendu compte que lam-mpi poss&#232;de des librairies dynamiques qui ne font que r&#233;f&#233;renc&#233; des librairies statiques .a (surement un moyen pour eux d'impl&#233;menter plus facilement diff&#233;rentes plates-formes entre linux et mac osx).

L'option 'all symbol export" ne produit pas de solution.

pour l'instant j'ai toujours le m&#234;me probl&#232;me, n&#233;anmoins sur des pages apple, j'ai trouv&#233; que la premi&#232;re cause des probl&#232;mes de liens sont d&#251;es &#224;:

extern int x;
extern void someFunction(void);

ce code est compil&#233; dans une librairie, mais 'extern' pr&#233;cise bien qu'elles sont impl&#233;ment&#233;s ailleurs mais ne dit pas o&#249; donc il existe en suite une erreur au d&#233;bogage.

donc le probl&#232;me de lam-mpi que je poss&#232;de c'est que j'utilise une librairie qui r&#233;f&#233;rence en interne d'autre librairies mais ne pr&#233;cise pas o&#249; elles sont situ&#233;s.

&#224; d&#233;faut de trouver une solution, j'aurai n&#233;anmoins r&#233;ussi &#224; appronfondir mes connaissances en probl&#232;me de d&#233;bogage et c'est d&#233;j&#224; cela de pris.

ps: si j'ai bien compris la lecture en anglais des sites am&#233;ricains, le 'flat namespace', c'est l'ensemble des symb&#244;les utilis&#233; dans un support physique comme une librairie mais dont la d&#233;claration et l'impl&#233;mentation sont situ&#233;s ailleurs (d'o&#249; leur aspect 'flat').

par contre, j'aurai voulu d&#233;sinstaller lam-mpi pour faire une clean install d'autre comme open-mpi, mais impossible de lancer un 'make uninstall'. existe-il un moyen de le d&#233;sinstaller ??.
 
claw59 a dit:
bien, revue de détail de la journée :

j'ai expérimenté l'outil de commande 'nm' sous le terminal, en particulier par:

nm -o *.dylib | grep "T kio"
nm -o *.dylib | grep "T _MPI"

l'étude de ces résultats m'on permis de trouver que dans les sources à compiler de lam-mpi dans le dossier 'share/include', il existe un fichier de déclaration 'kio.h" référençant les symbôle manquants [define template and constant for the kernel input output block]. J'en conclu que le problème vient d'abord d'un problème de construction probablement durant ./configure

aussi, ai-je réussi à réinstaller plusieurs configurations différentes dont la dernière:
./configure --disable-share -enable-static --disable-tv-queue --without-fc --without-romio

en fait, je me suis rendu compte que lam-mpi possède des librairies dynamiques qui ne font que référencé des librairies statiques .a (surement un moyen pour eux d'implémenter plus facilement différentes plates-formes entre linux et mac osx).

L'option 'all symbol export" ne produit pas de solution.

pour l'instant j'ai toujours le même problème, néanmoins sur des pages apple, j'ai trouvé que la première cause des problèmes de liens sont dûes à:

extern int x;
extern void someFunction(void);

ce code est compilé dans une librairie, mais 'extern' précise bien qu'elles sont implémentés ailleurs mais ne dit pas où donc il existe en suite une erreur au débogage.

donc le problème de lam-mpi que je possède c'est que j'utilise une librairie qui référence en interne d'autre librairies mais ne précise pas où elles sont situés.

à défaut de trouver une solution, j'aurai néanmoins réussi à appronfondir mes connaissances en problème de débogage et c'est déjà cela de pris.

ps: si j'ai bien compris la lecture en anglais des sites américains, le 'flat namespace', c'est l'ensemble des symbôles utilisé dans un support physique comme une librairie mais dont la déclaration et l'implémentation sont situés ailleurs (d'où leur aspect 'flat').

par contre, j'aurai voulu désinstaller lam-mpi pour faire une clean install d'autre comme open-mpi, mais impossible de lancer un 'make uninstall'. existe-il un moyen de le désinstaller ??.


un moyen de désinstaller : à la main

retelecharge le pkg explore le pkg

extrait le .pax sur ton ton bureau et regarde l'arbo
tu peux faire un petit script pour ce que je trouve dans le dossier sur le bureau
remove du /usr/local

en fait, je me suis rendu compte que lam-mpi possède des librairies dynamiques qui ne font que référencé des librairies statiques .a :siffle:

un dylib contient des objets repositionnables et une archive non mais rien ne t'empeche de "storer"
des objets reposionnables dans une archive (ar -x) pour en faire un objet dynamic par la suite

man ar
man xxd

c'est dur de savoir sans ton prog mais tu devrais poser quelques snipsets de ton prog sur leur list
et bien expliquer ce que tu fais je pense que cela parlera au dev si un symbol est referencé ? pourqui passerait - il a la trappe ?


essaye de compiler avec gcc-3.3 pour voir















 
mon programme est r&#233;ellement idiomatique:

int error,nproc, idproc;

error=MPI_Init(&argc,&argv);

error=MPI_Comm_size(MPI_COMM_SELF,&nproc);

error=MPI_Comm_rank(MPI_COMM_SELF,&idproc);


error=MPI_Finalize();


Soit dans une boucle main, soit dans un thread lanc&#233; depuis une application cocoa. au d&#233;part je voulais cr&#233;er un petit algo sympa bas&#233; sur des 'send/receive', mais je plante sur cet erreur au d&#233;bogage: __kio undefined symbol.

en fait, je suis un gros newbie en programmation avanc&#233;. je cherche &#224; conna&#238;tre plus en profondeur la programmation. et puis la prog parall&#232;le, c'est un de mes r&#234;ves de gosse. alors forc&#233;ment....

cela dit, rien qu'avec ce petit bout de code, j'ai d&#233;j&#224; appris beaucoup de chose en mati&#232;re de d&#233;bogage. ma prochaine &#233;tape sera d'exploiter 'send/receive' sur une liste de process mpi a condition que j'arrive &#224; utiliser correctement l'installation.

autre d&#233;tail:

nm /usr/local/lib/liblam.a | grep "S __kio"

donne la s&#233;quence:
liblam.a:clientio.o:000004f8 C __kio

ce qui devrait signifi&#233; : common symbol defined anywhere referenced as undefined symbol. et d'apr&#232;s man ld , on trouve que les 'common symbol' sont en r&#233;alit&#233; des symbol non initialis&#233;.

si j'arrive &#224; me positionner &#224; l'adressage du segment 000004f8 dans mon d&#233;bogeur, je risque de pouvoir identifier la structure qui n'a pas &#233;t&#233; initialis&#233; !! (il manque peut &#234;tre un NULL, qui sait ??).

enfin, si j'arrive &#224; trouver comment on fait !