2013-08-08 15 views
5

Sto cercando di realizzare un'implementazione usando MPI e Fortran che separano i processi che si trovano sullo stesso nodo in gruppi. MPI ha una routine in grado di identificarlo?Classificare i processi del nodo con MPI e FORTRAN

Ho avuto l'idea di separare questi processi dai loro nomi host, che sono gli stessi sui nodi della macchina che sto usando. Ma non so se è generale per tutti i cluster.

risposta

6

Probabilmente vorrete controllare MPI_COMM_SPLIT_TYPE. Essa vi permetterà di dividere un comunicatore esistente basato sulla split_type si passa come un parametro:

int MPI_Comm_split_type(MPI_Comm comm, int split_type, int key, 
         MPI_Info info, MPI_Comm *newcomm) 

In questo momento, l'unica split_type è MPI_COMM_TYPE_SHARED, definito nello standard come:

Questo tipo divide il comunicatore in subcomunicatori, ognuno dei quali può creare un'area di memoria condivisa.

Questo di solito è la stessa cosa di quello che stai chiedendo, ma dovrete controllare due volte che è vero sulla vostra macchina.

L'altra cosa che devi sapere è che questa è una nuova funzione in MPI-3 quindi potrebbe non essere disponibile in tutte le implementazioni di MPI. So che è disponibile per MPICH e per i suoi derivati. AFAIK, non è disponibile nell'ultima versione di Open MPI. Quindi assicurati di avere una versione di MPI che effettivamente la supporta.

+0

Wesley, grazie. È un peccato che questo non sia disponibile per Open MPI. Anche se, fammi fare un esempio per vedere se ho capito come funziona questo split type_. Supose Ho 32 processi su 4 nodi 8-core. La mia intenzione è di creare 4 gruppi di 8 core, basati su processi di memoria condivisi che si trovano sullo stesso nodo. Potrei usare MPI_Comm_split_type. Usando questo non potrei, per esempio, creare 8 gruppi di 4 (mettendo 2 gruppi in ogni nodo), potrei? –

+0

Sì, puoi farlo. Se si desidera creare 8 gruppi di 4 in cui ogni gruppo è locale a un nodo, è necessario utilizzare il parametro chiave in modo che metà dei processi contribuisca a una chiave e l'altra metà contribuisca a una chiave diversa. Questo è stato il comportamento della chiamata esistente MPI_COMM_SPLIT quindi ci dovrebbero essere un sacco di tutorial da seguire. Dovrai solo aggiungere un po 'per le nuove aggiunte di tipo. –

+0

OpenMPI imposta le variabili di ambiente OMPI_COMM_WORLD_LOCAL_RANK e OMPI_COMM_WORLD_LOCAL_SIZE che è possibile utilizzare per scoprire quanti processi condividono un nodo ("dimensione locale"). –

0

Ho implementato una funzione di divisione simile per sistemi il cui ambiente non fornisce MPI 3.0 e funziona piuttosto bene su diversi cluster. Utilizza MPI_GET_PROCESSOR_NAME e fa affidamento sul fatto che la maggior parte delle implementazioni di cluster MPI restituiscono il FQDN del nodo come risultato - testato con Open MPI e Intel MPI (basato su MPICH, pertanto è prevedibile un comportamento simile con altri derivati ​​MPICH). In pseudocodice funziona così:

rank := MPI_COMM_RANK(communicator) 
prev_rank := rank - 1; IF (prev_rank < 0) prev_rank := MPI_PROC_NULL 
next_rank := rank + 1; IF (next_rank >= num_procs) next_rank := MPI_PROC_NULL 

proc_name := MPI_GET_PROCESSOR_NAME 

list := MPI_RECV(from prev_rank) 
IF (list does not contain proc_name) THEN 
    list := list + proc_name 
END IF 

colour := index of proc_name in list 
key := rank 

MPI_SEND(list to next_rank) 

MPI_COMM_SPLIT(communicator, colour, key, newcomm) 

Questo codice costruisce fondamentalmente un elenco di nomi unici processori MPI (nomi host) e ogni processo utilizza la posizione del suo nome del processore MPI in questa lista come colore per la consueta funzione split . Nella mia implementazione C dell'algoritmo, la lista è semplicemente una stringa - concatenazione di tutti gli elementi con un byte zero come separatore. In Fortran si può usare qualsiasi simbolo che non sarebbe normalmente permesso in un nome host, ad es. ;. Quindi la stringa viene semplicemente passata come una matrice di MPI_CHAR (C) o MPI_CHARACTER (Fortran).

+0

Questo meccanismo funziona su tutte le macchine che ho incontrato eccetto un Blue Gene/Q. Lì, il nome del processore include il numero principale all'interno di un nodo. È possibile costruire il proprio nome del processore in questo modo:

+0

Sulla BG/Q, i processi non possono migrare tra i core, quindi ha perfettamente senso includere l'ID core nel nome del processore. Che mi dici di Cray? Non ho avuto la possibilità di usarne uno in un bel po 'di tempo. –

+0

I Crays che ho usato si comportano come Linux. –

Problemi correlati