U  g@sddlZddlZddlZddlZddlZddlZddlZddlm Z m Z ej j dddZ edZddd Zd d Zd d ZddZddZdddZdS)N)MPIMixedCMDFGenmpirunF) raise_missinglsf_cray_intelcCs@|dkr t}tjdg}tjj|d|d}|}|}dS)z%!Runs the "sync" command as an exe().Nz /bin/syncTcapturelogger) module_loggerprodutilprogRunnerpipelinePipeline to_stringpoll)r syncpversionstatusrC/lfs/h1/ops/prod/packages/hmon.v3.2.7/ush/produtil/mpi_impl/impi.pyrunsyncs rcCs<|dk r4t|dr||_t|dr8|j||ddn|`|S)z!Adds OpenMP support to the provided object @param arg An produtil.prog.Runner or produtil.mpiprog.MPIRanksBase object tree @param threads the number of threads, or threads per rank, an integerNthreadsenvZscatter)OMP_NUM_THREADSZKMP_NUM_THREADSZ KMP_AFFINITY)hasattrrr)argrrrropenmp#s  rc Cstd}tdkrdSz@tjtg}tjj|d|d}|}| }| ddkWSt k r}z|j dt |fdd W5d}~XYnXdS) z(!Detects whether Intel MPI is available.zprodutil.mpi_impl.impiNFTrz Intel(R) MPIrzERROR in mpirun --version: %s )exc_info)logging getLogger mpirun_pathr r rrrrrfind Exceptionerrorstr)r rrrrerrrdetect4s r)cCsdS)z@!Does this module represent an MPI implementation? Returns True.Trrrrr can_run_mpiCsr*cKstjjt|gf|S)z!Returns an ImmutableRunner that will run the specified program. @returns an empty list @param exe The executable to run on compute nodes. @param kwargs Ignored.)r r ImmutableRunnerr')exekwargsrrr make_bigexeGsr.cKsHt|tjjst|\}}|r.|r.tdg}|ddrH|d| dkr|rdd|j t g|dt j d gd gd D}tj|S|rtd n|rtj|}d d|j dddD}tjddkrtdtjjt g|dd| dgtd|f|dSdd|j t g|ddgd gd D}tj|SdS)a!Turns a produtil.mpiprog.MPIRanksBase tree into a produtil.prog.Runner @param arg a tree of produtil.mpiprog.MPIRanksBase objects @param allranks if True, and only one rank is requested by arg, then all MPI ranks will be used @param kwargs passed to produtil.mpi_impl.mpi_impl_base.CMDFGen when mpiserial is in use. @returns a produtil.prog.Runner that will run the selected MPI programzACannot mix serial and parallel MPI ranks in the same MPI program.Zlabel_ioFz-lrcSsg|]}|qSrr.0arrr bszmpirunner..z-np TOTAL_TASKS:)prebeforeZbetweenzWhen using allranks=True, you must provide an mpi program specification with only one MPI rank (to be duplicated across all ranks).cSsg|]}|qSrrr/rrrr2nsT)to_shellexpand mpiserialNz]Attempting to run a serial program via mpirun but the mpiserial program is not in your $PATH.z%sZ serialcmdf)preruncSsg|]}|qSrrr/rrrr2wsz%(n)d) isinstancer mpiprog MPIRanksBaseAssertionErrorZ check_serialrgetappendZnranksZ to_arglistr#osenvironr rMPIAllRanksErrorZcollapsefileopfind_exeMPISerialMissingr)rallranksr-serialZparallel extra_argsarglistlinesrrr mpirunnerNsF           rL)N)F)rAsysr!produtil.fileopr produtil.progprodutil.mpiprogprodutil.pipeline mpi_impl_baserrrDrEr#r"r rrr)r*r.rLrrrrs