Source code for snek5000.clusters
"""Cluster utilities"""
import os
from .log import logger
def _int_getenv(key, default=0):
return int(os.getenv(key, default))
def _slurm():
"""Check different environment variables available within a SLURM job.
.. seealso::
https://slurm.schedmd.com/srun.html#SECTION_OUTPUT-ENVIRONMENT-VARIABLES
"""
return _int_getenv("SLURM_NPROCS") or (
_int_getenv("SLURM_NNODES") * _int_getenv("SLURM_CPUS_ON_NODE")
)
def _oar():
"""Equivalent to the shell command::
NPROC=$(cat ${OAR_NODEFILE} | wc -l).
"""
nodefile = os.getenv("OAR_NODEFILE")
if nodefile and os.path.exists(nodefile):
with open(nodefile) as file:
return len(file.readlines())
else:
return 0
[docs]def nproc_available():
"""Detect maximum number of processors available
Returns
-------
int
"""
# Inside job schedulers, number of processors assigned will vary
# TODO: extend this function for other schedulers PBS etc.
cluster_nproc = _slurm() or _oar()
if cluster_nproc:
var = "Cluster environment variables"
nproc = cluster_nproc
else:
var = "os.cpu_count()"
nproc = os.cpu_count()
logger.debug(f"Using {var} to detect maximum number of processors available")
return nproc