in lib/ramble/ramble/experiment_set.py [0:0]
def _compute_mpi_vars(self, expander, variables):
"""Compute required MPI variables
Perform computation of required MPI variables, including:
- n_ranks
- n_nodes
- processes_per_node
- n_threads
"""
n_ranks = (
variables[self.keywords.n_ranks] if self.keywords.n_ranks in variables.keys() else None
)
ppn = (
variables[self.keywords.processes_per_node]
if self.keywords.processes_per_node in variables.keys()
else None
)
n_nodes = (
variables[self.keywords.n_nodes] if self.keywords.n_nodes in variables.keys() else None
)
n_threads = (
variables[self.keywords.n_threads]
if self.keywords.n_threads in variables.keys()
else None
)
def _expand(var):
try:
return int(var)
except ValueError:
return int(expander.expand_var(var))
if n_ranks:
n_ranks = _expand(n_ranks)
if n_ranks <= 0:
logger.error("n_ranks must be positive")
if ppn:
ppn = _expand(ppn)
if ppn <= 0:
logger.error("processes_per_node must be positive")
if n_nodes:
n_nodes = _expand(n_nodes)
if n_nodes <= 0:
logger.error("n_nodes must be positive")
if n_threads:
n_threads = _expand(n_threads)
if n_ranks and ppn:
test_n_nodes = math.ceil(n_ranks / ppn)
if n_nodes and n_nodes < test_n_nodes:
logger.error(
f"n_nodes in {self.experiment_namespace} is {n_nodes} "
f"and should be {test_n_nodes}"
)
elif not n_nodes:
logger.debug(f"Defining n_nodes in {self.experiment_namespace}")
variables[self.keywords.n_nodes] = test_n_nodes
elif n_ranks and n_nodes:
ppn = math.ceil(int(n_ranks) / int(n_nodes))
logger.debug(f"Defining processes_per_node in {self.experiment_namespace}")
variables[self.keywords.processes_per_node] = ppn
elif ppn and n_nodes:
n_ranks = ppn * n_nodes
logger.debug(f"Defining n_ranks in {self.experiment_namespace}")
variables[self.keywords.n_ranks] = n_ranks
elif not n_nodes:
variables[self.keywords.n_nodes] = 1
if not n_threads:
variables[self.keywords.n_threads] = 1