2011-11-23 8 views
7

Actualmente estoy trabajando en algún código MPI para un problema de la teoría de grafos en el que un número de nodos puede contener cada uno una respuesta y la longitud de esa respuesta. Para volver todo al nodo maestro, estoy haciendo un MPI_Gather para las respuestas y estoy intentando hacer un MPI_Reduce usando la operación MPI_MINLOC para descubrir quién tiene la solución más corta. Ahora mismo mi tipo de datos que almacena la longitud y el ID de nodo se define como (por ejemplos mostrados en numerosos sitios como http://www.open-mpi.org/doc/v1.4/man3/MPI_Reduce.3.php):OpenMPI Reducir usando MINLOC

struct minType 
{ 
    float len; 
    int index; 
}; 

En cada nodo que estoy inicializar las copias locales de esta estructura de la siguiente manera:

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

al final de la ejecución tengo una llamada MPI_Gather que tira hacia abajo con éxito todas las soluciones (las he impreso a partir de la memoria de verificarlas), y la llamada:

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

Es mi entendimiento de que los argumentos se supone que son:

  1. La fuente de datos
  2. es el objetivo para el resultado (sólo significativo en el nodo raíz designado)
  3. El número de artículos enviados por cada nodo
  4. el tipo de datos (MPI_FLOAT_INT parece definirse basado en el siguiente enlace)
  5. la operación (MPI_MINLOC parece definirse también)
  6. la raíz ID del nodo en el grupo de comunicación especificado
  7. El grupo de comunicaciones para esperar.

Cuando mi código hace que la operación reducirá me sale este error:

[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). 
-------------------------------------------------------------------------- 

voy a admitir a ser completamente perplejo en esto. En caso de que importe, estoy compilando usando OpenMPI 1.5.3 (construido usando gcc 4.4) en un clúster Rocks basado en CentOS 5.5.

Respuesta

4

creo que no se le permite utilizar el mismo tampón para entrada y salida (dos primeros argumentos). Leí la página man (enlace en su pregunta) y dice:

"Cuando el comunicador es un intracomunicador, puede realizar una operación de reducción in situ (el búfer de salida se usa como el búfer de entrada). variable MPI_IN_PLACE como el valor del proceso raíz sendbuf. En este caso, los datos de entrada se toman en la raíz del buffer de recepción, donde serán reemplazados por los datos de salida. "

+0

Eso fue todo. He estado haciendo cosas así durante un tiempo (usando el mismo objeto para enviar y recibir), debería volver atrás y asegurarme de que ahora puedo hacerlo legítimamente. Gracias por la rápida respuesta. – jthecie

+0

bueno. (Que debería haber leído el docu con más cuidado, pero openmpi debe dar un mensaje de error más claro) – Walter

+0

Cuando me tiro a mí mismo en el pie con que estaba retirando ser capaz de hacer esto en otro todo-a-todas las operaciones y haciendo el tonto error de asumir funcionaría aquí también. Ahora sé y pude obtener este código y trabajar. Una vez más, gracias por la respuesta rápida. – jthecie