# XCode et MPICH



## claw59 (26 Juillet 2006)

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.


----------



## Zeusviper (26 Juillet 2006)

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/

++


----------



## claw59 (26 Juillet 2006)

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.


----------



## claw59 (26 Juillet 2006)

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.


----------



## claw59 (26 Juillet 2006)

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é.

.....

....


----------



## claw59 (26 Juillet 2006)

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é.


----------



## Zeusviper (26 Juillet 2006)

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!


----------



## claw59 (26 Juillet 2006)

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.


----------



## tatouille (27 Juillet 2006)

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 !
> 
> ...



peut etre une redefinition de prototype main

ou alors l'erreur est avant

pour les CFLAGS -I &#224; ajouter -< > edit project settings


----------



## claw59 (27 Juillet 2006)

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


----------



## tatouille (28 Juillet 2006)

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:
> 
> ...



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éé ?


----------



## claw59 (28 Juillet 2006)

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 ??


----------



## tatouille (29 Juillet 2006)

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.
> ...


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


----------



## claw59 (30 Juillet 2006)

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 (30 Juillet 2006)

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:
> 
> ...



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 (30 Juillet 2006)

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.
> ...



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.


----------



## tatouille (30 Juillet 2006)

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
> 
> ...


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


----------



## claw59 (30 Juillet 2006)

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 ??.


----------



## tatouille (30 Juillet 2006)

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:
> 
> ...




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 

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


----------



## claw59 (30 Juillet 2006)

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 !


----------



## claw59 (13 Août 2006)

c'est bon j'ai trouvé tout seul comme un grand ce qui ne vas pas. en fait, il fallait simplement rajouté un lien dans l'éditeur Xcode vers une librairie nommé liblam.dylib qui en fait n'est qu'un alias vers d'autre librairie mais celle-ci référence tous mes symbôles manquants.

j'ai aussi découvert que les NSThread ne sont pas très compatibles avec les threads posix MPI et qu'il faut concevoir un algo mpi comme une petite application indépendante pour ne pas surimbriquer inutilement les NSThread (utilisant les POSIX déjà à sa base) puis les POSIX mpi.

merci de votre aide quand même c'était sympa !!


----------

