Вхід

Компіляція та запуск MPI додатків

На обчислювальні вузли (ОВ) передбачається встановлювати декілька реалізацій та версій MPI.

Для уникнення конфліктів між різними версіями, установка виконується в директорію, шлях до якої визначається за наступним правилом:

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

<MPI name> - назва реалізації MPI (наприклад, ompi (скорочення від OpenMPI), mvapich тощо);

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

<compiler name> - назва компілятора, що використовується;

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

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

Оскільки на SCIT3 та SCIT4 використовуються різні ОС, відповідно CentOS 5 та CentOS 6, то для кожного з них необхідно скомпілювати свій екземпляр програми. 

Компіляція

Приклади 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

Компіляцію та невеликі тестові задачі зручно виконувати на спецільних розділах (scit4_lt для SCIT4 и lite_task для SCIT3), на яких максимальний час виконання обмежено до 1 години, завдяки цьому в даних розділах немає великої черги задач і ОВ зазвичай можна отримати майже миттєво.

Алокуємо ОВ та перходим на нього:

[login@access mpi_examples]$ srun -p scit4_lt --pty bash
[login@g3211 mpi_examples]$

На ОВ в диреуторію /opt встановлено декілька різних весій MPI та компіляторів. Найбільш стабільною і перевіреною є OpenMPI версії 1.6.5 з компіляторами GCC версії 4.4, котра знаходиться в директорії /opt/ompi/1.6.5/gcc/4.4 , тому рекомендується починати саме з неї.

Ручна

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

[login@g3211 mpi_examples]$ /opt/ompi/1.6.5/gcc/4.4/bin/mpicc hello_c.c -o hello_c
[login@g3211 mpi_examples]$ /opt/ompi/1.6.5/gcc/4.4/bin/mpicxx hello_cxx.cc -o hello_cxx
[login@g3211 mpi_examples]$ /opt/ompi/1.6.5/gcc/4.4/bin/mpif77 hello_f77.f -o hello_f77
[login@g3211 mpi_examples]$ /opt/ompi/1.6.5/gcc/4.4/bin/mpif90 hello_f90.f90 -o hello_f90

Makefile

Оскільки виконувати компіляцію вручну не зручно, доцільно скористатися утилітою GNU Make, яка може суттєво спростити процес компіляції.

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

[login@g3211 mpi_examples]$ cat Makefile
MPI_PATH ?= /opt/ompi/1.6.5/gcc/4.4

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 $@

Компіляція тих же прикладів за допомогою Makefile та утиліти make буде виглядати так:

[login@g3211 mpi_examples]$ make

/opt/ompi/1.6.5/gcc/4.4/bin/mpicc  hello_c.c -o hello_c
/opt/ompi/1.6.5/gcc/4.4/bin/mpicxx  hello_cxx.cc -o hello_cxx
/opt/ompi/1.6.5/gcc/4.4/bin/mpif77  hello_f77.f -o hello_f77
/opt/ompi/1.6.5/gcc/4.4/bin/mpif90  hello_f90.f90 -o hello_f9

/opt/ompi/1.6.5/gcc/4.4/bin/mpicc  hello_c.c -o hello_c
/opt/ompi/1.6.5/gcc/4.4/bin/mpicxx  hello_cxx.cc -o hello_cxx
/opt/ompi/1.6.5/gcc/4.4/bin/mpif77  hello_f77.f -o hello_f77
/opt/ompi/1.6.5/gcc/4.4/bin/mpif90  hello_f90.f90 -o hello_f90

Для компіляції з іншою версією MPI, досить змінити значення змінної MPI_PATH в Makefile або встановити нове значення MPI_PATH за допомогою відповідної змінної оточення:

[login@g3211 mpi_examples]$ make MPI_PATH=/opt/ompi/1.6.5/gcc/4.8
/opt/ompi/1.6.5/gcc/4.8/bin/mpicc  hello_c.c -o hello_c
/opt/ompi/1.6.5/gcc/4.8/bin/mpicxx  hello_cxx.cc -o hello_cxx
/opt/ompi/1.6.5/gcc/4.8/bin/mpif77  hello_f77.f -o hello_f77
/opt/ompi/1.6.5/gcc/4.8/bin/mpif90  hello_f90.f90 -o hello_f90

Після виконання компіляції виходимо з ОВ:

[glad@g3211 mpi_examples]$ exit

Запуск

[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.ompi. В цьому випадку запуск задачі буде виглядати так:

[login@access examples]$ sbatch -n 2 -pscit4 run.ompi ./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

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