2012-03-14 16 views
5

Se utilizzo MPI, ho un numero di processi specificato quando eseguo il programma principale. Tuttavia vorrei iniziare con un processo e decidere dinamicamente in fase di esecuzione se e quando ho bisogno di più, per bocciare più processi. È possibile o qualcosa di simile?Creare processi MPI al volo con la forcella?

Altrimenti dovrei reinventare MPI che vorrei evitare molto.

+2

vi rimando alla mia risposta a [questa domanda] [1]. [1]: http://stackoverflow.com/questions/9683331/changing-number-of-processors-during-execution-of-the-code-in-mpis-based-paralle/9683758# 9683758 –

+0

@HighPerformanceMark: Ma questo inizia appena un nuovo processo. Questa non è esattamente una copia su "fork" di scrittura dalla posizione precisa (e dalla configurazione) del processo corrente. – bitmask

+0

hai chiesto "è possibile o qualcosa di simile?", Propongo che mph_comm_spawn sia simile. Ma se non è adatto alle tue esigenze, potresti dover riscrivere MPI. O utilizzare un'altra libreria/set di strumenti/approccio per la parallelizzazione. –

risposta

7

Non è possibile utilizzare fork() poiché il processo figlio non sarà in grado di utilizzare le funzioni MPI. C'è un semplice meccanismo in MPI per creare processi dinamicamente nuovi. È necessario utilizzare la funzione MPI_Comm_spawn o OpenMPI doc 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; 
}