Quelques expériences avec MPI

Ça y est, ça marche. J’y suis depuis hier, mais ça marche. Petit compte-rendu de manipes pour faire tourner un programme MPI entre deux machines Linux (apparemment, entre mon Mac et un Linux ça a pas l’air de vouloir. Tant pis).

Primo : écrire un programme MPI. J’ai trouvé çuilà sur le web :

#include "mpi.h" #include <math.h>
int main(argc,argv)      int argc;      char *argv; {   int done = 0, n, myid, numprocs, i, rc; double PI25DT = 3.141592653589793238462643;   double mypi, pi, h, sum, x, a;
  MPI_Init(&argc,&argv);   MPI_Comm_size(MPI_COMM_WORLD,&numprocs);   MPI_Comm_rank(MPI_COMM_WORLD,&myid);   while (!done)    {       if (myid == 0) {         printf("Enter the number of intervals: (0 quits) ");         scanf("%d",&n);       }       MPI_Bcast(&n, 1, MPI_INT, 0, MPI_COMM_WORLD);       if (n == 0) 	break;       h = 1.0 / (double) n;       sum = 0.0;       for (i = myid + 1; i <= n; i += numprocs) {         x = h * ((double)i - 0.5);         sum += 4.0 / (1.0 + x*x);       }       mypi = h * sum;       MPI_Reduce(&mypi, &pi, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD);
      if (myid == 0)         printf("pi is approximately %.16f, Error is %.16f ", pi, fabs(pi - PI25DT));     }   MPI_Finalize(); }

Ça vaut ce que ça vaut, il me fallait juste un petit exemple.

Après avoir installé ce qu’il faut, on compile le bousin :

$ mpicc.mpich -o test3.LINUX test3.c

et on vérifie que ça marche sur un proc :

$ mpirun test3.LINUX Enter the number of intervals: (0 quits) 45 pi is approximately 3.1416338058529365, Error is 0.0000411522631434 Enter the number of intervals: (0 quits) 0 $

Bon. Ensuite, pour que l’exécution se passe correctement entre les deux machines, faut pouvoir s’y connecter. On configure donc l’authentification par clé entre les deux machines (de machine1 vers machine2). Il se trouve que machine1 et machine2 partagent le home par NFS, je ne transfère donc pas la clé (mais normalement, il faut) :

machine1 $ ssh-keygen -q -f ~/.ssh/id_rsa -t rsa

(mettre une passphrase, tout ça)

machine2 $ cat id_rsa.pub >> ~/.ssh/authorized_keys

On vérifie que ça marche :

machine1 $ ssh machine2 Enter passphrase for key '/home/balise/.ssh/id_rsa': machine2 $ exit

Sur ce, on revient à la machine1, on lance ssh-agent :

machine1 $ nohup ssh-agent -s | grep -v echo > ~/.ssh-agent machine1 $ source ~/.ssh-agent Agent pid 3665

On rajoute une paire de trucs dans le profile :

[ -z "$SSH_CLIENT" ] && . $HOME/.ssh-agent alias keyon="ssh-add -t 10800" alias keyoff='ssh-add -D' alias keylist='ssh-add -l'

ce qui permet de lancer keyon, après avoir re-sourcé le profile :

machine1 $ source ~/.bash_profile machine1 $ keyon Enter passphrase for /home/balise/.ssh/id_rsa: Identity added: /home/balise/.ssh/id_rsa (/home/balise/.ssh/id_rsa) Lifetime set to 10800 seconds

On vérifie que tout est OK pour le login avec clé :

machine1 $ ssh machine2 machine2 $ exit

o/.

On édite alors le fichier /usr/lib/mpich/share/machines.LINUX pour y mettre

machine1 machine2

Un petit export de variable :

machine1 $ export P4_RSHCOMMAND=/usr/bin/ssh

et voila :

machine1 $ mpirun -np 2 test3.LINUX Enter the number of intervals: (0 quits) 42 pi is approximately 3.1416398947081130, Error is 0.0000472411183199 Enter the number of intervals: (0 quits) 0

