Partenaires

CNRS
IN2P3
Sorbonne Universite
Universite de Paris
Initiative Physique des Infinis
UPMC


Rechercher

Sur ce site


Accueil > Le LPNHE > Pages du personnel permanent > Beau Tristan > Divers > Vielleries > makefile pour ferme hétérogène de calcul (tel qu’au ccin2p3)

makefile pour ferme hétérogène de calcul (tel qu’au ccin2p3)

18 octobre 2005

par Tristan Beau - 7 juin 2017

Anastasie au ccin2p3 constitue une ferme de machines issues de constructeurs différents. Les compilateurs et bien sûr les binaires que chaque machine peut interpréter sont distincts. Plutôt que de recompiler, à la main, à chaque fois que l’on se trouve sur une nouvelle plateforme, il y a des méthodes efficaces pour travailler, autres que de rester attaché sans raison à un seul type de machine.

Créer les répertoires bin et obj

Vous devez tout d’abord créer (ou vérifier que tout est OK) des répertoires où seront logés vous fichiers binaires, objet ou librairies pour chaque machine.

On effectue cette opération en créant les répertoire :

Puis on crée un lien automatique (en fonction de la machine sur laquelle on se trouve) vers le bon répertoire :

Il est pratique de créer ces répertoires non dans le $HOME mais plutôt dans son répertoire de travail, ce qui évite d’avoir des 100aines de binaires dans un unique répertoire. Désormais, je suppose que l’on se place dans un répertoire de travail disposant de ses répertoires et liens correctement configurés.

Une remarque. Dans le cas de l’apparition d’un nouveau cluster, ce fut le cas il y a peu avec ccali61, ces répertoires ne seront pas créés automatiquement bien sûr ; vous devrez effectuer l’opération seuls. Pour connaître le nom du nouveau système et créer correctement les nouveaux répertoires, lancer

qui renverra le nom correct du système (attention, ne confondez pas avec la commande sys seule qui ne fonctionne pas correctement dans ce cadre !).

Le makefile générique

Je suppose également que vous placez vos sources dans votre répertoire de travail. Dans ce répertoire, je trouve pratique de ne posséder qu’une seule source possédant un main(). Le makefile que je propose cherche alors toutes les sources, les compile et place les objets dans obj, puis link le tout dans bin. Si vous effectuez une compilation sous chaque cluster, vous trouverez dans bin, quelque soit la machine, le bon exécutable.

Voici donc mon makefile (utilisez gmake), orienté C (pour du fortran, le compilateur au CCIN2P3 est simplement fort pour tout le monde).
Bien sûr cette écriture de makefile permet de placer des options spécifiques pour chaque plateforme, et ça c’est un peu le travail de chacun ! Quoi qu’il en soit, pour une source basique, ce makefile fonctionne parfaitement et définit des macros (option -D) spécifiques à chaque machine afin, dans le code C, de pouvoir par exemple identifier quelle est la machine destination (commande au préprocesseur #define CPP_PREDEFINES puis commandes du type #ifdef LINUX_SYSTEM... par exemple). Dernier point de détail, dans les makefile qui suivent - je vous invite à les essayer - les tabulations après les commandes suivies de ’ :’ ont disparu ; replacez les correctement sinon gmake ne sera pas content.

Makefile pour ROOT

Pour le cas de ROOT, on voit une belle application de l’aspect général du makefile précédent. Voyez plutôt :

Facebook
Enregistrer au format PDF