Est-ce que quelqu'un sait s'il est possible de compiler MPI avec gcc
?. J'ai besoin d'utiliser gcc
, pas mpicc
.
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).
mpicc -compile_info
pour MPICH.
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.
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.
mpicc
utilise déjà gcc
comme backend
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.