На суперкомпьютере установлено несколько компиляторов и библиотек 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
Для запуска программы в интерактивном режиме на одном узле кластера можно выполнить следующие команды (обратите внимание, для разных сочетаний «компилятор+библиотека 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 совместимы. Приведены сочетания, которые работали на момент написания руководства.