2012-03-14 10 views
5

Si utilizo MPI, tengo una cantidad de procesos especificados cuando ejecuto el programa principal. Sin embargo, me gustaría comenzar con un proceso y decidir dinámicamente en el tiempo de ejecución si necesito más, para bifurcar más procesos. ¿Eso o algo similar es posible?Crear procesos MPI sobre la marcha con un tenedor?

De lo contrario, tendría que reinventar MPI que me gustaría evitar.

+2

remito a mi respuesta a [esta cuestión] [1]. [1]: http://stackoverflow.com/questions/9683331/changing-number-of-processors-during-execution-of-the-code-in-mpis-based-paralle/9683758# 9683758 –

+0

@HighPerformanceMark: Pero eso solo comienza un nuevo proceso. Esto no es exactamente una copia en 'tenedor' de escritura desde la ubicación precisa (y configuración) del proceso actual. – bitmask

+0

preguntaste '¿es eso o algo similar posible?', Propongo que mph_comm_spawn es similar. Pero si no es adecuado para sus necesidades, puede que tenga que volver a escribir MPI. O use otra biblioteca de paralelización/conjunto de herramientas/enfoque. –

Respuesta

7

No es posible usar fork() ya que el proceso secundario no podrá usar las funciones MPI. Hay un mecanismo simple en MPI para crear dinámicamente nuevos procesos. Debe utilizar la función MPI_Comm_spawn o el doc OpenMPI MPI_Comm_spawn_mutliple

: http://www.open-mpi.org/doc/v1.4/man3/MPI_Comm_spawn.3.php

#include "mpi.h" 
#include <stdio.h> 
#include <stdlib.h> 

#define NUM_SPAWNS 2 

int main(int argc, char *argv[]) 
{ 
    int np = NUM_SPAWNS; 
    int errcodes[NUM_SPAWNS]; 
    MPI_Comm parentcomm, intercomm; 

    MPI_Init(&argc, &argv); 
    MPI_Comm_get_parent(&parentcomm); 
    if (parentcomm == MPI_COMM_NULL) { 
    MPI_Comm_spawn("spawn_example", MPI_ARGV_NULL, np, MPI_INFO_NULL, 0, MPI_COMM_WORLD, &intercomm, errcodes); 
    printf("I'm the parent.\n"); 
    } else { 
    printf("I'm the spawned.\n"); 
    } 
    fflush(stdout); 
    MPI_Finalize(); 
    return 0; 
} 
Cuestiones relacionadas