web-dev-qa-db-fra.com

Comment compiler MPI avec gcc?

Est-ce que quelqu'un sait s'il est possible de compiler MPI avec gcc?. J'ai besoin d'utiliser gcc, pas mpicc.

22
user1260391

mpicc n'est qu'un wrapper autour d'un certain ensemble de compilateurs. La plupart des implémentations ont leurs wrappers mpicc qui comprennent une option spéciale comme -showme (Ouvrir MPI) ou -show (Open MPI, MPICH et dérivés) qui donne la liste complète des options que le wrapper transmet au compilateur backend.

Par exemple, dans Open MPI, les wrappers sont des programmes C++ qui lisent des fichiers de configuration en texte brut et créent des options de ligne de commande qui sont ensuite transmises au compilateur. mpicc -showme affiche la liste complète de ces options:

$ mpicc -showme
icc
-I/opt/MPI/openmpi-1.5.3/linux/intel/include
-I/opt/MPI/openmpi-1.5.3/linux/intel/include/openmpi
-fexceptions
-pthread
-I/opt/MPI/openmpi-1.5.3/linux/intel/lib
-Wl,-rpath,/opt/MPI/openmpi-1.5.3/linux/intel/lib
-I/opt/MPI/openmpi-1.5.3/linux/intel/lib
-L/opt/MPI/openmpi-1.5.3/linux/intel/lib
-lmpi
-ldl
-Wl,--export-dynamic
-lnsl
-lutil

(c'est vraiment une seule ligne que j'ai divisée ici pour améliorer la lisibilité)

Dans ce cas particulier, le compilateur Intel C icc est utilisé comme compilateur principal, mais nous avons également des variantes qui utilisent GCC. Vous pouvez également obtenir la liste des options nécessaires à la phase de compilation (généralement appelées CFLAGS) avec mpicc -showme:compile:

$ mpicc -showme:compile
-I/opt/MPI/openmpi-1.5.3/linux/intel/include
-I/opt/MPI/openmpi-1.5.3/linux/intel/include/openmpi
-fexceptions
-pthread
-I/opt/MPI/openmpi-1.5.3/linux/intel/lib

ainsi que la liste des options que vous devez passer à l'éditeur de liens (connue sous le nom de LDFLAGS) avec mpicc -showme:link:

$ mpicc -showme:link
-fexceptions
-pthread
-I/opt/MPI/openmpi-1.5.3/linux/intel/lib
-Wl,-rpath,/opt/MPI/openmpi-1.5.3/linux/intel/lib
-I/opt/MPI/openmpi-1.5.3/linux/intel/lib
-L/opt/MPI/openmpi-1.5.3/linux/intel/lib
-lmpi
-ldl
-Wl,--export-dynamic
-lnsl
-lutil

Ceux-ci pourraient être utilisés, par exemple dans un Makefile, comme ceci:

...
CFLAGS += $(Shell mpicc -showme:compile)
LDFLAGS += $(Shell mpicc -showme:link)
...

Pour autant que je sache -showme:compile et -showme:link sont spécifiques à Open MPI et les autres implémentations ne donnent la liste complète des options que lorsqu'elles sont appelées avec -show.

Je pense toujours qu'il vaut mieux utiliser mpicc directement parce que s'il arrive que quelque chose dans la configuration MPI soit modifié, il sera immédiatement reflété dans le wrapper pendant que vous devrez changer votre script de génération/Makefile manuellement (sauf si vous utilisez -showme:compile et -showme:link pour obtenir automatiquement les options).

26
Hristo Iliev

mpicc -compile_info pour MPICH.

4
Kadir

Oui, vous pouvez réellement utiliser gcc. Mais dans mon cas (sur Ubuntu) mpicc n'est qu'un wrapper de gcc, voici la sortie de la commande mpicc -showme:

gcc -I/usr/lib/openmpi/include/openmpi/opal/mca/event/libevent2021/libevent -I/usr/lib/openmpi/include/openmpi/opal/mca/event/libevent2021/libevent/include -I/usr/lib/openmpi/include -I/usr/lib/openmpi/include/openmpi -pthread -Wl,-rpath -Wl,/usr/lib/openmpi/lib -Wl,--enable-new-dtags -L/usr/lib/openmpi/lib -lmpi

En Ouvrir MPI docs :

L'équipe Open MPI recommande fortement d'utiliser simplement les compilateurs "wrapper" d'Open MPI pour compiler vos applications MPI. Autrement dit, au lieu d'utiliser (par exemple) gcc pour compiler votre programme, utilisez mpicc.

Nous répétons la déclaration ci-dessus: l'équipe Open MPI recommande fortement d'utiliser les compilateurs wrapper pour compiler et lier les applications MPI. Si vous vous retrouvez en train de dire ", Mais je ne veux pas utiliser de compilateurs de wrapper! ", S'il vous plaît, humourez-nous et essayez-les. Voyez s'ils fonctionnent pour vous. Assurez-vous de nous le faire savoir s'ils ne fonctionnent pas pour vous. Beaucoup de gens basent leurs" compilateurs de wrapper sucent! "mentalité sur les mauvais comportements des compilateurs de wrapper mal implémentés au milieu des années 1990. Les choses sont bien meilleures de nos jours; les compilateurs de wrapper peuvent gérer presque toutes les situations et sont beaucoup plus fiables que vous essayez de coder en dur le compilateur Open MPI spécifique et les indicateurs de l'éditeur de liens manuellement. Cela étant dit, il existe des situations - très, très peu - où l'utilisation de compilateurs wrapper peut être problématique - comme l'imbrication de plusieurs compilateurs wrapper de plusieurs projets. Par conséquent, Open MPI fournit une solution de contournement pour déterminer les indicateurs de ligne de commande dont vous avez besoin pour compiler les applications MPI.

Ici, cette réponse vous est utile.

3
Kehe CAI

Pour MPICH, selon les pages de manuel mpicc, mpicc -compile_info affiche les indicateurs de compilation d'un programme, et mpicc -link_info montre les drapeaux pour lier un programme.

0
Wey Dong

mpicc utilise déjà gcc comme backend

0
none

Oui, vous pouvez certainement compiler un programme MPI sans la commodité du wrapper mpicc. Sur la plupart des implémentations mpicc est un script Shell (ou similaire) qui définit variables d'environnement, recherche et relie diverses bibliothèques, toutes sortes de choses que vous pourriez autrement mettre dans un Makefile.

Je vous suggère de trouver une instance du script mpicc et de la déconstruire.

0