2011-11-23 17 views
7

Attualmente sto lavorando su alcuni codici MPI per un problema di teoria dei grafi in cui un numero di nodi può contenere ciascuno una risposta e la lunghezza di tale risposta. Per riportare tutto al nodo master, eseguo un MPI_Gather per le risposte e sto tentando di eseguire un MPI_Reduce utilizzando l'operazione MPI_MINLOC per capire chi ha la soluzione più corta. In questo momento il mio tipo di dati che memorizza la lunghezza e l'ID del nodo è definito come (per esempi mostrati su numerosi siti come http://www.open-mpi.org/doc/v1.4/man3/MPI_Reduce.3.php):OpenMPI Riduci l'uso di MINLOC

struct minType 
{ 
    float len; 
    int index; 
}; 

In ogni nodo sto inizializzare le copie locali di questa struct nel modo seguente:

int commRank; 
MPI_Comm_rank (MPI_COMM_WORLD, &commRank); 
minType solutionLen; 
solutionLen.len = 1e37; 
solutionLen.index = commRank; 

alla fine dell'esecuzione ho una chiamata MPI_Gather che tira verso il basso con successo tutte le soluzioni (io li ho stampati dalla memoria per verificare loro), e la chiamata:

MPI_Reduce (&solutionLen, &solutionLen, 1, MPI_FLOAT_INT, MPI_MINLOC, 0, MPI_COMM_WORLD); 

E 'la mia comprensione che gli argomenti dovrebbero essere:

  1. La fonte dei dati
  2. è l'obiettivo per il risultato (solo significativo sul nodo principale designato)
  3. Il numero di articoli inviati da ogni nodo
  4. il tipo di dati (MPI_FLOAT_INT sembra essere definiti sulla base dei link sopra)
  5. l'operazione (MPI_MINLOC appare da definire così)
  6. la radice ID del nodo nel gruppo di comunicazione specificato
  7. Il gruppo di comunicazioni in attesa.

Quando il mio codice rende al funzionamento di ridurre ottengo questo errore:

[compute-2-19.local:9754] *** An error occurred in MPI_Reduce 
[compute-2-19.local:9754] *** on communicator MPI_COMM_WORLD 
[compute-2-19.local:9754] *** MPI_ERR_ARG: invalid argument of some other kind 
[compute-2-19.local:9754] *** MPI_ERRORS_ARE_FATAL (your MPI job will now abort) 
-------------------------------------------------------------------------- 
mpirun has exited due to process rank 0 with PID 9754 on 
node compute-2-19.local exiting improperly. There are two reasons this could occur: 

1. this process did not call "init" before exiting, but others in 
the job did. This can cause a job to hang indefinitely while it waits 
for all processes to call "init". By rule, if one process calls "init", 
then ALL processes must call "init" prior to termination. 

2. this process called "init", but exited without calling "finalize". 
By rule, all processes that call "init" MUST call "finalize" prior to 
exiting or it will be considered an "abnormal termination" 

This may have caused other processes in the application to be 
terminated by signals sent by mpirun (as reported here). 
-------------------------------------------------------------------------- 

Devo ammettere di essere completamente perplesso su questo. Nel caso in cui sia importante sto compilando usando OpenMPI 1.5.3 (costruito usando gcc 4.4) su un cluster Rocks basato su CentOS 5.5.

risposta

4

Penso che non sia consentito utilizzare lo stesso buffer per input e output (primi due argomenti). Ho letto la pagina man (link nella tua domanda) e dice:

"Quando il comunicatore è un intracomunicatore, è possibile eseguire un'operazione di riduzione sul posto (il buffer di uscita viene utilizzato come buffer di input). variabile MPI_IN_PLACE come valore del processo di root sendbuf. In questo caso, i dati di input sono presi alla radice dal buffer di ricezione, dove verrà sostituito dai dati di output. "

+0

E 'stato. Ho fatto cose del genere per un po '(usando lo stesso oggetto per inviare e ricevere), dovrei tornare indietro e assicurarmi che ora sia autorizzato a farlo in modo legittimo. Grazie per la risposta rapida. – jthecie

+0

buono. (dovresti leggere il documento con più attenzione, ma openMPI dovrebbe dare un messaggio di errore più chiaro) – Walter

+0

Dove mi sono sparato al piede con quello che stava ricordando di essere in grado di fare questo su tutte le operazioni all-to-all e di fare lo stupido errore di assumere funzionerebbe anche qui. Ora so ed è stato in grado di ottenere questo codice attivo e funzionante. Ancora una volta, grazie per la rapida risposta. – jthecie