2012-07-03 85 views
17

¿Alguien sabe si es posible compilar MPI con gcc? Necesito usar gcc, no mpicc.¿Cómo compilar MPI con gcc?

+0

Es posible, pero ¿por qué quieres? Normalmente, el compilador envuelto (mpicc aquí) es mucho más conveniente y habrá sido optimizado de alguna manera. – Hbcdev

Respuesta

0

mpicc ya está utilizando gcc como backend

+1

Extraño, mi 'mpicc' está usando' icc' como back-end ... –

0

Sí, ciertamente puede compilar un programa MPI sin la comodidad de la mpicc envoltura. En la mayoría de las implementaciones, mpicc es un script de shell (o similar) que establece variables de entorno, busca y vincula varias bibliotecas, todo el tipo de cosas que de otro modo podría poner en un Makefile.

Sugiero que encuentre una instancia de la secuencia de comandos mpicc y la deconstruya.

21

mpicc es simplemente un envoltorio de cierto conjunto de compiladores. La mayoría de las implementaciones tienen sus envolturas mpicc que entienden una opción especial como -showme (MPI abierto) o -show (MPI abierto, MPICH y derivados) que proporciona la lista completa de opciones que el envoltorio transfiere al compilador back-end.

Por ejemplo, en Open MPI, los envoltorios son programas C++ que leen archivos de configuración de texto sin formato y compilan opciones de línea de comandos que luego 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 

(en realidad es una sola línea que he dividido aquí para mejorar la legibilidad)

Es ese caso particular, el compilador Intel C icc se utiliza como backend compilador pero también tenemos variantes que usan GCC. También puede obtener la lista de opciones necesarias para la fase comple (generalmente conocido 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 usted necesita para pasar al enlazador (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 usarse, por ejemplo, en un Makefile, así:

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

Por lo que yo sé -showme:compile y -showme:link son específicos para abrir MPI y otras implementaciones sólo dan la lista completa de opciones cuando se le llama con -show.

sigo pensando que es mejor utilizar mpicc directamente porque si sucede que se cambia algo en la configuración MPI, se refleja inmediatamente en la envoltura, mientras que tendría que cambiar su escritura de la estructura/Makefile manualmente (a menos que utilice -showme:compile y -showme:link para obtener las opciones automáticamente).

2

mpicc -compile_info para MPICH.

0

Sí, puede usar gcc en realidad.Pero en mi caso (en Ubuntu) mpicc es sólo un envoltorio 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:

equipo

The Open MPI recomienda encarecidamente que simplemente utilice los compiladores "envoltura" 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 afirmación anterior: el equipo Open MPI recomienda enfáticamente el uso de los compiladores de envoltorio para compilar y vincular aplicaciones MPI. Si te encuentras diciendo "¡Pero no quiero usar compiladores de envoltorios!", Por favor, cuéntanos y pruébalos. Vea si funcionan para usted. Asegúrese de informarnos si no funcionan para usted. ¡Mucha gente basa sus "compiladores de envoltura en chupar"! mentalidad sobre el mal comportamiento de los compiladores de envoltura implementados a mediados de los años noventa. 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 de lo que intenta codificar el compilador Open MPI y los indicadores del enlazador de forma manual. Dicho esto, hay algunas, muy, muy pocas situaciones en las que el uso de compiladores de envoltura puede ser problemático, como anidar compiladores de envoltura múltiple de varios proyectos. Por lo tanto, Open MPI proporciona una solución para descubrir qué indicadores de línea de comando necesita para compilar aplicaciones MPI.

Aquí la respuesta es útil para usted.