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.
| 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. |
To see the available Open MPI configurations, run:
$ module avail unite/mpi
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.
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
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 <mpi.h> #include <iostream> 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; }
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
To launch an MPI job across multiple processors or nodes via Slurm, create a batch script named `submit_mpi.sh`:
<file bash submit_mpi.sh> #!/bin/bash #SBATCH –job-name=mpi_cpp_job #SBATCH –partition=unite # Target partition for the UNITE cluster #SBATCH