Juste pour vérifier ce qui est effectivement exécuté :

machine1 $ mpirun -np 2 -t test3.LINUX Procgroup file: machine1 0 /home/balise/mpi/test3.LINUX machine2 1 /home/balise/mpi/test3.LINUX "/home/balise/mpi/test3.LINUX"  -p4pg "/home/balise/mpi/PI7009" -p4wd "/home/balise/mpi"

Et voila, on est content, on peut faire la danse de l’ingénieur.

Mac OS X & screen

Je cherche à avoir une config propre pour avoir un irssi quelque part où la machine est pas éteinte… donc, en gros, un irssi dans un screen sur ma bécane au labo.

J’ai deux problèmes à résoudre : l’encodage du bidule (là tous mes accents sont transformés en ?, c’est pas très beau) et faire marcher le backspace.

En ce qui concerne le backspace, ça y est, j’ai trouvé : scp /sw/share/terminfo/x/xterm-color machine-distante:./.terminfo/x/ résoud le problème. Trouvé ça par hasard sur le web ici

Yapukà gérer les accents.

Un ptit bout de XSLT

Supposons que j’ai des fichiers du genre

<chapter id="">   <title></title>   <abstract></abstract>   <sect1 id=""></sect1>   <sect1 id=""></sect1>   ... </chapter>

et que je veuille le séparer en plusieurs petits fichiers indépendants avec :

  • un fichier de chapitre contenant le titre et le résumé
  • un fichier par sect1

Donc, un petit script XSLT qui fait ça très bien (enfin, suffisemment bien pour mes low expectations) :

<?xml version="1.0" encoding="iso-8859-1"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">   <xsl:output method="xml"/>   <xsl:template match="abstract">     <xsl:copy-of select="@*|current()" />   </xsl:template>   <xsl:template match="sect1">     <xsl:variable name="filename">       <xsl:value-of select="concat(@id, '.xml')" />     </xsl:variable>    <xsl:document href="{$filename}">      <xsl:copy-of select="@*|current()" />      </xsl:document>   </xsl:template>
  <xsl:template match="/chapter/title">     <xsl:copy-of select="@*|current()"/>   </xsl:template>   <xsl:template match="/chapter">     <xsl:variable name="chapterfilename">       <xsl:value-of select="concat(@id, '.xml')" />     </xsl:variable>     <xsl:document href="{$chapterfilename}">       <xsl:apply-templates />     </xsl:document>   </xsl:template> </xsl:stylesheet>

Probablement très largement améliorable ; de plus il est nécessaire que les différentes sections aient chacune un attribut id pour pouvoir générer le nom de fichier. Ya probablement moyen de faire plus propre, mais, bon.

Putain de Palm…

J’ai lutté un certain temps, voire un temps certain, à chercher ce qui déconnait pour la synchro de mon Palm. On devrait toujours lire la doc, et de préférence la bonne. Je pensais que le problème venait du mac ou du machin gluant entre le bureau et la chaise – donc je cherchais à résoudre là. En désespoir de cause après une heure de lutte, je vais jeter un oeil à la doc chez Palm, où je lis « Si vous appuyez sur le bouton HotSync et que ça fait rien sur le Mac, commencez par rebooter le Palm ». Je trouve une punaise, je vais piquer le cul du Palm sans trop y croire, j’appuie sur le bouton HotSync, ça marche.

On devrait toujours lire la doc. Toute la doc.

Soupir las…

J’ai mon mac !

Bon, tout est dans le titre, hein.

Le bestiau est arrivé hier, et heu, ça va, lui et moi on s’entend bien. Deux trois soucis pour monter les exports NFS au labo mais on a fini par trouver – des histoires de numéro de porc, rien de bien grave. Dans la série des trucs qui font plaisir : je branche l’écran au labo, je le mets en écran principal, je bosse toute la journée (sisi, j’vous jure !). Ce soir en partant, je me dis « bon allez, pour le fun, je teste ». Je débranche l’écran externe… et là, toutes mes fenêtres et le dock reviennent tout seuls sur l’écran du portable. Grandiose.

