2012-06-24 11 views
8

Estoy usando gcc y OpenMPI. Por lo general me quedo programas MPI utilizando el envoltorio mpirun - por ejemplo,Ejecutando el programa OpenMPI sin mpirun

mpirun -np 4 myprogram 

4 para iniciar procesos.

Sin embargo, me preguntaba si es posible generar fácilmente un archivo binario que lo haga automáticamente (tal vez con algunas opciones codificadas como -np 4 anterior).

sé que puedo escribir un contenedor C que llama a mi programa, tales como los siguientes:

#include <stdlib.h> 
#include <unistd.h> 

int main() { 
     char *options[] = { "mpirun", "-np", "4", "myprogram" }; 

     execvp("mpirun", options); 
     /* Ignoring return value to keep example simple */ 

     return EXIT_SUCCESS; 
} 

pero esto parece un poco torpe y termino con dos ejecutables en lugar de uno.

me han tratado de vincular de manera explícita las librerías MPI, como

gcc -o myprogram -I/usr/lib/openmpi/include/ \ 
    -lmpi -L/usr/lib/openmpi/lib/ myprogram.c 

pero el resultado cuando corro ejecutable, MPI_Comm_size conjuntos de cero a medida que el tamaño del grupo (como si hubiera dado -np 0 como argumento). ¿Puedo usar una variable de entorno u otra cosa para pasar el tamaño del grupo? ¿O existe otra forma de construir un programa MPI ejecutable de manera única (utilizando Linux y gcc)?

+0

Se puede hacer, aunque no sé cómo hacerlo desde lo más alto de mi cabeza. Conozco un par de programas con los que me he encontrado que hacen esto. No hay magia real allí, solo hace un montón de cosas detrás de escena que también puedes hacer tú mismo. –

+0

¿Lo entiendo correctamente? ¿Desea omitir 'mpirun' o desea de alguna manera llamar' mpirun' automáticamente? –

+0

@Hristo Iliev: Sería bueno si tuviera un solo binario estático. – Jay

Respuesta

6

Si lo entiendo correctamente, usted quiere un ejecutable MPI auto-lanzamiento. Como he escrito en mi comentario, puede ir con una opción especial que hace que su código se ejecute mpirun si se proporciona, p. -launchmpi. Con Open MPI es aún más fácil ya que exporta variables de entorno especiales a los procesos MPI lanzados, p. OMPI_COMM_WORLD_RANK. Si esta variable existe en el entorno, entonces usted sabe que el programa se inició desde el mpirun y no directamente. Se pueden combinar ambos métodos en un solo cheque esto:

int main (int argc, char **argv) 
{ 
    int perform_launch = 0; 
    // Scan argv[] for special option like "-launchmpi" 
    // and set perform_launch if found 

    if (perform_launch || getenv("OMPI_COMM_WORLD_RANK") == NULL) 
    { 
     // #args = argc + 3 ("mpirun -np 4" added) + NULL 
     // #args should be reduced by one if "-launchmpi" is present 
     char **args = (char **)calloc(
      argc + (perform_launch ? 3 : 4), 
      sizeof(char *)); 
     args[0] = "mpirun"; 
     args[1] = "-np"; 
     args[2] = "4"; 
     // Copy the entire argv to the rest of args but skip "-launchmpi" 

     execvp("mpirun", args); 

     return EXIT_SUCCESS; 
    } 

    // Proceed as regular MPI code 
    MPI_Init(&argc, &argv); 
    ... 
    // Magic happens here 
    ... 
    MPI_Finalize(); 

    return EXIT_SUCCESS; 
} 

Si desea controlar el número de procesos en el trabajo MPI, se puede suministrar como un arugment adicional, por ejemplo, -launchmpi 12, o en una variable de entorno y use su valor en lugar de "4" en el código anterior.

Tenga en cuenta que los archivos ejecutables MPI generalmente no se pueden iniciar sin mpirun. Esta última es una parte integral del tiempo de ejecución de MPI y hace mucho más que simplemente lanzar varias copias del ejecutable de MPI. También siempre se está vinculando explícitamente a la biblioteca MPI cuando se compila con cualquiera de los envoltorios del compilador MPI (intente mpicc -showme). Aunque puede vincular estáticamente bibliotecas MPI (no recomendado, consulte here), aún necesitará mpirun para poder ejecutar trabajos MPI: AFAIK no hay forma de incrustar la funcionalidad mpirun en su programa, al menos no en Open MPI.

+0

Gracias por su respuesta, ¡eso es realmente útil! – Jay

1

Usted puede hacer esto con un script bash:

 
# If you change this script has executable (chmod +x script_name) 
# and if you have the current path in the PATH variable (add export PATH=.:$PATH in your .bashrc) 
#Then, you can run this has: script_name program_args 

mpirun -np 4 your_executable_name "[email protected]" 
+1

Usted casi definitivamente quiere '" $ @ "', no '$ *', de lo contrario va a destruir args en la división de palabras. –

+0

Gracias @ChrisDown Corregí mi respuesta. – RSFalcon7

+1

Sus argumentos aún serán destrozados. Las citas son importantes. –

Cuestiones relacionadas