Сборка и запуск программ для распределенной памяти (технология MPI) в разделе «gpu»

Сборка MPI-программы на языке C/С++

На суперкомпьютере установлено несколько компиляторов и библиотек MPI. Необходимо выбрать совместимую пару «компилятор+библиотека» и загрузить соответствующие модули. 

user@master ~$ module load gcc-9.4.0; module load ompi4.1.1 # для использования gcc 9.4.0 + OpenMPI 4.1.1
user@master ~$ module load intel2017; module load impi2017 # для использования icc 17.0.0 + Intel MPI 17.0.0
user@master ~$ module load compiler/2022.0.2; module load mpi/2021.5.1 # для использования icpc (ICC) 2021.5.0 + Intel MPI 2021.5.1 (оба из пакета oneAPI)

Далее нужно выполнить компиляцию и линковку вашей программы

user@master ~$ echo '#include <mpi.h>
#include <stdio.h>
int main(int argc, char** argv) {
    int world_size, world_rank, name_len;
    char processor_name[MPI_MAX_PROCESSOR_NAME];
    MPI_Init(&argc, &argv); // Initialize the MPI environment
    MPI_Comm_size(MPI_COMM_WORLD, &world_size); // Get the number of processes
    MPI_Comm_rank(MPI_COMM_WORLD, &world_rank); // Get the rank of the process
    MPI_Get_processor_name(processor_name, &name_len); // Get the name of the processor
    printf("Hello world from processor %s, rank %d out of %d processors\n", processor_name, world_rank, world_size); // Print off a hello world message
    MPI_Finalize(); // Finalize the MPI environment.
}' >helloMPI.c
user@master ~$ mpicc -o helloMPI_gcc_9.4.0_ompi_4.1.1 helloMPI.c # если используется gcc 9.4.0 + OpenMPI 4.1.1, или
user@master ~$ mpicc -o helloMPI_icc_17.0.0_impi_17.0.0 helloMPI.c # если используется icc 17.0.0 + Intel MPI 17.0.0, или
user@master ~$ mpicc -o helloMPI_icpc_2021.5.1_impi_2021.5.1 helloMPI.c #  если используется icpc 2021.5.0 + Intel MPI 2021.5.1

Запуск программы через систему управления кластером Slurm

Для запуска программы в интерактивном режиме на одном узле кластера можно выполнить следующие команды (обратите внимание, для разных сочетаний «компилятор+библиотека MPI» работоспособные варианты различны):

user@master ~$ srun -N 2 -n 4 -p gpu --mpi=pmi2 ./helloMPI_icc_17.0.0_impi_17.0.0 # icc 17.0.0 + Intel MPI 17.0.0, запуск 4 процессов на 2 узлах
Hello world from processor node86, rank 2 out of 4 processors
Hello world from processor node85, rank 0 out of 4 processors
Hello world from processor node86, rank 3 out of 4 processors
Hello world from processor node85, rank 1 out of 4 processors

user@master ~$ srun -N 2 -n 4 -p gpu --mpi=pmi2 ./helloMPI_icpc_2021.5.1_impi_2021.5.1 # gcc 9.4.0 + OpenMPI 4.1.1, запуск 4 процессов на 2 узлах
Hello world from processor node85, rank 1 out of 4 processors
Hello world from processor node85, rank 0 out of 4 processors
Hello world from processor node86, rank 3 out of 4 processors
Hello world from processor node86, rank 2 out of 4 processors

user@master ~$ salloc -N 2 -p gpu mpiexec -N 2 -n 4 ./helloMPI_gcc_9.4.0_ompi_4.1.1 # gcc 9.4.0 + OpenMPI 4.1.1, запуск 4 процессов на 2 узлах
salloc: Granted job allocation 2420523
Hello world from processor node85, rank 0 out of 4 processors
Hello world from processor node85, rank 1 out of 4 processors
Hello world from processor node86, rank 2 out of 4 processors
Hello world from processor node86, rank 3 out of 4 processors
salloc: Relinquishing job allocation 2420523
salloc: Job allocation 2420523 has been revoked.

При использовании Intel MPI обязательно использовать ключ «−−mpi=pmi2», при использовании OpenMPI в настоящий момент работоспособен только вариант с salloc.

Для запуска в пакетном режиме необходимо подготовить файл задания и поставить его в очередь заданий:

user@master ~$ echo '#!/bin/sh
#SBATCH --time=10
#SBATCH --partition=gpu
#SBATCH -N 2
#SBATCH -n 4
srun --mpi=pmi2 ./helloMPI_icc_17.0.0_impi_17.0.0' >batch_helloMPI_icc_17.0.0_impi_17.0.0.sh
user@master ~# sbatch batch_helloMPI_icc_17.0.0_impi_17.0.0.sh
Submitted batch job 2420531

Параметры запуска задания (time, partition, N etc) могут быть указаны как в файле задания, так и в командной строке sbatch. Номер задания может быть использован для просмотра его состояния. После завершения выполнения задания стандартный вывод и стандартный вывод ошибки записываются в файлы slurm-JOBID.out и slurm-JOBID.err (можно задать файлы с другими именами).

user@master ~$ scontrol show job 2420531
JobId=2420531 JobName=batch_helloMPI_icc_17.0.0_impi_17.0.0.sh
UserId=user(userid) GroupId=Users(10000) MCS_label=N/A
Priority=1048597663 Nice=0 Account=linev_a QOS=normal
JobState=COMPLETED Reason=None Dependency=(null)
...
user@master ~$ cat slurm-2420531.out
Hello world from processor node86, rank 2 out of 4 processors
Hello world from processor node85, rank 1 out of 4 processors
Hello world from processor node85, rank 0 out of 4 processors
Hello world from processor node86, rank 3 out of 4 processors

Обратите внимание, что при запуске программы практически наверняка потребуется загрузка модулей, которые использовались при ее сборке. По крайней мере, модуля для библиотеки MPI.

Disclaimer. Не все сочетания используемых компиляторов, библиотек MPI и команд системы управления Slurm совместимы. Приведены сочетания, которые работали на момент написания руководства.