Terminology for nodes, cores, processes, and threads

SimFactory uses some terminology for nodes, cores, processes, and threads. These terms are used somewhat inconsistently in the wild, and marketing changes their definitions every few years. Below we define the terms unambiguously. It is unfortunate that SimFactory’s variable names and command line options are somewhat outdated and don’t correspond to modern terminology any more.

Definitions

  • A machine consists of a certain number of nodes, each of which consists of a certain number of cores.

  • A job requests (from the queuing system) a certain number of nodes, and requests a certain number of cores on each node.

  • The MDB entries [maxnodes], [minppn], and [maxppn] define how many nodes a job can request at most, and thus define the range of allowed values for cores-per-node.

  • SimFactory starts a number of MPI processes, choosing how many MPI processes should be placed on every node. Each MPI process starts a certain number of OpenMP threads. The distribution of threads onto cores is performed automatically by the operating system and usually cannot be influenced.

Note that nodes and cores are requested from the queuing system, while processes and threads are started by SimFactory. These numbers may differ, allowing under- and over-subscription.

Variables and command-line options

SimFactory expands variables in files and uses certain command line options. These variables and options have the following definitions:

Variable

Option

Definition

NODES

nodes

PROCS_REQUESTED

cores

PPN

–ppn

cores per node

NUM_PROCS

processes

NODE_PROCS

processes per node

PROCS

–procs

threads

NUM_THREADS

–num-threads

threads per process

PPN_USED

–ppn-used

threads per node

NUM_SMT

–num-smt

threads per core

Choice process

The user chooses the total number of threads (–procs). The user can also choose the number of threads per process (–num-threads) and the number of threads per core (–num-smt). Additionally, the user can also specify the number of cores per node (–ppn) and the number of threads per node (–ppn-used), allowing for under- or over-subscribing or cores. The number of nodes is always chosen automatically. Values that are not specified are taken from a previous restart (if one exists), or from the system’s MDB entry.

The number of cores per node that can be requested from the queuing system define a granularity that may be inconsistent with the total number of threads. In this case, the last node may be used only partially. Similarly, the number of threads per process defines a granularity that may be inconsistent with the total number of threads. In this case, the total number of threads is rounded up, so that the job will have more threads running.

Definitions and constraints

Number of MPI processes:

NUM_PROCS := PROCS / NUM_THREADS

constraint:

PROCS % NUM_THREADS = 0

Number of nodes:

NODES := ceil(PROCS / PPNUSED)

Number of requested cores:

PROCS_REQUESTED := NODES * PPN

Number of MPI processes per node:

NODE_PROCS := PPNUSED * NUM_SMT/ NUM_THREADS

constraint:

PPNUSED * NUM_SMT % NUM_THREADS = 0