mpirun - ¿Cómo compilar MPI con gcc?
compile mpi c program (5)
¿Alguien sabe si es posible compilar MPI con gcc
? Necesito usar gcc
, no mpicc
.
Sí, ciertamente puede compilar un programa MPI sin la conveniencia del envoltorio mpicc
. En la mayoría de las implementaciones, mpicc
es un script de shell (o similar) que configura las variables de entorno, encuentra y vincula varias bibliotecas, todo el tipo de cosas que de otro modo podría poner en un Makefile.
Te sugiero que encuentres una instancia del script mpicc
y la deconstruyas.
Sí, puedes usar gcc en realidad. Pero en mi caso (en Ubuntu) mpicc es solo una envoltura de gcc, aquí está la salida del comando 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
Mientras que en Open MPI docs :
El equipo de Open MPI recomienda encarecidamente que simplemente utilice los compiladores "wrapper" de Open MPI para compilar sus aplicaciones MPI. Es decir, en lugar de usar (por ejemplo) gcc para compilar su programa, use mpicc.
Repetimos la declaración anterior: el equipo Open MPI recomienda encarecidamente que utilice los compiladores de envoltorios para compilar y vincular aplicaciones MPI. Si te encuentras diciendo: "¡Pero no quiero usar compiladores de envoltorios!", Por favor, haznos un favor y pruébalos. A ver si funcionan para ti. Asegúrese de informarnos si no funcionan para usted. Mucha gente basa sus "compiladores de envoltura de mierda!" mentalidad sobre el mal comportamiento de compiladores de envoltura mal implementados a mediados de los 90 Las cosas están mucho mejor en estos días; los compiladores de envoltorio pueden manejar casi cualquier situación, y son mucho más confiables que si intentas codificar de forma rígida los compiladores específicos del Open MPI y los indicadores del enlazador manualmente. Dicho esto, hay algunas situaciones (muy, muy pocas) en las que el uso de compiladores de envoltura puede ser problemático, como anidar múltiples compiladores de envoltura de múltiples proyectos. Por lo tanto, Open MPI ofrece una solución alternativa para averiguar qué indicadores de línea de comandos necesita para compilar aplicaciones MPI.
Aquí esta respuesta es útil para usted.
mpicc -compile_info
para MPICH.
mpicc
es solo una envoltura alrededor de ciertos compiladores. La mayoría de las implementaciones hacen que sus envoltorios mpicc
comprendan una opción especial como -showme
(Open MPI) o -show
(Open MPI, MPICH y sus derivados) que ofrece la lista completa de opciones que el wrapper transmite al compilador backend.
Por ejemplo, en Open MPI, los envoltorios son programas C ++ que leen archivos de configuración de texto sin formato y crean opciones de línea de comandos que se pasan al compilador. mpicc -showme
muestra la lista completa de tales opciones:
$ 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
(es realmente una sola línea que he dividido aquí para mejorar la legibilidad)
En ese caso en particular, Intel C Compiler icc
se usa como compilador backend, pero también tenemos variantes que usan GCC. También puede obtener la lista de opciones necesarias para la fase completa (generalmente conocida como CFLAGS
) con 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
así como la lista de opciones que necesita pasar al vinculador (conocido como LDFLAGS
) con 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
Estos podrían ser utilizados, por ejemplo, en un Makefile
, como este:
...
CFLAGS += $(shell mpicc -showme:compile)
LDFLAGS += $(shell mpicc -showme:link)
...
Hasta donde sé, -showme:compile
y -showme:link
son específicos de Open MPI y otras implementaciones solo ofrecen la lista completa de opciones cuando se llama con -show
.
Sigo pensando que es mejor usar mpicc
directamente porque si sucede que algo en la configuración de MPI ha cambiado, se reflejará inmediatamente en el contenedor mientras que tendría que cambiar su script de compilación / Makefile
manualmente (a menos que use -showme:compile
y -showme:link
para obtener las opciones automáticamente).
mpicc
ya está utilizando gcc
como backend