<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://wiki.snu.edu.in/index.php?action=history&amp;feed=atom&amp;title=Magus02%2FMPI_Usage</id>
	<title>Magus02/MPI Usage - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.snu.edu.in/index.php?action=history&amp;feed=atom&amp;title=Magus02%2FMPI_Usage"/>
	<link rel="alternate" type="text/html" href="https://wiki.snu.edu.in/index.php?title=Magus02/MPI_Usage&amp;action=history"/>
	<updated>2026-11-04T19:44:28Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.35.9</generator>
	<entry>
		<id>https://wiki.snu.edu.in/index.php?title=Magus02/MPI_Usage&amp;diff=1186&amp;oldid=prev</id>
		<title>Deepak: Created page with &quot;{{DISPLAYTITLE:MPI Usage — Magus02 HPC}} &lt;div style=&quot;background:#0d1b2a;border:1px solid #1e3a5a;border-radius:8px;padding:12px 18px;margin-bottom:20px;font-size:13px;font-f...&quot;</title>
		<link rel="alternate" type="text/html" href="https://wiki.snu.edu.in/index.php?title=Magus02/MPI_Usage&amp;diff=1186&amp;oldid=prev"/>
		<updated>2026-04-20T06:44:11Z</updated>

		<summary type="html">&lt;p&gt;Created page with &amp;quot;{{DISPLAYTITLE:MPI Usage — Magus02 HPC}} &amp;lt;div style=&amp;quot;background:#0d1b2a;border:1px solid #1e3a5a;border-radius:8px;padding:12px 18px;margin-bottom:20px;font-size:13px;font-f...&amp;quot;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;{{DISPLAYTITLE:MPI Usage — Magus02 HPC}}&lt;br /&gt;