Et bon, globalement, c’est vraiment une machine bien foutue. On sent que tout a été pensé pour que les choses se fassent avec le moins de prise de tête possible (à part les exports NFS, mais ça c’est un truc de geek).

Bref, bonheur, tartine, et je regarderai plus jamais une pomme de la même manière.

Virage de cuti

Bon.

J’ai viré ma cuti.

J’ai acheté…

un Mac. Un joli Powerbook 12″ tout mignon. Enfin, je l’ai pas encore, mais je sais qu’il va être tout mignon.

À l’origine, un appareil photo numérique et un câble micro-USB. Branchement sous Linux, lutte pendant 20 minutes, Linux vainqueur par abandon. Branchement sous Windows, lutte pendant 20 minutes, Windows vainqueur par abandon de la batterie du portable. Passage dans le bureau de mon directeur de thèse : « Quelqu’un a un Mac ? » – on branche, la petite fenêtre s’ouvre, 5 minutes j’avais les photos sur mon disque.

Bon, pour être honnête, ça me tentait déjà depuis quelque temps. Quand Mac OS X est sorti, je trouvais ça super de pouvoir (si on voulait, hein !) avoir Office sur un Unix, que l’Unix en question soit joli (ce qui ne gâche rien) – KDE même avec tout l’eye candy « alla Mac », c’est pas pareil, et Gnome non plus – etc. Et puis là j’ai vu le Mac envahir progressivement le labo (jusqu’au bureau de mon directeur de thèse), et je me suis dit qu’il y avait quelque chose.

Le Mac est commandé depuis mercredi.

Aujourd’hui j’ai fait mes premières armes sans filet sur un des Mac Mini du labo – je suis allée voir notre macophile le plus acharné, je lui ai dit (ou plutôt crié, avec ma discrétion habituelle) « CHUIS AMOUREEEEEEEEEEUSE ! ». Le truc qui m’a le plus bluffée je crois, c’est que c’est la première fois que je me retrouve sur un système avec un seul écran et sans bureaux virtuels sans hurler à la mort. Exposé est vraiment un concept formidable.

Bref… Je garde le PC pour geeker, vous inquiétez pas – mais là, j’avoue, j’ai craqué.

Un zouli histogramme avec Gnuplot

Je viens de passer un certain temps (voire, soyons honnêtes, un temps certain), à faire ça :

avec Gnuplot (c’est un PNG ici mais je génère en fait un .eps pour l’intégrer dans LaTeX).

Donc, ci-dessous, le script commenté utilisé :
– Les labels de l’axe horizontal
set xtics ("" 0, "GCC 3.5" 1, "GCC4.0" 2, "GCC 4.1" 3, "ICC 8.1" 4, "GCC 3.5 - optimized" 5, "GCC 4.0 - optimized" 6, "GCC 4.1 - optimized" 7, "ICC 8.1 - optimized" 8, "GCC SIMD" 9, "ICC SIMD" 10, "" 11)
– On tourne les labels de 90°
set xtics rotate by 90
– Sortie EPS
set terminal postscript eps
– Facteur de réduction (0.5 en X, 1 en Y)
set size 0.5,1
– Des belles barres
set style data boxes
– Le nom du fichier de sortie
set output 'paddb_mmx.eps'
– Le nom du fichier de données
plot 'paddb_mmx.dat'

et le fichier paddb_mmx.dat :
0
14.28
13.72
13.60
14.17
6.39
6.73
6.63
4.38
1.48
1.51
0

Assembleur AT&T vs Intel

J’aime pas l’assembleur AT&T. Je trouve ça dur à lire… (question d’habitude, hein) surtout quand on a une belle ref Intel sous les yeux. Malheureusement, par défaut, gcc ET icc sortent de l’assembleur AT&T. ‘Reusement, il ya l’option magique -masm=intel dans gcc qui sort de l’assembleur Intel. C’est mieux :o)