blob: c974a291afe3251c1f305c0ddd66fd283ee8b687 [file] [log] [blame]
<!--#include virtual="header.txt"-->
<h1>Core Specialization</h1>
<p>Core specialization is a feature designed to isolate system overhead
(system interrupts, etc.) to designated cores on a compute node.
This can reduce context switching in applications to improve completion time.
The job processes will not be able to directly use the specialized cores.</p>
<h2 id="command">Command Options<a class="slurm_link" href="#command"></a></h2>
<p>All job allocation commands (<i>salloc</i>, <i>sbatch</i> and <i>srun</i>)
accept the <i>-S</i> or <i>--core-spec</i> option with a core count value
argument (e.g. "-S 1" or "--core-spec=2").
The count identifies the number of cores to be reserved for system overhead on
each allocated compute node. Note that the <i>--core-spec</i> option will be
ignored if <b>AllowSpecResourcesUsage</b> is not enabled in your slurm.conf.
Each job's core specialization count can be viewed using the <i>scontrol</i>,
<i>sview</i> or <i>squeue</i> command.
Specification of a core specialization count for a job step is ignored
(i.e. for the <i>srun</i> command within a job allocation created using the
<i>salloc</i> or <i>sbatch</i> command).
Use the <i>squeue</i> command with the "%X" format option to see the count
(it is not reported in the default output format).
The <i>scontrol</i> and <i>sview</i> commands can also be used to modify
the count for pending jobs.</p>
<p>Explicitly setting a job's specialized core value implicitly sets its
<i>--exclusive</i> option, reserving entire nodes for the job.
The job will be charged for all non-specialized CPUs on the node and the job's
NumCPUs value reported by the <i>scontrol</i>, <i>sview</i> and <i>squeue</i>
commands will reflect all non-specialized CPUS on all allocated nodes as will
the job's accounting.</p>
<p>Note that, due to the implicit --exclusive, if the requested specialized
core/thread count is lower than the number of cores in the CoreSpecCount or
in the CpuSpecList of the allocated node, then the step will have access to
all of the non-specialized cores as well as the specialized cores freed for
this job.</p>
<p>For example, suppose a node has <b>AllowSpecResourcesUsage=yes</b> and
<b>CoreSpecCount=2</b> configured in the slurm.conf for a node
with a total of 16 Cores. If a job specified <b>--core-spec=1</b>, the implicit
<b>--exclusive</b> would lead to an exclusive allocation of the node, leaving
15 cores for use by the job, and keeping 1 core for system use.</p>
<p>In <i>sacct</i>, the step's allocated CPUs
will include the specialized cores or threads that it has access to. However,
the job's allocated CPU count never includes specialized cores or threads to
ensure that utilization reports are accurate.</p>
<p>Here is an example configuration, setting cores 0 and 1 as
specialized:</p>
<pre>
AllowSpecResourcesUsage=yes
Nodename=n0 Port=10100 CoresPerSocket=16 ThreadsPerCore=1 CpuSpecList=0-1
</pre>
<p>Submit a job requesting a core spec count of 1 (freeing up core
number 1 for job use).</p>
<pre>
$ salloc --core-spec=1
salloc: Granted job allocation 4152
$ srun bash -c 'cat /proc/self/status |grep Cpus_'
Cpus_allowed: fffe
Cpus_allowed_list: 1-15
</pre>
<p>Notice the job CPU count vs the step CPU count.</p>
<pre>
$ sacct -j 4152 -ojobid%20,alloccpus
JobID AllocCPUS
-------------------- ----------
4152 14
4152.interactive 15
4152.0 15
</pre>
<h2 id="core">Core Selection<a class="slurm_link" href="#core"></a></h2>
<p>The specific resources to be used for specialization may be identified using
the <i>CPUSpecList</i> configuration parameter associated with each node in
the <i>slurm.conf</i> file.
If <i>CoreSpecCount</i> is configured, but not <i>CPUSpecList</i>, the cores
selected for specialization will follow the assignment algorithm
described below .
The first core selected will be the highest numbered core on the highest
numbered socket.
Subsequent cores selected will be the highest numbered core on lower
numbered sockets.
If additional cores are required, they will come from the next highest numbered
cores on each socket.
By way of example, consider a node with two sockets, each with four cores.
The specialized cores will be selected in the following order:</p>
<ol>
<li>socket: 1 core: 3</li>
<li>socket: 0 core: 3</li>
<li>socket: 1 core: 2</li>
<li>socket: 0 core: 2</li>
<li>socket: 1 core: 1</li>
<li>socket: 0 core: 1</li>
<li>socket: 1 core: 0</li>
<li>socket: 0 core: 0</li>
</ol>
<p>Slurm can be configured to specialize the first, rather than the last cores
by configuring SchedulerParameters=spec_cores_first. In that case,
the first core selected will be the lowest numbered core on the lowest
numbered socket.
Subsequent cores selected will be the lowest numbered core on higher
numbered sockets.
If additional cores are required, they well come from the next lowest numbered
cores on each socket.</p>
<p>Note that core specialization reservation may impact the use of some
job allocation request options, especially --cores-per-socket.</p>
<h2 id="system">System Configuration
<a class="slurm_link" href="#system"></a>
</h2>
<p>Core specialization requires SelectType=cons_tres and the
<i>task/cgroup</i> TaskPlugin.
Specialized resources should be configured in slurm.conf on the
node specification line using the <i>CoreSpecCount</i> or <i>CPUSpecList</i>
options to identify the CPUs to reserve.
The <i>MemSpecLimit</i> option can be used to reserve memory.
These resources will be reserved using Linux cgroups. The compute node daemon,
slurmd, will be constrained to the reserved resources unless
<i>TaskPluginParam</i> <i>SlurmdOffSpec</i> is specified. If cgroup/v1 is used,
the slurmstepd processes will also be constrained to the reserved resources.
Users wanting a different number of specialized cores should use the
<i>--core-spec</i> option as described above.</p>
<p>A job's core specialization option will be silently cleared on other
configurations.
In addition, each compute node's core count must be configured or the CPUs
count must be configured to the node's core count.
If the core count is not configured and the CPUs value is configured to the
count of hyperthreads, then hyperthreads rather than cores will be reserved for
system use.</p>
<p>If users are to be granted the right to control the number of specialized
cores for their job, the configuration parameter <i>AllowSpecResourcesUsage</i>
must be set to a value of <i>1</i>.</p>
<p style="text-align:center;">Last modified 4 April 2025</p>
<!--#include virtual="footer.txt"-->