&amp;lt;div style=&amp;quot;background:#0d1b2a;border:1px solid #1e3a5a;border-radius:8px;padding:12px 18px;margin-bottom:20px;font-size:13px;font-family:monospace;color:#5ba3d9;&amp;quot;&amp;gt;&lt;br /&gt;
📍 [[Magus02/Knowledge_Base|Magus02 Knowledge Base]] → HPC User → MPI Usage&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
MPI (Message Passing Interface) is the standard for '''distributed-memory parallel programming''' — running a program as multiple independent processes that communicate by passing messages, potentially across many compute nodes.&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
== What is MPI? ==&lt;br /&gt;
&lt;br /&gt;
MPI programs spawn multiple '''processes''' (as opposed to OpenMP's threads), each with its own separate memory space. Processes coordinate by explicitly sending and receiving messages. This allows MPI programs to scale across dozens or hundreds of nodes, making it the dominant model for large-scale HPC workloads.&lt;br /&gt;
&lt;br /&gt;
On Magus02:&lt;br /&gt;
* Two MPI libraries are available: '''Open MPI''' and '''Intel MPI'''&lt;br /&gt;
* Never load both at the same time — they conflict&lt;br /&gt;
* MPI is always loaded via the [[Magus02/Modules|module system]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;background:#2a1a00;border-left:4px solid #f0c040;border-radius:6px;padding:14px 18px;margin:16px 0;font-size:14px;color:#d4b870;&amp;quot;&amp;gt;&lt;br /&gt;
⚠️ &amp;lt;strong&amp;gt;Critical:&amp;lt;/strong&amp;gt; Load exactly one MPI module. Loading both &amp;lt;code&amp;gt;mpi/openmpi&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;mpi/intelmpi&amp;lt;/code&amp;gt; simultaneously will cause conflicts and unpredictable failures. Use &amp;lt;code&amp;gt;module purge&amp;lt;/code&amp;gt; at the start of every jobscript.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Loading MPI Modules ==&lt;br /&gt;
&lt;br /&gt;
=== Open MPI ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ module purge&lt;br /&gt;
$ module load gcc/11.2.0&lt;br /&gt;
$ module load mpi/openmpi&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Intel MPI ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ module purge&lt;br /&gt;
$ module load intel/oneapi&lt;br /&gt;
$ module load mpi/intelmpi&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Compiling MPI Code ==&lt;br /&gt;
&lt;br /&gt;
MPI provides '''compiler wrappers''' that automatically include the correct headers and libraries. Always use these wrappers instead of calling &amp;lt;code&amp;gt;gcc&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;icc&amp;lt;/code&amp;gt; directly.&lt;br /&gt;
&lt;br /&gt;
=== Open MPI Compiler Wrappers ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:100%;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;background:#0d1b2a;color:#94a8be;&amp;quot; | Language&lt;br /&gt;
! style=&amp;quot;background:#0d1b2a;color:#94a8be;&amp;quot; | Wrapper&lt;br /&gt;
! style=&amp;quot;background:#0d1b2a;color:#94a8be;&amp;quot; | Example&lt;br /&gt;
|-&lt;br /&gt;
| C || &amp;lt;code&amp;gt;mpicc&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;mpicc -O2 myprog.c -o myprog&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| C++ || &amp;lt;code&amp;gt;mpicxx&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;mpicxx -O2 myprog.cpp -o myprog&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Fortran || &amp;lt;code&amp;gt;mpifort&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;mpifort -O2 myprog.f90 -o myprog&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Intel MPI Compiler Wrappers ===&lt;br /&gt;
&lt;br /&gt;
Intel MPI ships '''two sets''' of wrappers — one for GCC and one for Intel compilers. Use the right set for your code.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:100%;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;background:#0d1b2a;color:#94a8be;&amp;quot; | Underlying Compiler&lt;br /&gt;
! style=&amp;quot;background:#0d1b2a;color:#94a8be;&amp;quot; | C&lt;br /&gt;
! style=&amp;quot;background:#0d1b2a;color:#94a8be;&amp;quot; | C++&lt;br /&gt;
! style=&amp;quot;background:#0d1b2a;color:#94a8be;&amp;quot; | Fortran&lt;br /&gt;
|-&lt;br /&gt;
| GCC-based || &amp;lt;code&amp;gt;mpicc&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;mpicxx&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;mpifort&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Intel-based || &amp;lt;code&amp;gt;mpiicc&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;mpiicpc&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;mpiifort&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Example with Intel compilers:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ module purge&lt;br /&gt;
$ module load intel/oneapi mpi/intelmpi&lt;br /&gt;
&lt;br /&gt;
$ mpiicc  -O2 myprog.c   -o myprog   # C with Intel compiler&lt;br /&gt;
$ mpiicpc -O2 myprog.cpp -o myprog   # C++ with Intel compiler&lt;br /&gt;
$ mpiifort -O2 myprog.f90 -o myprog  # Fortran with Intel compiler&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On most systems, environment variables are also available:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ $MPICC  myprog.c   -O2 -o myprog&lt;br /&gt;
$ $MPICXX myprog.cpp -O2 -o myprog&lt;br /&gt;
$ $MPIFC  myprog.f90 -O2 -o myprog&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Running MPI Programs ==&lt;br /&gt;
&lt;br /&gt;
=== Basic Launch ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# General form:&lt;br /&gt;
$ mpirun -n &amp;lt;num_processes&amp;gt; [options] ./my_program [program_args]&lt;br /&gt;
&lt;br /&gt;
# Example: run with 256 MPI processes:&lt;br /&gt;
$ mpirun -n 256 ./my_mpi_program input.dat&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Note: &amp;lt;code&amp;gt;mpirun&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;mpiexec&amp;lt;/code&amp;gt; are synonymous in Open MPI. In Intel MPI it is &amp;lt;code&amp;gt;mpiexec.hydra&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;mpirun&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Key mpirun Options ===&lt;br /&gt;
&lt;br /&gt;
==== Open MPI ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:100%;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;background:#0d1b2a;color:#94a8be;&amp;quot; | Option&lt;br /&gt;
! style=&amp;quot;background:#0d1b2a;color:#94a8be;&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;-n &amp;lt;N&amp;gt;&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;-np &amp;lt;N&amp;gt;&amp;lt;/code&amp;gt; || Total number of MPI processes&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;-npernode &amp;lt;N&amp;gt;&amp;lt;/code&amp;gt; || Number of processes per node&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;-npersocket &amp;lt;N&amp;gt;&amp;lt;/code&amp;gt; || Number of processes per socket&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;-wdir &amp;lt;dir&amp;gt;&amp;lt;/code&amp;gt; || Change working directory before execution&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;-x VAR&amp;lt;/code&amp;gt; || Export environment variable to remote processes&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;-output-filename &amp;lt;name&amp;gt;&amp;lt;/code&amp;gt; || Redirect output to files named &amp;lt;name&amp;gt;.&amp;lt;rank&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;--help&amp;lt;/code&amp;gt; || List all available options&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Intel MPI ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:100%;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;background:#0d1b2a;color:#94a8be;&amp;quot; | Option&lt;br /&gt;
! style=&amp;quot;background:#0d1b2a;color:#94a8be;&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;-n &amp;lt;N&amp;gt;&amp;lt;/code&amp;gt; || Total number of MPI processes&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;-ppn &amp;lt;N&amp;gt;&amp;lt;/code&amp;gt; || Processes per node (set &amp;lt;code&amp;gt;I_MPI_JOB_RESPECT_PROCESS_PLACEMENT=off&amp;lt;/code&amp;gt; if needed)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;-wdir &amp;lt;dir&amp;gt;&amp;lt;/code&amp;gt; || Change working directory&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;-outfile-pattern &amp;lt;name&amp;gt;&amp;lt;/code&amp;gt; || Redirect stdout to file&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;-g&amp;lt;/code&amp;gt; || Enable debug symbols&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;-O2&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;-O3&amp;lt;/code&amp;gt; || Optimization level&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Complete Slurm Jobscript — MPI ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
#SBATCH --job-name=mpi_vasp&lt;br /&gt;
#SBATCH --partition=medium&lt;br /&gt;
#SBATCH --nodes=4&lt;br /&gt;
#SBATCH --ntasks-per-node=64&lt;br /&gt;
#SBATCH --mem=512G&lt;br /&gt;
#SBATCH --time=7-00:00:00&lt;br /&gt;
#SBATCH --output=vasp_%j.out&lt;br /&gt;
#SBATCH --error=vasp_%j.err&lt;br /&gt;
#SBATCH --mail-type=END,FAIL&lt;br /&gt;
#SBATCH --mail-user=your_email@snu.edu.in&lt;br /&gt;
&lt;br /&gt;
module purge&lt;br /&gt;
module load intel/oneapi&lt;br /&gt;
module load mpi/intelmpi&lt;br /&gt;
module load mkl&lt;br /&gt;
&lt;br /&gt;
# Run with total tasks = nodes × ntasks-per-node = 256:&lt;br /&gt;
mpirun -n $SLURM_NTASKS ./vasp_std&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Process Binding ==&lt;br /&gt;
&lt;br /&gt;
Binding MPI processes to specific CPU cores improves performance by ensuring each process stays close to its local memory (NUMA-awareness). Both Open MPI and Intel MPI support binding.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;background:#2a1a00;border-left:4px solid #f0c040;border-radius:6px;padding:14px 18px;margin:16px 0;font-size:14px;color:#d4b870;&amp;quot;&amp;gt;&lt;br /&gt;
⚠️ &amp;lt;strong&amp;gt;Multi-job binding conflict:&amp;lt;/strong&amp;gt; MPI binding is &amp;lt;strong&amp;gt;on by default&amp;lt;/strong&amp;gt; in most implementations. If you run more than one MPI job on the same hardware simultaneously (e.g. in a non-exclusive allocation), all jobs assume they are the only job and bind themselves to the same cores — resulting in &amp;lt;em&amp;gt;1/N&amp;lt;/em&amp;gt; performance while other cores sit idle.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Open MPI — Binding Options ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Bind one process per core:&lt;br /&gt;
$ mpirun -n 64 --bind-to core ./my_mpi_program&lt;br /&gt;
&lt;br /&gt;
# Bind one process per socket:&lt;br /&gt;
$ mpirun -n 8 --bind-to socket ./my_mpi_program&lt;br /&gt;
&lt;br /&gt;
# Report binding (for verification):&lt;br /&gt;
$ mpirun -n 64 --bind-to core --report-bindings ./my_mpi_program 2&amp;gt;&amp;amp;1 | head -20&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Intel MPI — Binding Options ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Bind to cores:&lt;br /&gt;
$ export I_MPI_PIN=1&lt;br /&gt;
$ export I_MPI_PIN_DOMAIN=core&lt;br /&gt;
$ mpirun -n 64 ./my_mpi_program&lt;br /&gt;
&lt;br /&gt;
# Check binding:&lt;br /&gt;
$ export I_MPI_DEBUG=4&lt;br /&gt;
$ mpirun -n 4 ./my_mpi_program&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== References ==&lt;br /&gt;
&lt;br /&gt;
* [[Magus02/NUMA|NUMA Architecture — Memory Locality]]&lt;br /&gt;
* [[Magus02/Batch_Scheduler|Batch Scheduler — MPI Jobscript]]&lt;br /&gt;
* [[Magus02/OpenMP_Usage|OpenMP Usage — Hybrid Jobs]]&lt;br /&gt;
* [[Magus02/Compiler|Compilers on Magus02]]&lt;br /&gt;
* [https://www.open-mpi.org/doc/v4.0/man1/mpiexec.1.php Open MPI mpiexec man page]&lt;br /&gt;
* [https://software.intel.com/content/www/us/en/develop/documentation/mpi-developer-reference-linux Intel MPI Reference]&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&amp;lt;div style=&amp;quot;font-family:monospace;font-size:11px;color:#484f58;text-align:right;&amp;quot;&amp;gt;&lt;br /&gt;
[[Magus02/Knowledge_Base|↑ Back to Knowledge Base]] · Maintained by HPC Administration · wiki.snu.edu.in&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;/div&gt;</summary>
		<author><name>Deepak</name></author>
	</entry>
</feed>