Llamando mpi binario en serie como subproceso de la aplicación mpi

Tengo una gran aplicación de simulación paralela (utilizando MPI) que produce grandes cantidades de datos. Para evaluar estos datos utilizo un script de python.

Lo que ahora debo hacer es ejecutar esta aplicación una gran cantidad de veces (> 1000) y calcular las propiedades estadísticas a partir de los datos resultantes.

Mi enfoque hasta ahora es tener un script de Python ejecutándose en paralelo (usando mpi4py, usando, por ejemplo, 48 nodos) llamando al código de simulación usandosubprocess.check_call. Necesito esta llamada para ejecutar mi aplicación de simulación mpi en serie. No necesito que la simulación también se ejecute en paralelo en este caso. El script de Python puede analizar los datos en paralelo y, una vez finalizado, iniciará una nueva ejecución de simulación hasta que se acumule una gran cantidad de ejecuciones.

Los objetivos son

No guardar todo el conjunto de datos de 2000 ejecuciones.mantener datos intermedios en la memoria

Stub MWE:

expedientemulti_call_master.py:
from mpi4py import MPI
import subprocess

print "Master hello"

call_string = 'python multi_call_slave.py'

comm = MPI.COMM_WORLD

rank = comm.Get_rank()
size = comm.Get_size()

print "rank %d of size %d in master calling: %s" % (rank, size, call_string)

std_outfile = "./sm_test.out"
nr_samples = 1
for samples in range(0, nr_samples):
    with open(std_outfile, 'w') as out:
        subprocess.check_call(call_string, shell=True, stdout=out)
#       analyze_data()
#       communicate_results()
expedientemulti_call_slave.py (este sería el código de simulación C):
from mpi4py import MPI

print "Slave hello"

comm = MPI.COMM_WORLD
rank = comm.Get_rank()
size = comm.Get_size()
print "rank %d of size %d in slave" % (rank, size)

Esto no funcionará. Salida resultante enstdout:

Master hello
rank 1 of size 2 in master calling: python multi_call_slave_so.py
Master hello
rank 0 of size 2 in master calling: python multi_call_slave_so.py
[cli_0]: write_line error; fd=7 buf=:cmd=finalize
:
system msg for write_line failure : Broken pipe
Fatal error in MPI_Finalize: Other MPI error, error stack:
MPI_Finalize(311).....: MPI_Finalize failed
MPI_Finalize(229).....: 
MPID_Finalize(150)....: 
MPIDI_PG_Finalize(126): PMI_Finalize failed, error -1
[cli_1]: write_line error; fd=8 buf=:cmd=finalize
:
system msg for write_line failure : Broken pipe
Fatal error in MPI_Finalize: Other MPI error, error stack:
MPI_Finalize(311).....: MPI_Finalize failed
MPI_Finalize(229).....: 
MPID_Finalize(150)....: 
MPIDI_PG_Finalize(126): PMI_Finalize failed, error -1

Salida resultante ensm_test.out:

Slave hello
rank 0 of size 2 in slave

El motivo es que el subproceso supone que se ejecuta como una aplicación paralela, mientras que mi intención es ejecutarlo como una aplicación serie. Como una solución muy "hacky" hice lo siguiente:

Compile todas las bibliotecas compatibles con mpi necesarias con una distribución de mpi específica, es decir, intel mpiCompile el código de simulación con una biblioteca mpi diferente, es decir, openmpi

Si ahora comenzara mi script de python paralelo con intel mpi, la simulación subyacente no sería consciente del entorno paralelo circundante, ya que estaba utilizando una biblioteca diferente.

Esto funcionó bien por un tiempo, pero desafortunadamente no es muy portátil y difícil de mantener en diferentes grupos por varias razones.

yo podría

poner el subproceso que llama bucle en un script de shell utilizandosrunObligaría a amortiguar los resultados en HDusar algun tipo deMPI_Comm_spawn técnica en pitónno destinado a ser usado de esa maneraDifícil de averiguar si el subproceso terminó.posiblemente cambios al código C necesarioDe alguna manera engañar al subproceso para que no reenvíe información MPIIntenté manipular las variables de entorno en vano.Tampoco está destinado a ser utilizado asíutilizandompirun -n 1 osrun para la llamada de subproceso no ayuda

¿Hay alguna manera elegante y oficial de hacer esto? Estoy realmente sin ideas y aprecio cualquier entrada!

Respuestas a la pregunta(1)

Su respuesta a la pregunta