blob: 752a790c4d731826a94c7c7eb8eed0acca735f9d [file] [log] [blame]
<!--#include virtual="header.txt"-->
<h1>MPI Users Guide</h1>
<p>MPI use depends upon the type of MPI being used.
There are three fundamentally different modes of operation used
by these various MPI implementations.
<ol>
<li>Slurm directly launches the tasks and performs initialization of
communications through the PMI-1, PMI-2 or PMIx APIs. (Supported by most
modern MPI implementations.)</li>
<li>Slurm creates a resource allocation for the job and then
mpirun launches tasks using Slurm's infrastructure (srun).</li>
<li>Slurm creates a resource allocation for the job and then
mpirun launches tasks using some mechanism other than Slurm,
such as SSH or RSH.
These tasks are initiated outside of Slurm's monitoring
or control and require access to the nodes from the batch node (e.g. SSH).
Slurm's epilog should be configured to purge
these tasks when the job's allocation is relinquished. The
use of pam_slurm_adopt is strongly recommended.</li>
</ol>
<p><b>NOTE</b>: Slurm is not directly launching the user application in case 3,
which may prevent the desired behavior of binding tasks to CPUs and/or
accounting and is not a recommended way.</p>
<p>Two Slurm parameters control which PMI (Process Management Interface)
implementation will be supported. Proper configuration is essential for Slurm to
establish the proper environment for the MPI job, such as setting the
appropriate environment variables. The <i>MpiDefault</i> configuration parameter
in <i>slurm.conf</i> establishes the system's default PMI to be used.
The <i>srun</i> option <i>--mpi=</i> (or the equivalent environment
variable <i>SLURM_MPI_TYPE</i>) can be used to specify when a
different PMI implementation is to be used for an individual job.</p>
<p>There are parameters that can be set in the
<a href="mpi.conf.html">mpi.conf</a> file that allow you to modify
the behavior of the PMI plugins.</p>
<p><b>NOTE</b>: Use of an MPI implementation without the appropriate Slurm
plugin may result in application failure. If multiple MPI implementations
are used on a system then some users may be required to explicitly specify
a suitable Slurm MPI plugin.</p>
<p><b>NOTE</b>: If installing Slurm with RPMs, the <i>slurm-libpmi</i>
package will conflict with the <i>pmix-libpmi</i> package if it is
installed. If policies at your site allow you to install from source, this
will allow you to install these packages to different locations, so you can
choose which libraries to use.</p>
<p><b>NOTE</b>: If you build any MPI stack component with hwloc, note that
versions 2.5.0 through 2.7.0 (inclusive) of hwloc have a bug that pushes an
untouchable value into the environ array, causing a segfault when accessing it.
It is advisable to build with hwloc version 2.7.1 or later.</p>
<p>Links to instructions for using several varieties of MPI/PMI
with Slurm are provided below.
<ul>
<li><a href="#pmix">PMIx</a></li>
<li><a href="#open_mpi">Open MPI</a></li>
<li><a href="#intel_mpi">Intel-MPI</a></li>
<li><a href="#mpich">MPICH</a></li>
<li><a href="#mvapich2">MVAPICH2</a></li>
<li><a href="#hpe_cray_pmi">HPE Cray PMI Support</a></li>
</ul></p>
<hr size=4 width="100%">
<h2 id="pmix"><a href="https://openpmix.github.io/"><b>PMIx</b></a>
<a class="slurm_link" href="#pmix"></a>
</h2>
<h3 id="pmix_build">Building PMIx
<a class="slurm_link" href="#pmix_build"></a>
</h3>
<p>Before building PMIx, it is advisable to read these
<a href="https://openpmix.github.io/support/how-to/">How-To Guides</a>. They
provide some details on
<a href="https://openpmix.github.io/code/getting-the-reference-implementation">
building dependencies and installation steps</a> as well as some relevant notes
with regards to
<a href="https://openpmix.github.io/support/how-to/slurm-support">Slurm Support
</a>.</p>
<p>This section is intended to complement the PMIx FAQ with some notes on how to
prepare Slurm and PMIx to work together. PMIx can be obtained from the official
<a href="https://github.com/openpmix/openpmix">PMIx GitHub</a> repository,
either by cloning the repository or by downloading a packaged release.</p>
<p>Slurm support for PMIx was first included in Slurm 16.05 based on the PMIx
v1.2 release. It has since been updated to support up to version 5.x of the
PMIx series, as per the following table:
<ul>
<li>Slurm 20.11+ supports PMIx v1.2+, v2.x and v3.x.</li>
<li>Slurm 22.05+ supports PMIx v2.x, v3.x., v4.x. and v5.x.</li>
</ul>
If running PMIx v1, it is recommended to run at least 1.2.5 since older
versions may have some compatibility issues with support of pmi and pmi2 APIs.
Note also that Intel MPI doesn't officially support PMIx. It may work since PMIx
offers some compatibility with PMI-2, but there is no guarantee that it will.
</p>
<h3 id="slurm_pmix">Building Slurm with PMIx support
<a class="slurm_link" href="#slurm_pmix"></a>
</h3>
<p>At configure time, Slurm won't build with PMIx unless <b>--with-pmix</b> is
set. Then it will look by default for a PMIx installation under:</p>
<pre>
/usr
/usr/local
</pre>
<p>If PMIx isn't installed in any of the previous locations, the Slurm configure
script can be requested to point to the non default location. Here's an example
assuming the installation dir is <i>/home/user/pmix/v4.1.2/</i>:
</p>
<pre>
user@testbox:~/slurm/22.05/build$ ../src/configure \
&gt; --prefix=/home/user/slurm/22.05/inst \
&gt; <b>--with-pmix=/home/user/pmix/4.1.2</b>
</pre>
<p>Or the analogous with RPM based building:</p>
<pre>
user@testbox:~/slurm_rpm$ rpmbuild \
&gt; --define '_prefix /home/user/slurm/22.05/inst' \
&gt; --define '_slurm_sysconfdir /home/user/slurm/22.05/inst/etc' \
&gt; <b>--define '_with_pmix --with-pmix=/home/user/pmix/4.1.2'</b> \
&gt; -ta slurm-22.05.2.1.tar.bz2
</pre>
<p><b>NOTE</b>: It is also possible to build against multiple PMIx versions
with a ':' separator. For instance to build against 3.2 and 4.1:</p>
<pre>
...
&gt; <b>--with-pmix=/path/to/pmix/3.2.3:/path/to/pmix/4.1.2</b> \
...
</pre>
<p>Then, when submitting a job, the desired version can then be selected
using any of the available from --mpi=list. The default for pmix will be the
highest version of the library:</p>
<pre>
$ srun --mpi=list
MPI plugin types are...
cray_shasta
none
pmi2
pmix
specific pmix plugin versions available: pmix_v3,pmix_v4
</pre>
<p>Continuing with the configuration, if Slurm is unable to locate the PMIx
installation and/or finds it but considers it not usable, the configure output
should log something like this:</p>
<pre>
checking for pmix installation...
configure: WARNING: unable to locate pmix installation
</pre>
<p>Inspecting the generated config.log in the Slurm build directory might
provide more detail for troubleshooting purposes. After configuration,
we can proceed to install Slurm (using make or rpm accordingly):</p>
<pre>
user@testbox:~/slurm/22.05/build$ make -j install
user@testbox:~/slurm/22.05/build$ cd /home/user/slurm/22.05/inst/lib/slurm/
user@testbox:~/slurm/22.05/inst/lib/slurm$ ls -l *pmix*
lrwxrwxrwx 1 user user 16 jul 6 17:17 mpi_pmix.so -> ./mpi_pmix_v4.so
-rw-r--r-- 1 user user 9387254 jul 6 17:17 mpi_pmix_v3.a
-rwxr-xr-x 1 user user 1065 jul 6 17:17 mpi_pmix_v3.la
-rwxr-xr-x 1 user user 1265840 jul 6 17:17 mpi_pmix_v3.so
-rw-r--r-- 1 user user 9935358 jul 6 17:17 mpi_pmix_v4.a
-rwxr-xr-x 1 user user 1059 jul 6 17:17 mpi_pmix_v4.la
-rwxr-xr-x 1 user user 1286936 jul 6 17:17 mpi_pmix_v4.so
</pre>
<p>If support for PMI-1 or PMI-2 version is also needed, it can also be
installed from the contribs directory:</p>
<pre>
user@testbox:~/slurm/22.05/build/$ cd contribs/pmi1
user@testbox:~/slurm/22.05/build/contribs/pmi1$ make -j install
user@testbox:~/slurm/22.05/build/$ cd contribs/pmi2
user@testbox:~/slurm/22.05/build/contribs/pmi2$ make -j install
user@testbox:~/$ ls -l /home/user/slurm/22.05/inst/lib/*pmi*
-rw-r--r-- 1 user user 493024 jul 6 17:27 libpmi2.a
-rwxr-xr-x 1 user user 987 jul 6 17:27 libpmi2.la
lrwxrwxrwx 1 user user 16 jul 6 17:27 libpmi2.so -> libpmi2.so.0.0.0
lrwxrwxrwx 1 user user 16 jul 6 17:27 libpmi2.so.0 -> libpmi2.so.0.0.0
-rwxr-xr-x 1 user user 219712 jul 6 17:27 libpmi2.so.0.0.0
-rw-r--r-- 1 user user 427768 jul 6 17:27 libpmi.a
-rwxr-xr-x 1 user user 1039 jul 6 17:27 libpmi.la
lrwxrwxrwx 1 user user 15 jul 6 17:27 libpmi.so -> libpmi.so.0.0.0
lrwxrwxrwx 1 user user 15 jul 6 17:27 libpmi.so.0 -> libpmi.so.0.0.0
-rwxr-xr-x 1 user user 241640 jul 6 17:27 libpmi.so.0.0.0
</pre>
<p><b>NOTE</b>: Since Slurm and PMIx lower than 4.x both provide libpmi[2].so
libraries, we recommend you install both pieces of software in
different locations. Otherwise, these same libraries might end up being
installed under standard locations like /usr/lib64 and the
package manager would error out, reporting the conflict.</p>
<p><b>NOTE</b>: Any application compiled against PMIx should use the same PMIx
or at least a PMIx with the same security domain than the one Slurm is using,
otherwise there could be authentication issues. E.g. one PMIx compiled
--with-munge while another compiled --without-munge (the default since PMIx
4.2.4). A workaround which might work is to specify the desired security method
adding "--mca psec native" to the cli or exporting PMIX_MCA_psec=native
environment variable.
</p>
<p><b>NOTE</b>: If you are setting up a test environment using multiple-slurmd,
the TmpFS option in your slurm.conf needs to be specified and the number of
directory paths created needs to equal the number of nodes. These directories
are used by the Slurm PMIx plugin to create temporal files and/or UNIX sockets.
Here is an example setup for two nodes named compute[1-2]:</p>
<pre>
slurm.conf:
TmpFS=/home/user/slurm/22.05/inst/tmp/slurmd-tmpfs-%n
$ mkdir /home/user/slurm/22.05/inst/tmp/slurmd-tmpfs-compute1
$ mkdir /home/user/slurm/22.05/inst/tmp/slurmd-tmpfs-compute2
</pre>
<h3 id="pmix_testing">Testing Slurm and PMIx
<a class="slurm_link" href="#pmix_testing"></a>
</h3>
<p>It is possible to directly test Slurm and PMIx without needing to have an
MPI implementation installed. Here is an example demonstrating that
both components work properly:</p>
<pre>
$ srun --mpi=list
MPI plugin types are...
cray_shasta
none
pmi2
pmix
specific pmix plugin versions available: pmix_v3,pmix_v4
$ srun --mpi=pmix_v4 -n2 -N2 \
&gt; /home/user/git/pmix/test/pmix_client -n 2 --job-fence -c
==141756== OK
==141774== OK
</pre>
<h2 id="open_mpi"><a href="https://open-mpi.org"><b>OpenMPI</b></a>
<a class="slurm_link" href="#open_mpi"></a>
</h2>
<p>The current versions of Slurm and Open MPI support task launch using the
<span class="commandline">srun</span> command.</p>
<p>If OpenMPI is configured with <i>--with-pmi=</i> pointing to either Slurm's
PMI-1 libpmi.so or PMI-2 libpmi2.so libraries, the OMPI jobs can then be
launched directly using the srun command. This is the preferred mode of
operation since accounting features and affinity done by Slurm will become
available. If pmi2 support is enabled, the option '--mpi=pmi2' must be
specified on the srun command line.
Alternately configure 'MpiDefault=pmi' or 'MpiDefault=pmi2' in slurm.conf.</p>
<p>Starting with Open MPI version 3.1, PMIx is natively supported. To launch
Open MPI applications using PMIx the '--mpi=pmix' option must be specified on
the srun command line or 'MpiDefault=pmix' must be configured in slurm.conf.</p>
<p>It is also possible to build OpenMPI using an external PMIx installation.
Refer to the OpenMPI documentation for a detailed procedure but it basically
consists of specifying <b>--with-pmix=PATH</b> when configuring OpenMPI.
Note that if building OpenMPI using an external PMIx installation, both OpenMPI
and PMIx need to be built against the same libevent/hwloc installations.
OpenMPI configure script provides the options
<b>--with-libevent=PATH</b> and/or <b>--with-hwloc=PATH</b> to make OpenMPI
match what PMIx was built against.</p>
<p>A set of parameters are available to control the behavior of the
Slurm PMIx plugin, read <a href="mpi.conf.html">mpi.conf</a> for more
information.</p>
<p><b>NOTE</b>: OpenMPI has a limitation that does not support calls to
<i>MPI_Comm_spawn()</i> from within a Slurm allocation. If you need to
use the <i>MPI_Comm_spawn()</i> function you will need to use another MPI
implementation combined with PMI-2 since PMIx doesn't support it either.</p>
<p><b>NOTE</b>: Some kernels and system configurations have resulted in a locked
memory too small for proper OpenMPI functionality, resulting in application
failure with a segmentation fault. This may be fixed by configuring the slurmd
daemon to execute with a larger limit. For example, add "LimitMEMLOCK=infinity"
to your slurmd.service file.</p>
<hr size=4 width="100%">
<h2 id="intel_mpi"><b>Intel MPI</b>
<a class="slurm_link" href="#intel_mpi"></a>
</h2>
<p>Intel&reg; MPI Library for Linux OS supports the following methods of
launching the MPI jobs under the control of the Slurm job manager:
<li><a href="#intel_mpirun_hydra">The <i>mpirun</i> command over the Hydra PM
</a></li>
<li><a href="#intel_srun">The <i>srun</i> command (Slurm, recommended)</a></li>
</ul>
</p>
<p>This description provides detailed information on these two methods.</p>
<h3 id="intel_mpirun_hydra">The mpirun Command over the Hydra Process Manager
<a class="slurm_link" href="#intel_mpirun_hydra"></a>
</h3>
<p>Slurm is supported by the <i>mpirun</i> command of the Intel&reg; MPI Library
through the Hydra Process Manager by default. When launched within an allocation
the <i>mpirun</i> command will automatically read the environment variables set
by Slurm such as nodes, cpus, tasks, etc, in order to start the required
hydra daemons on every node. These daemons will be started using srun and
will subsequently start the user application. Since Intel&reg; MPI supports
only PMI-1 and PMI-2 (not PMIx), it is highly recommended to configure this mpi
implementation to use Slurm's PMI-2, which offers better scalability than PMI-1.
PMI-1 is not recommended and should be deprecated soon.</p>
<p>Below is an example of how a user app can be launched within an exclusive
allocation of 10 nodes using Slurm's PMI-2 library installed from contribs:</p>
<pre>
$ salloc -N10 --exclusive
$ export I_MPI_PMI_LIBRARY=/path/to/slurm/lib/libpmi2.so
$ mpirun -np &lt;num_procs&gt; user_app.bin
</pre>
<p>Note that by default Slurm will inject two environment variables to ensure
mpirun or mpiexec will use the Slurm bootstrap mechanism (srun) to launch Hydra.
With these, Hydra will also pass the argument '--external-launcher' to srun in
order to not consider these hydra processes as regular steps. This automatic
variable injection mechanism can be disabled by setting
"MpiParams=disable_slurm_hydra_bootstrap" in slurm.conf, with the exception
of the cases where "slurm" is already explicitly set as a bootstrap.</p>
<p>It is possible to run Intel MPI using a different bootstrap mechanism. To do
so, explicitly set the following environment variable prior to submitting the
job with sbatch or salloc:</p>
<pre>
$ export I_MPI_HYDRA_BOOTSTRAP=ssh
$ salloc -N10
$ mpirun -np &lt;num_procs&gt; user_app.bin
</pre>
<h3 id="intel_srun">The srun Command (Slurm, recommended)
<a class="slurm_link" href="#intel_srun"></a>
</h3>
<p>This method is also supported by the Intel&reg; MPI Library.
This method is the best integrated with Slurm and supports process tracking,
accounting, task affinity, suspend/resume and other features.
As in the previous case, we show an example of how a user app can be
launched within an exclusive allocation of 10 nodes using Slurm's PMI-2 library
installed from contribs, allowing it to take advantage of of all the Slurm
features. This can be done with <i>sbatch</i> or <i>salloc</i> commands:</p>
<pre>
$ salloc -N10 --exclusive
$ export I_MPI_PMI_LIBRARY=/path/to/slurm/lib/libpmi2.so
$ srun user_app.bin</i>
</pre>
<p><b>NOTE</b>: The reason we're pointing manually to Slurm's PMI-1 or PMI-2
library is for licensing reasons. IMPI doesn't link directly to any external
PMI implementations so, unlike other stacks (OMPI, MPICH, MVAPICH...), Intel is
not built against Slurm libs. Pointing to this library will cause Intel to
dlopen and use this PMI library.</p>
<p><b>NOTE</b>: There is no official support provided by Intel against PMIx
libraries. Since IMPI is based on MPICH, using PMIx with Intel may work due to
PMIx maintaining compatibility with pmi2 (which are the libraries used in MPICH)
but it is not guaranteed to run in all cases and PMIx could break this
compatibility in future versions.</p>
<p> For more information see:
<a href="https://software.intel.com/en-us/intel-mpi-library">Intel MPI Library
</a>.</p>
<h2 id="mpich">
<a href="https://www.mpich.org/"><b>MPICH</b></a>
<a class="slurm_link" href="#mpich"></a>
</h2>
<p>MPICH was formerly known as MPICH2.</p>
<p>MPICH jobs can be launched using <b>srun</b> or <b>mpiexec</b>.
Both modes of operation are described below. The MPICH implementation supports
PMI-1, PMI-2 and PMIx (starting with MPICH v4).
</p>
<p>Note that by default Slurm will inject two environment variables to ensure
mpirun or mpiexec will use the Slurm bootstrap mechanism (srun) to launch Hydra.
With these, Hydra will also pass the argument '--external-launcher' to srun in
order to not consider these hydra processes as regular steps. This automatic
variable injection mechanism can be disabled by setting
"MpiParams=disable_slurm_hydra_bootstrap" in slurm.conf, with the exception
of the cases where "slurm" is already explicitly set as a bootstrap.</p>
<p>It is possible to run MPICH using a different bootstrap mechanism. To do
so, explicitly set the following environment variable prior to submitting the
job with sbatch or salloc:</p>
<pre>
$ export HYDRA_BOOTSTRAP=ssh
$ salloc -N10
$ mpirun -np &lt;num_procs&gt; user_app.bin
</pre>
<h3 id="mpich_pmi_slurm">
MPICH with srun and linked with Slurm's PMI-1 or PMI-2 libs
<a class="slurm_link" href="#mpich_pmi_slurm"></a>
</h3>
<p>MPICH can be built specifically for use with Slurm and its PMI-1 or PMI-2
libraries using a configure line similar to that shown below. Building this way
will force the use of this library on every execution. Note that the
LD_LIBRARY_PATH may not be necessary depending on your Slurm installation path:
</p>
<p> For PMI-2:</p>
<pre>
user@testbox:~/mpich-4.0.2/build$ LD_LIBRARY_PATH=~/slurm/22.05/inst/lib/ \
&gt; ../configure --prefix=/home/user/bin/mpich/ --with-pmilib=slurm \
&gt; --with-pmi=pmi2 --with-slurm=/home/lipi/slurm/master/inst
</pre>
<p>
or for PMI-1:
</p>
<pre>
user@testbox:~/mpich-4.0.2/build$ LD_LIBRARY_PATH=~/slurm/22.05/inst/lib/ \
&gt; ../configure --prefix=/home/user/bin/mpich/ --with-pmilib=slurm \
&gt; --with-slurm=/home/user/slurm/22.05/inst
</pre>
<p> These configure lines will detect the Slurm's installed PMI libraries and
link against them, but <b>will not install</b> the mpiexec commands. Since PMI-1
is already old and doesn't scale well we don't recommend you link against it.
It is preferable to use PMI-2. You can follow this example to run a job with
PMI-2:</p>
<pre>
$ mpicc -o hello_world hello_world.c
$ srun --mpi=pmi2 ./hello_world
</pre>
<p>A Slurm upgrade will not affect this MPICH installation. There is only one
unlikely scenario where a recompile of the MPI stack would be needed after an
upgrade, which is when we forcibly link against Slurm's PMI-1 and/or PMI-2
libraries and if their APIs ever changed. These should not change often but
if it were to happen, it would be noted in Slurm's RELEASE_NOTES file.</p>
<h3 id="mpich_slurm_pmix">MPICH with PMIx and integrated with Slurm
<a class="slurm_link" href="#mpich_slurm_pmix"></a>
</h3>
<p> You can also build MPICH using an external PMIx library which should be the
same one used when building Slurm:</p>
<pre>
$ LD_LIBRARY_PATH=~/slurm/22.05/inst/lib/ ../configure \
&gt; --prefix=/home/user/bin/mpich/ \
&gt; --with-pmix=/home/user/bin/pmix_4.1.2/ \
&gt; --with-pmi=pmix \
&gt; --with-slurm=/home/user/slurm/master/inst
</pre>
<p>After building this way, any execution must be made with Slurm (srun) since
the Hydra process manager is not installed, as it was in previous examples.
Compile and run a process with:
</p>
<pre>
$ mpicc -o hello_world hello_world.c
$ srun --mpi=pmix ./hello_world
</pre>
<h3 id="mpich_slurm_hydra">MPICH with its internal PMI and integrated with Slurm
<a class="slurm_link" href="#mpich_slurm_hydra"></a>
</h3>
<p>Another option is to just compile MPICH but not set <b>--with-pmilib</b>,
<b>--with-pmix</b> or <b>--with-pmi</b>, and only keep <b>--with-slurm</b>.
In that case, MPICH will not forcibly link against any PMI libraries and it will
install the mpiexec.hydra command by default. This will cause it to use its
internal PMI implementation (based on PMI-1) and Slurm API functions to detect
the job environment and launch processes accordingly:
</p>
<pre>
user@testbox:~/mpich-4.0.2/build$ ../configure \
&gt; --prefix=/home/user/bin/mpich/ \
&gt; --with-slurm=/home/user/slurm/22.05/inst
</pre>
<p>Then the app can be run with srun or mpiexec:</p>
<pre>
$ mpicc -o hello_world hello_world.c
$ srun ./hello_world
</pre>
<p>or</p>
<pre>
$ mpiexec.hydra ./hello_world
</pre>
<p>mpiexec.hydra will spawn its daemons using Slurm steps launched with srun and
will use its internal PMI implementation.<p>
<p><b>NOTE</b>: In this case, compiling with the <b>--with-slurm</b> option
created the Hydra bootstrap commands (mpiexec.hydra and others) and linked them
against the versioned Slurm's main public API (libslurm.so.X.0.0). That is
because these commands use some Slurm functions to detect the job environment.
Be aware then that upgrading Slurm would need a recompile of the MPICH stack.
It is usually enough to symlink the name of the linked library to the new one,
but this is not guaranteed to work.
</p>
<h3 id="mpich_hydra">MPICH without Slurm integration
<a class="slurm_link" href="#mpich_hydra"></a>
</h3>
<p>Finally, it is possible to compile MPICH without integrating it with Slurm.
In that case it will not identify the job and will just run the processes as if
it were on a local machine. We recommend reading MPICH documentation and the
configure scripts for more information on the existing possibilities.</p>
<hr size=4 width="100%">
<h2 id="mvapich2">
<a href="https://mvapich.cse.ohio-state.edu">
<b>MVAPICH2</b>
</a>
<a class="slurm_link" href="#mvapich2"></a>
</h2>
<p>MVAPICH2 has support for Slurm. To enable it you need to build MVAPICH2
with a command similar to this:</p>
<pre>
$ ./configure --prefix=/home/user/bin/mvapich2 \
&gt; --with-slurm=/home/user/slurm/22.05/inst/
</pre>
<p><b>NOTE</b>:In certain MVAPICH2 versions and when building with GCC > 10.x,
it is possible that these flags must be prepended to the configure line:</p>
<pre>
FFLAGS="-std=legacy" FCFLAGS="-std=legacy" ./configure ...
</pre>
<p>When MVAPICH2 is built with Slurm support it will detect that it is
within a Slurm allocation, and will use the 'srun' command to spawn its hydra
daemons. It does not link to the Slurm API, which means that during an upgrade
of Slurm there is no need to recompile MVAPICH2. By default it will use the
internal PMI implementation.</p>
<p>Note that by default Slurm will inject two environment variables to ensure
mpirun or mpiexec will use the Slurm bootstrap mechanism (srun) to launch Hydra.
With these, Hydra will also pass the argument '--external-launcher' to srun in
order to not consider these hydra processes as regular steps. This automatic
variable injection mechanism can be disabled by setting
"MpiParams=disable_slurm_hydra_bootstrap" in slurm.conf, with the exception
of the cases where "slurm" is already explicitly set as a bootstrap.</p>
<p>It is possible to run MVAPICH2 using a different bootstrap mechanism. To do
so, explicitly set the following environment variable prior to submitting the
job with sbatch or salloc:</p>
<pre>
$ export HYDRA_BOOTSTRAP=ssh
$ salloc -N10
$ mpirun -np &lt;num_procs&gt; user_app.bin
</pre>
<h3 id="mvapich_pmi_slurm">
MVAPICH2 with srun and linked with Slurm's PMI-1 or PMI-2 libs
<a class="slurm_link" href="#mvapich_pmi_slurm"></a>
</h3>
<p>It is possible to force MVAPICH2 to use one of the Slurm's PMI-1
(libpmi.so.0.0.0)or PMI-2 (libpmi2.so.0.0.0) libraries. Building with this mode
will cause all the executions to use Slurm and its PMI libraries.
The Hydra process manager binaries (mpiexec) won't be installed. In fact the
mpiexec command will exist as a symbolic link to Slurm's srun command. It is
recommended not to use PMI-1, but to use at least PMI-2 libs.
See below for an example of how to configure and usage:</p>
<pre>
For PMI-2:
./configure --prefix=/home/user/bin/mvapich2 \
&gt; --with-slurm=/home/user/slurm/master/inst/ \
&gt; --with-pm=slurm --with-pmi=pmi2
and for PMI-1:
./configure --prefix=/home/user/bin/mvapich2 \
&gt; --with-slurm=/home/user/slurm/master/inst/ \
&gt; --with-pm=slurm --with-pmi=pmi1
</pre>
<p>To compile and run a user application in Slurm:</p>
<pre>
$ mpicc -o hello_world hello_world.c
$ srun --mpi=pmi2 ./hello_world
</pre>
<p>For more information, please see the MVAPICH2 documentation on their
<a href="https://mvapich.cse.ohio-state.edu/">webpage</a></p>
<h3 id="mvapich_pmix_slurm">
MVAPICH2 with Slurm support and linked with external PMIx
<a class="slurm_link" href="#mvapich_pmix_slurm"></a>
</h3>
<p>It is possible to use PMIx within MVAPICH2 and integrated with Slurm. This
way no Hydra Process Manager will be installed and the user apps will need to
run with srun, assuming Slurm has been compiled against the same or a compatible
PMIx version as the one used when building MVAPICH2.</p>
<p>To build MVAPICH2 to use PMIx and integrated with Slurm, a configuration line
similar to this is needed:</p>
<pre>
./configure --prefix=/home/user/bin/mvapich2 \
&gt; --with-slurm=/home/user/slurm/master/inst/ \
&gt; --with-pm=slurm \
&gt; --with-pmix=/home/user/bin/pmix_4.1.2/ \
&gt; --with-pmi=pmix
</pre>
<p>Running a job looks similar to previous examples:</p>
<pre>
$ mpicc -o hello_world hello_world.c
$ srun --mpi=pmix ./hello_world
</pre>
<p><b>NOTE</b>: In the MVAPICH2 case, compiling with integration with Slurm
(<b>--with-slurm</b>) doesn't add any dependency to commands or libraries, so
upgrading Slurm should be safe without any need to recompile MVAPICH2. There
is only one unlikely scenario where a recompile of the MPI stack would be
needed after an upgrade, which is when we forcibly link against Slurm's PMI-1
and/or PMI-2 libraries and if their APIs ever changed. These should not change
often but if it were to happen, it would be noted in Slurm's RELEASE_NOTES
file.</p>
<h2 id="hpe_cray_pmi">
<b>HPE Cray PMI support</b>
<a class="slurm_link" href="#hpe_cray_pmi"></a>
</h2>
<p>Slurm comes by default with a Cray PMI vendor-specific plugin which provides
compatibility with the HPE Cray Programming Environment's PMI. It is intended to
be used in applications built with this environment on HPE Cray machines.</p>
<p>The plugin is named <i>cray_shasta</i> (Shasta was the first Cray
architecture this plugin supported) and built by default in all Slurm
installations. Its availability is shown by running the following command:</p>
<pre>
$ srun --mpi=list
MPI plugin types are...
cray_shasta
none
</pre>
<p>The Cray PMI plugin will use some reserved ports for its communication. These
ports are configurable by using <i>--resv-ports</i> option on the command line
with <b>srun</b>, or by setting <i>MpiParams=ports</i>=[<i>port_range</i>]
in your slurm.conf. The first port listed in this option will be used as the
PMI control port, defined by Cray as the <b>PMI_CONTROL_PORT</b> environment
variable. There cannot be more than one application launched in the same node
using the same <b>PMI_CONTROL_PORT</b>.</p>
<p>This plugin does not support MPMD/heterogeneous jobs and it requires
<i>libpals >= 0.2.8</i>.</p>
<p style="text-align:center;">Last modified 12 December 2024</p>
<!--#include virtual="footer.txt"-->