Вхід

Компиляция и запуск MPI приложений на разделе scit4

На вычислительные узлы (ВУ) предполагается устанавливать несколько реализаций и версий MPI.

Для избежания конфликтов между разными версиями, установка выполняется в директорию, путь к которой определяется по следующему правилу:

/opt/<MPI name>/<MPI version>/<compiler name>/<compiler version>, где

<MPI name> - название реализации MPI (например, OpenMPI, MVAPICH2 и т.д.);

<MPI version> - версия MPI;

<compiler name> - название используемого компилятора;

<compiler version> - версия компилятора.

Вместо версии может указываться ключевое слово current, которое означает, что используется последняя стабильная версия.

На текущий момент на ВУ раздела scit4 установлен только MVAPICH2. Выбор обусловлен наличием поддержки CUDA (подробнее см. в MVAPICH2 User Guide), которая упрощает разработку приложений, использующих GPU.

Ниже показано, как можно выполнить компиляцию и запуск MPI версии программы Hello World с помощью MVAPICH2 на разделе кластера scit4.

Компиляция выполняется непосредственно на вычислительном узле, поскольку именно там установлены MPI и компиляторы. Кроме того, компиляцию приложений необходимо выполнять в том окружении, в котором они должны работать.

Компиляция

Примеры MPI Hello World на C, C++, Fortran можно найти на сервере доступа к кластеру (access) в директории /usr/share/doc/scit/mpi_examples.

Копируем к себе в домашний каталог директорию с примерами и переходим в нее:

[login@access ~]$ cp -r /usr/share/doc/scit/mpi_examples .
[login@access ~]$ cd mpi_examples

Ручная

Каждый отдельный файл можно компилировать вручную:

[login@access mpi_examples]$ srun -pscit4 /opt/mvapich2/1.9a/intel/current/bin/mpicc hello_c.c -o hello_c
[login@access mpi_examples]$ srun -pscit4 /opt/mvapich2/1.9a/intel/current/bin/mpicxx hello_cxx.cc -o hello_cxx
[login@access mpi_examples]$ srun -pscit4 /opt/mvapich2/1.9a/intel/current/bin/mpif77 hello_f77.f -o hello_f77
[login@access mpi_examples]$ srun -pscit4 /opt/mvapich2/1.9a/intel/current/bin/mpif90 hello_f90.f90 -o hello_f90

Makefile

Поскольку выполнять компиляцию вручную не очень удобно, целесообразно воспользоваться утилитой GNU Make.

Для этого понадобится создать Makefile, пример которого можно посмотреть в директории mpi_examples:

[login@access mpi_examples]$ cat Makefile
MPI_PATH ?= /opt/mvapich2/1.9a/intel/current

CC = $(MPI_PATH)/bin/mpicc
CXX = $(MPI_PATH)/bin/mpicxx
F90 = $(MPI_PATH)/bin/mpif90
F77 = $(MPI_PATH)/bin/mpif77

EXAMPLES = hello_c hello_cxx hello_f77 hello_f90

all: $(EXAMPLES)

clean:
rm -f $(EXAMPLES) *~ *.o

hello_c: hello_c.c
$(CC) $(CFLAGS) $^ -o $@

hello_cxx: hello_cxx.cc
$(CXX) $(CXXFLAGS) $^ -o $@

hello_f77: hello_f77.f
$(F77) $(F77FLAGS) $^ -o $@

hello_f90: hello_f90.f90
$(F90) $(F90FLAGS) $^ -o $@

Компиляция тех же примеров с помощью утилиты make будет выглядеть так:

[login@access mpi_examples]$ srun -pscit4 make
/opt/mvapich2/1.9a/intel/current/bin/mpicc  hello_c.c -o hello_c
/opt/mvapich2/1.9a/intel/current/bin/mpicxx  hello_cxx.cc -o hello_cxx
/opt/mvapich2/1.9a/intel/current/bin/mpif77  hello_f77.f -o hello_f77
/opt/mvapich2/1.9a/intel/current/bin/mpif90  hello_f90.f90 -o hello_f90

Для компиляции с другой версией MPI, достаточно изменить значение переменной MPI_PATH в Makefile или установить новое значение MPI_PATH с помощью соответствующей переменной окружения:

[login@access mpi_examples]$ srun -pscit4 make MPI_PATH=/opt/mvapich2/1.8.1/intel/current
/opt/mvapich2/1.8.1/intel/current/bin/mpicc  hello_c.c -o hello_c
/opt/mvapich2/1.8.1/intel/current/bin/mpicxx  hello_cxx.cc -o hello_cxx
/opt/mvapich2/1.8.1/intel/current/bin/mpif77  hello_f77.f -o hello_f77
/opt/mvapich2/1.8.1/intel/current/bin/mpif90  hello_f90.f90 -o hello_f90

Запуск

Поскольку MVAPICH2 и SLURM поддерживают Process-Management Interface (PMI), запуск осуществляется непосредственно с помощью менеджера ресурсов.

Подробнее можно почитать в документации по MVAPICH2 и SLURM.

[login@access mpi_examples]$ srun -n2 -pscit4 ./hello_c
Hello, world, I am 1 of 2
Hello, world, I am 0 of 2

Фоновая (batch) задача

Для запуска фоновой задачи можно воспользоваться скриптом run.mvapich2. В этом случае запуск задачи будет выглядеть так:

[login@access examples]$ sbatch -n 2 -pscit4 run.mvapich2 ./hello_c
sbatch: Submitted batch job 103904
[login@access examples]$ cat slurm-103904.out
Hello, world, I am 0 of 2
Hello, world, I am 1 of 2

Некоторые полезные опции

При запуске задач, использующих GPU, может потребоваться, чтобы процессы задачи распределялись, исходя из количества GPU на ВУ. На каждом ВУ раздела scit4 установлено по 3 GPU.

Запустить задачу так, чтобы на каждый узел приходилось по 3 процесса, можно с помощью опции --ntasks-per-node (см. man sbatch):

[login@access examples]$ sbatch -n6 --ntasks-per-node=3 -pscit4 run.mvapich2 hostname -s
sbatch: Submitted batch job 103909
[login@access examples]$ cat slurm-103909.out
g4101
g4101
g4101
g4102
g4102
g4102

вычисления на суперкомпьютере, сверхбыстрые вычисления, рендеринг, фитнес клубы, спортивные клубы