====== Compiling and Running C++ MPI Applications ======
This guide explains how to load the Open MPI module, compile a distributed C++ program using the MPI wrapper, and submit an MPI job to the **unite** partition on the cluster.
===== IMPORTANT: Compilation Policy =====
^ WARNING: Do not run compilation commands directly on the Login Node! ^
| High-performance libraries like Open MPI can cause heavy overhead during compilation. Always allocate an interactive compute node session on the **unite** partition using **`srun`** before building your code. |
===== Available Modules =====
To see the available Open MPI configurations, run:
$ module avail unite/mpi
===== Step-by-Step Guide =====
==== 1. Request an Interactive Node for Compilation ====
Switch to a safe environment on a compute node under the **unite** partition:
$ srun --partition=unite --cpus-per-task=2 --time=00:30:00 --pty bash
Once your command prompt updates, you are active on a compute node.
==== 2. Load the Required Modules ====
MPI modules require a compatible compiler toolchain. Load both the GCC compiler and the corresponding Open MPI library:
$module load unite/compilers/gcc-14.3.0
$ module load unite/mpi/4.1.0
To verify your environment's active C++ MPI compiler wrapper, run:
$ mpicxx --version
==== 3. Create a Sample MPI C++ File ====
Create a parallel C++ file named `mpi_hello.cpp`. This example initializes the MPI environment, determines the rank of each process, and identifies how many total processes are running.
#include
#include
int main(int argc, char** argv) {
// Initialize the MPI environment
MPI_Init(&argc, &argv);
// Get the number of processes
int world_size;
MPI_Comm_size(MPI_COMM_WORLD, &world_size);
// Get the rank (ID) of the process
int world_rank;
MPI_Comm_rank(MPI_COMM_WORLD, &world_rank);
// Get the name of the processor node
char processor_name[MPI_MAX_PROCESSOR_NAME];
int name_len;
MPI_Get_processor_name(processor_name, &name_len);
// Print off a hello world message from each process
std::cout << "Hello world from process rank " << world_rank
<< " out of " << world_size
<< " processors on node " << processor_name << std::endl;
// Finalize the MPI environment.
MPI_Finalize();
return 0;
}
==== 4. Compilation ====
Compile your application using the `mpicxx` wrapper script, which handles adding all necessary linking flags for Open MPI automatically.
$ mpicxx -O3 -std=c++17 mpi_hello.cpp -o mpi_hello_executable
* **`mpicxx`**: The C++ compilation wrapper script for Open MPI.
* **`-O3`**: High-level optimization flag.
* **`-o mpi_hello_executable`**: The resulting binary output.
Exit your interactive session to return to the login node when the build completes successfully:
$ exit
===== Running Distributed Jobs via Slurm Batch =====
To launch an MPI job across multiple processors or nodes via Slurm, create a batch script named `submit_mpi.sh`:
#!/bin/bash
#SBATCH --job-name=mpi_cpp_job
#SBATCH --partition=unite # Target partition for the UNITE cluster
#SBATCH